Google ชีต API ส่งคืน "ผู้โทรไม่มีสิทธิ์" เมื่อใช้คีย์เซิร์ฟเวอร์


95

ฉันได้สร้างคีย์เซิร์ฟเวอร์ในตัวจัดการ API และพยายามดำเนินการต่อไปนี้บน Mac ของฉัน:

curl 'https://sheets.googleapis.com/v4/spreadsheets/MySheetID?ranges=A1:B5&key=TheServerKeyIGeneratedInAPIManager'

แต่นี่คือสิ่งที่ส่งคืน:

{
 "error": {
    "code": 403,
    "message": "The caller does not have permission",
    "status": "PERMISSION_DENIED"
  }
}

ฉันทำอะไรผิดที่นี่?


4
คีย์มีไว้สำหรับการเข้าถึงข้อมูลสาธารณะสิ่งที่คุณกำลังทำต้องการการเข้าถึงที่พิสูจน์ตัวตน
DaImTo

ในกรณีส่วนใหญ่มีปัญหาบางอย่างของขอบเขต โปรดตรวจสอบและตรวจสอบว่าสคริปต์ต้องการขอบเขตใด
dpkrai96

คำตอบ:


131

ในการแก้ปัญหานี้ให้ลอง:

  1. สร้างบัญชีบริการ: https://console.developers.google.com/iam-admin/serviceaccounts/
  2. ในตัวเลือกให้สร้างคีย์: คีย์นี้คือ client_secret.json ตามปกติของคุณ - ใช้ในลักษณะเดียวกัน
  3. กำหนดให้เป็นเจ้าของบทบาทสำหรับบัญชีบริการ (ชื่อสมาชิก = รหัสบัญชีบริการ = อีเมลบัญชีบริการเช่น thomasapp@appname-201813.iam.gserviceaccount.com
  4. คัดลอกที่อยู่อีเมลของบัญชีบริการของคุณ = รหัสบัญชีบริการ
  5. เพียงเข้าไปในเบราว์เซอร์ของคุณไปที่ Google แผ่นงานที่คุณต้องการโต้ตอบ
  6. ไปที่ SHARE ที่ด้านขวาบนของหน้าจอ
  7. ไปที่การตั้งค่าขั้นสูงและแบ่งปันกับที่อยู่อีเมลของบัญชีบริการของคุณเช่น thomasapp@appname-201813.iam.gserviceaccount.com

มันได้ผลสำหรับฉัน :)


1
สิ่งนี้ได้ผลสำหรับฉัน โดยวิธี: ในผู้ดูแลระบบคลาวด์ของ Google ไปที่ ... โครงการ> IAM และผู้ดูแลระบบ> บัญชีบริการ .... หากคุณตั้งค่าบัญชีบริการคุณจะเห็นอีเมลพิเศษสำหรับบัญชีบริการแต่ละบัญชี ตรวจสอบว่าคุณได้เปิดใช้งาน Google ชีต API แล้ว แท้จริงแล้วคุณเพียงแค่แบ่งปันที่อยู่อีเมลของบัญชีบริการจากปุ่ม "แชร์" ของ Google แผ่นงาน
Jason F

1
ใช่ ... ที่สำคัญคือแชร์เอกสารกับอีเมลบัญชีบริการ ....
user1102171

2
คีย์ json แตกต่างจากข้อมูลประจำตัว json ที่ฉันได้รับจากคู่มือการเริ่มต้นใช้งาน Java อย่างรวดเร็ว (สำหรับชีต API) ฉันจะใช้งานได้อย่างไร
Cardinal - คืนสถานะ Monica

2
คุณใช้ข้อมูลลับของลูกค้าอย่างไร? คุณสร้างคีย์ API ด้วยบัญชีบริการแทนได้ไหม
สตีเฟนฟิลลิปส์

ขอบคุณมาก. สิ่งนี้ควรรวมอยู่ในเอกสารหรือบางอย่าง
อับดุลมาลิก

45

ฉันรู้ว่ามันช้าไปหน่อยที่จะตอบ แต่สำหรับคนอื่น ๆ ที่กำลังดิ้นรนกับปัญหาเดียวกัน
เพียงแค่เปลี่ยนสิทธิ์ของแผ่นงานให้เป็นสาธารณะในไดรฟ์ของคุณเพื่อให้สามารถเข้าถึงได้โดยไม่ต้องตรวจสอบสิทธิ์ผ่านการเรียก API

ในการเปลี่ยนการเข้าถึง:

  1. เปิดแผ่นงานใน Google ไดรฟ์
  2. คลิกแชร์ที่มุมขวาบน
  3. ที่ด้านล่างของหน้าต่างแจ้งให้คลิกขั้นสูง
  4. เปลี่ยนสิทธิ์เป็นสาธารณะหรือบุคคลที่มีลิงก์ (ไม่จำเป็นต้องลงชื่อเข้าใช้)

ส่งคำขอ API เพื่อดึงข้อมูลจากแผ่นงานโดยไม่มีการตรวจสอบสิทธิ์

หมายเหตุ:หากแผ่นงานมีข้อมูลที่ละเอียดอ่อนจะไม่ปลอดภัยที่จะทำให้เป็นแบบสาธารณะและควรใช้การเข้าถึงแบบ Authenticated


37
นอกจากนี้คุณสามารถแชร์แผ่นงานนี้กับอีเมลเฉพาะได้เช่น อีเมลบัญชีบริการ (โครงการ) ของคุณ "client_email": "XXXXX@n Northern-gasket-XXXX.iam.gserviceaccount.com" ซึ่งจะอนุญาตให้เข้าถึงแผ่นงานตามสคริปต์ของคุณ
Kishan Patel

4
ขอบคุณครับ ไม่มีสิ่งที่เป็นลายลักษณ์อักษรในเอกสารที่ชอบที่คุณได้กล่าวถึง
Maulik Dodia

1
เห็นด้วย @MaulikDodia. เอกสาร Google API กล่าวไว้ที่นี่แต่ไม่ชัดเจนสำหรับผู้ที่ต้องการใช้ API เพื่อแสดงข้อมูลบนเว็บไซต์สาธารณะ ฉันอยู่ระหว่างการเขียนวิธีการทั้งหมดนี้ ฉันจะส่ง DM ให้คุณเมื่อฉันทำเสร็จแล้ว
Edward

ขอบคุณเพื่อนมาก @ user3411192
Maulik Dodia

29

อย่าลืมใส่ใจกับความคิดเห็นของ @ KishanPatel:

นอกจากนี้คุณสามารถแชร์แผ่นงานนี้กับอีเมลเฉพาะได้เช่น อีเมลบัญชีบริการ (โครงการ) ของคุณ "client_email": "XXXXX@n Northern-gasket-XXXX.iam.gserviceaccount.com" ซึ่งจะอนุญาตให้เข้าถึงแผ่นงานตามสคริปต์ของคุณ


4

วิธีที่ง่ายที่สุดคือแก้ไขโดยใช้ gcloud cli เอกสารเพิ่มเติมที่นี่https://cloud.google.com/pubsub/docs/quickstart-cli#before-you-begin

ติดตั้ง gcloud

sudo apt-get install google-cloud-sdk

แล้วโทร

gcloud init

จากนั้นตรวจสอบโครงการที่ใช้งานอยู่และข้อมูลรับรองของคุณ

gcloud config configurations list

หากไม่ถูกต้องตรวจสอบให้แน่ใจว่าคุณได้รับการรับรองความถูกต้องด้วยบัญชีที่ถูกต้อง:

gcloud auth list
* account 1
  account 2

เปลี่ยนเป็นบัญชีของโครงการหากไม่:

gcloud config set account `ACCOUNT`

รายการโครงการจะแตกต่างกันขึ้นอยู่กับบัญชี:

gcloud projects list

- project 1
- project 2...

เปลี่ยนเป็นโครงการที่ต้องการ:

gcloud config set project `PROJECT NAME`

จากนั้นสร้างข้อมูลรับรองเริ่มต้นของแอปพลิเคชันด้วยgcloud auth application-default loginจากนั้น google-cloud จะตรวจหาข้อมูลรับรองดังกล่าวโดยอัตโนมัติ


0

10 เซ็นต์ของฉัน ... ตัวอย่างง่ายๆในการอ่านแผ่นโดยใช้Java

    private Credential getCredentials() throws IOException {
            final InputStream accessKey = new ByteArrayInputStream("<credential json>");
            final GoogleCredential credential = GoogleCredential.fromStream(accessKey)
                    .createScoped(Collections.singleton(SheetsScopes.SPREADSHEETS_READONLY));
            return credential;
        }

    private HttpTransport httpTransport() {
            try {
                return GoogleNetHttpTransport.newTrustedTransport();
            } catch (GeneralSecurityException | IOException e) {
                throw new SpreadSheetServiceException(e);
            }
        }


    Sheets service = new Sheets.Builder(httpTransport(), JSON_FACTORY, getCredentials())
                    .setApplicationName("app-name")
                    .build();
            ValueRange response = service.spreadsheets().values()
                    .get("<spread_sheet_id>", "A1:A")
                    .execute();
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.