Google E-Tablolar API'si, sunucu anahtarını kullanırken "Arayanın izni yok" sonucunu döndürüyor


95

API Yöneticisi'nde bir sunucu anahtarı oluşturdum ve Mac'imde aşağıdakileri yürütmeyi denedim:

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

Ama geri döndüğü şey bu:

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

Burada neyi yanlış yapıyorum?


4
Anahtar, herkese açık verilere erişmek içindir, yaptığınız şey kimlik doğrulamalı erişim gerektirir.
DaImTo

Çoğu durumda, kapsam sorunları vardır. Lütfen komut dosyası için hangi kapsamların gerekli olduğunu kontrol edin ve doğrulayın.
dpkrai96

Yanıtlar:


131

Bu sorunu çözmek için şunları deneyin:

  1. Bir hizmet hesabı oluşturun: https://console.developers.google.com/iam-admin/serviceaccounts/
  2. Seçeneklerde bir anahtar oluşturun: bu anahtar her zamanki client_secret.json'unuzdur - aynı şekilde kullanın
  3. Hizmet hesabı için rol sahibi olun (Üye adı = hizmet hesabı kimliği = hizmet hesabı e-postası örn: thomasapp@appname-201813.iam.gserviceaccount.com
  4. Hizmet hesabınızın e-posta adresini kopyalayın = hizmet hesabı kimliği
  5. Tarayıcınızdan etkileşim kurmak istediğiniz Google sayfasına gitmeniz yeterlidir
  6. Ekranınızın sağ üst köşesindeki PAYLAŞ'a gidin
  7. Gelişmiş ayarlara gidin ve bunu hizmet hesabınızın e-posta adresiyle paylaşın örn: thomasapp@appname-201813.iam.gserviceaccount.com

Benim için çalıştı :)


1
bu benim için çalıştı. bu arada: google bulut yöneticisinde ... proje> IAM ve Yönetici> Hizmet Hesapları ... seçeneğine gidin. Hizmet hesapları kurduysanız, her bir hizmet hesabı için özel bir e-posta görürsünüz. Google E-Tablolar API'sını da etkinleştirdiğinizden emin olun. Kelimenin tam anlamıyla, hizmet hesabı e-posta adresini google sayfası "paylaş" düğmesinden paylaşmanız yeterlidir.
Jason F

1
evet ... anahtar sadece dokümanı hizmet hesabı e-
postasıyla

2
Anahtar json, Java hızlı başlangıç ​​kılavuzundan (E-Tablolar API'si için) edindiğim kimlik bilgileri json'dan çok farklı. Nasıl uygularım?
Kardinal - Monica'yı Eski Haline

2
Müşteri sırrını nasıl kullanıyorsunuz? Bunun yerine bir hizmet hesabıyla bir API anahtarı yapabilir misiniz?
Stephen Phillips

Çok teşekkür ederim. Bu, belgelere veya başka bir şeye dahil edilmelidir.
Abdul Malik

45

Cevap vermek için biraz geç olduğunu biliyorum ama aynı sorunla mücadele eden diğer insanlar için.
Sayfanın iznini sürücünüzde herkese açık olarak değiştirin, böylece API çağrıları aracılığıyla kimlik doğrulaması olmadan erişilebilir.

Erişimi değiştirmek için:

  1. Sayfayı Google Drive'da aç
  2. Sağ üst köşede paylaş'ı tıklayın
  3. İstem penceresinin altında, gelişmiş'i tıklayın
  4. İzni halka veya bağlantıya sahip kişilere değiştirin (oturum açmak gerekmez)

Kimlik doğrulaması olmadan sayfalardan veri almak için API isteği gönderin.

Not: Sayfa hassas veriler içeriyorsa, bunu herkese açık hale getirmek ve bunu Doğrulanmış erişim ile yapmak güvenli değildir.


37
Ayrıca, bu sayfayı belirli bir e-posta ile paylaşabilirsiniz. hizmet hesabı (proje) e-postanız. "client_email": "XXXXX@northern-gasket-XXXX.iam.gserviceaccount.com", Bu, komut dosyanızın sayfaya erişmesine izin verecektir.
Kishan Patel

4
Sağ ol, kanka. Belgelerde bahsettiğiniz gibi yazılı bir şey yok.
Maulik Dodia

1
Kabul @MaulikDodia. Google API belgeleri burada söylüyor , ancak verileri herkese açık bir web sitesinde görüntülemek için yalnızca API kullanmak isteyen kişiler için net değil. Tüm bunların üzerine bir nasıl yapılır yazma sürecindeyim. Bitirdiğimde sana bir DM göndereceğim.
Edward

Çok teşekkürler dostum @ user3411192
Maulik Dodia

29

@ KishanPatel'in yorumuna dikkat ettiğinizden emin olun:

Ayrıca, bu sayfayı belirli bir e-posta ile paylaşabilirsiniz. hizmet hesabı (proje) e-postanız. "client_email": "XXXXX@northern-gasket-XXXX.iam.gserviceaccount.com", Bu, komut dosyanızın sayfaya erişmesine izin verecektir.


4

En kolay yol, gcloud cli kullanarak düzeltmektir. Buradan daha fazla belge https://cloud.google.com/pubsub/docs/quickstart-cli#before-you-begin

gcloud'u yükle

sudo apt-get install google-cloud-sdk

sonra ara

gcloud init

sonra aktif projenizi ve kimlik bilgilerinizi kontrol edin

gcloud config configurations list

Tamam değilse, doğru hesapla kimliğinizin doğrulandığından emin olun:

gcloud auth list
* account 1
  account 2

Değilse, projenin hesabını değiştirin:

gcloud config set account `ACCOUNT`

Hesaba bağlı olarak proje listesi farklı olacaktır:

gcloud projects list

- project 1
- project 2...

Amaçlanan projeye geç:

gcloud config set project `PROJECT NAME`

Ardından gcloud auth application-default login, ile Uygulama Varsayılan Kimlik Bilgileri Oluşturun , ardından google-cloud bu tür kimlik bilgilerini otomatik olarak algılayacaktır.


0

Benim 10 sentim ... Sayfayı Java kullanarak okumak için basit bir örnek .

    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();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.