API Google Trang tính trả về "Người gọi không có quyền" khi sử dụng khóa máy chủ


90

Tôi đã tạo khóa máy chủ trong Trình quản lý API và cố gắng thực thi những điều sau trên máy Mac của mình:

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

Nhưng đây là những gì nó trả về:

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

Tôi làm gì sai ở đây?


4
Key là để truy cập dữ liệu công khai, những gì bạn đang làm yêu cầu quyền truy cập được xác thực.
DaImTo

Trong hầu hết các trường hợp, có một số vấn đề về phạm vi. Vui lòng kiểm tra và xác minh phạm vi nào được yêu cầu bởi script.
dpkrai96

Câu trả lời:


119

Để giải quyết vấn đề này, hãy thử:

  1. Tạo tài khoản dịch vụ: https://console.developers.google.com/iam-admin/serviceaccounts/
  2. Trong các tùy chọn, hãy tạo một khóa: khóa này là client_secret.json thông thường của bạn - hãy sử dụng nó theo cách tương tự
  3. Đặt vai trò chủ sở hữu cho tài khoản dịch vụ (Tên thành viên = tài khoản dịch vụ ID = email tài khoản dịch vụ, ví dụ: thomasapp@appname-201813.iam.gserviceaccount.com
  4. Sao chép địa chỉ email của tài khoản dịch vụ của bạn = ID tài khoản dịch vụ
  5. Chỉ cần truy cập trong trình duyệt của bạn đến trang tính Google mà bạn muốn tương tác
  6. Đi tới CHIA SẺ ở trên cùng bên phải màn hình của bạn
  7. Đi tới cài đặt nâng cao và chia sẻ nó với địa chỉ email trong tài khoản dịch vụ của bạn, ví dụ: thomasapp@appname-201813.iam.gserviceaccount.com

Nó làm việc cho tôi :)


1
điều này đã làm việc cho tôi. Nhân tiện: trong quản trị đám mây của google, hãy truy cập ... dự án> IAM & Quản trị> Tài khoản dịch vụ .... Nếu bạn đã thiết lập tài khoản dịch vụ, bạn sẽ thấy một email đặc biệt cho từng tài khoản dịch vụ tương ứng. Đảm bảo rằng bạn cũng đã bật API Google Trang tính. Theo nghĩa đen, bạn chỉ cần chia sẻ địa chỉ email tài khoản dịch vụ từ nút "chia sẻ" trang tính của google.
Jason F

1
vâng ... điều quan trọng là chỉ cần chia sẻ tài liệu với email của tài khoản dịch vụ ....
user1102171 28-04-19

2
Khóa json rất khác với json thông tin đăng nhập mà tôi lấy được từ hướng dẫn bắt đầu nhanh Java (dành cho API Trang tính). Làm cách nào để triển khai nó?
Đức Hồng y - Phục hồi Monica

2
Làm thế nào để bạn sử dụng bí mật khách hàng? Thay vào đó, bạn có thể tạo khóa API bằng tài khoản dịch vụ không?
Stephen Phillips

42

Tôi biết là hơi muộn để trả lời nhưng đối với những người khác đang gặp khó khăn với cùng một vấn đề.
Chỉ cần thay đổi quyền của trang tính thành công khai trên ổ đĩa của bạn để nó có thể được truy cập mà không cần xác thực thông qua lệnh gọi API.

Để thay đổi quyền truy cập:

  1. Mở trang tính trong google drive
  2. Ở góc trên cùng bên phải, nhấp vào chia sẻ
  3. Ở cuối cửa sổ lời nhắc, nhấp vào nâng cao
  4. Thay đổi quyền thành công khai hoặc những người có liên kết (không cần đăng nhập)

Gửi yêu cầu API để tìm nạp dữ liệu từ các trang tính mà không cần xác thực.

Lưu ý: nếu trang tính chứa dữ liệu nhạy cảm thì sẽ không an toàn khi đặt nó ở chế độ công khai và thay vào đó hãy làm điều đó với quyền truy cập Xác thực.


36
Ngoài ra, bạn có thể chia sẻ trang tính này với email cụ thể, ví dụ: email tài khoản dịch vụ (dự án) của bạn. "client_email": "XXXXX@northern-gasket-XXXX.iam.gserviceaccount.com", Điều này sẽ cho phép truy cập trang tính bằng tập lệnh của bạn.
Kishan Patel

4
Cảm ơn nhé người anh em. Không có điều gì bằng văn bản trong tài liệu để giống như bạn đã đề cập.
Maulik Dodia

1
Đồng ý @MaulikDodia. Tài liệu API của Google nói điều đó ở đây , nhưng không rõ ràng đối với những người chỉ muốn sử dụng API để hiển thị dữ liệu trên trang web công khai. Tôi đang trong quá trình viết hướng dẫn về tất cả những điều này. Tôi sẽ gửi cho bạn một tin nhắn trực tiếp của nó khi tôi hoàn thành.
Edward

Cảm ơn bạn rất nhiều @ user3411192
Maulik Dodia

27

Hãy nhớ chú ý đến bình luận của @ KishanPatel:

Ngoài ra, bạn có thể chia sẻ trang tính này với email cụ thể, ví dụ: email tài khoản dịch vụ (dự án) của bạn. "client_email": "XXXXX@northern-gasket-XXXX.iam.gserviceaccount.com", Điều này sẽ cho phép truy cập trang tính bằng tập lệnh của bạn.


4

Cách khắc phục đơn giản nhất là dùng cli gcloud. Tài liệu khác tại đây https://cloud.google.com/pubsub/docs/quickstart-cli#before-you-begin

cài đặt gcloud

sudo apt-get install google-cloud-sdk

sau đó gọi

gcloud init

sau đó kiểm tra dự án đang hoạt động và thông tin đăng nhập của bạn

gcloud config configurations list

Nếu không ổn, hãy đảm bảo rằng bạn đã được xác thực bằng đúng tài khoản:

gcloud auth list
* account 1
  account 2

Thay đổi tài khoản của dự án nếu không:

gcloud config set account `ACCOUNT`

Tùy thuộc vào tài khoản, danh sách dự án sẽ khác nhau:

gcloud projects list

- project 1
- project 2...

Chuyển sang dự án dự định:

gcloud config set project `PROJECT NAME`

Sau đó, Tạo thông tin đăng nhập mặc định cho ứng dụng bằng gcloud auth application-default loginvà sau đó google-cloud sẽ tự động phát hiện các thông tin đăng nhập đó.


0

10 xu của tôi ... Một ví dụ đơn giản để đọc trang tính bằng 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();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.