Google Sheets API mengembalikan "Penelepon tidak memiliki izin" saat menggunakan kunci server


95

Saya telah membuat kunci server di Manajer API dan mencoba menjalankan yang berikut ini di Mac saya:

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

Tapi inilah yang dikembalikannya:

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

Apa yang saya lakukan salah di sini?


4
Kuncinya adalah untuk mengakses data publik, apa yang Anda lakukan membutuhkan akses terotentikasi.
DaImTo

Dalam kebanyakan kasus, ada beberapa masalah cakupan. Harap periksa dan verifikasi cakupan mana yang diperlukan oleh skrip.
dpkrai96

Jawaban:


131

Untuk mengatasi masalah ini, cobalah untuk:

  1. Buat akun layanan: https://console.developers.google.com/iam-admin/serviceaccounts/
  2. Dalam opsi, buat kunci: kunci ini adalah client_secret.json biasa Anda - gunakan dengan cara yang sama
  3. Jadikan sebagai pemilik peran untuk akun layanan (Nama anggota = ID akun layanan = email akun layanan mis .: thomasapp@appname-201813.iam.gserviceaccount.com
  4. Salin alamat email akun layanan Anda = ID akun layanan
  5. Cukup masuk ke dalam browser Anda ke lembar Google yang ingin Anda gunakan untuk berinteraksi
  6. Pergi ke SAHAM di kanan atas layar Anda
  7. Buka pengaturan lanjutan dan bagikan dengan alamat email akun layanan Anda mis: thomasapp@appname-201813.iam.gserviceaccount.com

Itu berhasil untuk saya :)


1
ini berhasil untuk saya. ngomong-ngomong: di google cloud admin buka ... project> IAM & Admin> Akun Layanan .... Jika Anda sudah menyiapkan akun layanan, Anda akan melihat email khusus untuk masing-masing akun layanan. Pastikan Anda juga telah mengaktifkan Google Sheets API. Secara harfiah, Anda hanya membagikan alamat email akun layanan dari tombol "bagikan" lembar Google.
Jason F

1
ya ... kuncinya adalah hanya berbagi dokumen dengan email akun layanan ....
user1102171

2
Kunci json sangat berbeda dari kredensial json yang saya dapatkan dari panduan memulai Java (untuk Sheets API). Bagaimana cara menerapkannya?
Kardinal - Kembalikan Monica

2
Bagaimana Anda menggunakan rahasia klien? Bisakah Anda membuat kunci API dengan akun layanan?
Stephen Phillips

Terima kasih banyak. Ini harus dimasukkan dalam dokumentasi atau semacamnya.
Abdul Malik

45

Saya tahu ini agak terlambat untuk menjawab tetapi untuk orang lain yang berjuang dengan masalah yang sama. Ubah
saja izin sheet menjadi publik di drive Anda sehingga dapat diakses tanpa otentikasi melalui panggilan API.

Untuk mengubah akses:

  1. Buka sheet di google drive
  2. Di pojok kanan atas, klik bagikan
  3. Di bagian bawah jendela prompt, klik lanjutan
  4. Ubah izin menjadi publik atau orang dengan tautan (tidak perlu masuk)

Kirim permintaan API untuk mengambil data dari sheet tanpa otentikasi.

Catatan: jika sheet berisi data sensitif maka tidak aman untuk membuatnya menjadi publik dan lebih baik melakukannya dengan akses yang diautentikasi.


37
Selain itu, Anda dapat membagikan sheet ini dengan email tertentu Ex. email akun layanan (proyek) Anda. "client_email": "XXXXX@n northern-gasket-XXXX.iam.gserviceaccount.com", Ini akan memungkinkan untuk mengakses sheet dengan skrip Anda.
Kishan Patel

4
Makasih bro. Tidak ada hal tertulis dalam dokumentasi seperti yang Anda sebutkan.
Maulik Dodia

1
Setuju @MaulikDodia. Dokumen Google API mengatakannya di sini , tetapi tidak jelas bagi orang yang hanya ingin menggunakan API untuk menampilkan data di situs web publik. Saya sedang dalam proses menulis petunjuk tentang semua ini. Saya akan mengirim Anda DM-nya setelah selesai.
Edward

Terima kasih banyak teman @ pengguna3411192
Maulik Dodia

29

Pastikan untuk memperhatikan komentar @ KishanPatel:

Selain itu, Anda dapat membagikan sheet ini dengan email tertentu Ex. email akun layanan (proyek) Anda. "client_email": "XXXXX@n northern-gasket-XXXX.iam.gserviceaccount.com", Ini akan memungkinkan untuk mengakses sheet dengan skrip Anda.


4

Cara termudah adalah memperbaiki menggunakan gcloud cli. Lebih banyak dokumen di sini https://cloud.google.com/pubsub/docs/quickstart-cli#before-you-begin

instal gcloud

sudo apt-get install google-cloud-sdk

lalu panggil

gcloud init

kemudian periksa proyek aktif dan kredensial Anda

gcloud config configurations list

Jika tidak oke, pastikan Anda diautentikasi dengan akun yang benar:

gcloud auth list
* account 1
  account 2

Ubah ke akun proyek jika tidak:

gcloud config set account `ACCOUNT`

Bergantung pada akunnya, daftar proyek akan berbeda:

gcloud projects list

- project 1
- project 2...

Beralih ke proyek yang dimaksud:

gcloud config set project `PROJECT NAME`

Kemudian Buat Kredensial Default Aplikasi dengan gcloud auth application-default login, lalu google-cloud akan secara otomatis mendeteksi kredensial tersebut.


0

10 sen saya ... Contoh sederhana untuk membaca lembar menggunakan 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();
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.