L'API di Fogli Google restituisce "Il chiamante non dispone dell'autorizzazione" quando si utilizza la chiave del server


95

Ho generato una chiave del server in API Manager e ho tentato di eseguire quanto segue sul mio Mac:

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

Ma questo è ciò che restituisce:

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

Cosa sto facendo di sbagliato qui?


4
La chiave è per accedere ai dati pubblici, quello che stai facendo richiede un accesso autenticato.
DaImTo

Nella maggior parte dei casi c'è qualche problema di scopi. Controlla e verifica quali ambiti sono richiesti dallo script.
dpkrai96

Risposte:


132

Per risolvere questo problema, prova a:

  1. Crea un account di servizio: https://console.developers.google.com/iam-admin/serviceaccounts/
  2. Nelle opzioni, crea una chiave: questa chiave è il tuo solito client_secret.json - usala allo stesso modo
  3. Rendi il proprietario del ruolo per l'account di servizio (nome membro = ID account di servizio = email dell'account di servizio, es .: thomasapp@appname-201813.iam.gserviceaccount.com
  4. Copia l'indirizzo email del tuo account di servizio = ID account di servizio
  5. Vai semplicemente nel tuo browser al foglio Google con cui desideri interagire
  6. Vai a CONDIVIDI in alto a destra dello schermo
  7. Vai alle impostazioni avanzate e condividilo con l'indirizzo email del tuo account di servizio, ad es .: thomasapp@appname-201813.iam.gserviceaccount.com

Ha funzionato per me :)


1
questo ha funzionato per me. a proposito: nell'amministratore del cloud di Google vai a ... progetto> IAM e amministrazione> Account di servizio .... Se hai configurato gli account di servizio, vedrai un'e-mail speciale per ogni rispettivo account di servizio. Assicurati di aver abilitato anche l'API di Fogli Google. Letteralmente, condividi semplicemente l'indirizzo email dell'account di servizio dal pulsante "condividi" del foglio Google.
Jason F

1
sì ... la chiave è condividere il documento con l'email dell'account di servizio ....
user1102171

2
La chiave json è molto diversa dalle credenziali json che ho ottenuto dalla guida rapida di Java (per l'API di Fogli). Come lo implemento?
Cardinale - Ripristina Monica il

2
Come usi il segreto del client? Puoi invece creare una chiave API con un account di servizio?
Stephen Phillips,

Grazie mille. Questo dovrebbe essere incluso nella documentazione o qualcosa del genere.
Abdul Malik

45

So che è un po 'tardi per rispondere, ma per altre persone alle prese con lo stesso problema.
Basta modificare l'autorizzazione del foglio in pubblico sul disco in modo che sia possibile accedervi senza autenticazione tramite chiamate API.

Per modificare l'accesso:

  1. Apri foglio in Google Drive
  2. Nell'angolo in alto a destra, fai clic su condividi
  3. Nella parte inferiore della finestra del prompt, fai clic su Avanzate
  4. Modificare l'autorizzazione in pubblico o persone con link (non è richiesto l'accesso)

Invia una richiesta API per recuperare i dati dai fogli senza autenticazione.

Nota: se il foglio contiene dati sensibili, non è sicuro renderlo pubblico e farlo piuttosto con accesso autenticato.


37
Inoltre, puoi condividere questo foglio con email specifiche Es. l'email dell'account di servizio (progetto). "client_email": "XXXXX@northern-gasket-XXXX.iam.gserviceaccount.com", Ciò consentirà di accedere al foglio dal tuo script.
Kishan Patel

4
Grazie fratello. Non ci sono cose scritte nella documentazione che ti piacciono.
Maulik Dodia

1
Concordato @MaulikDodia. I documenti dell'API di Google lo dicono qui , ma non è chiaro per le persone che vogliono semplicemente utilizzare l'API per visualizzare i dati su un sito web pubblico. Sto scrivendo una guida su tutto questo. Ti invierò un DM quando avrò finito.
Edward

Grazie mille amico @ user3411192
Maulik Dodia

29

Assicurati di prestare attenzione al commento di @ KishanPatel:

Inoltre, puoi condividere questo foglio con email specifiche Ex. l'email dell'account di servizio (progetto). "client_email": "XXXXX@northern-gasket-XXXX.iam.gserviceaccount.com", Ciò consentirà di accedere al foglio dal tuo script.


4

Il modo più semplice è risolvere utilizzando gcloud cli. Altri documenti qui https://cloud.google.com/pubsub/docs/quickstart-cli#before-you-begin

installa gcloud

sudo apt-get install google-cloud-sdk

quindi chiama

gcloud init

quindi controlla il tuo progetto attivo e le credenziali

gcloud config configurations list

Se non va bene, assicurati di essere autenticato con l'account corretto:

gcloud auth list
* account 1
  account 2

In caso contrario, passa all'account del progetto:

gcloud config set account `ACCOUNT`

A seconda dell'account, l'elenco dei progetti sarà diverso:

gcloud projects list

- project 1
- project 2...

Passa al progetto previsto:

gcloud config set project `PROJECT NAME`

Quindi Crea credenziali predefinite dell'applicazione con gcloud auth application-default login, quindi google-cloud rileverà automaticamente tali credenziali.


0

I miei 10 centesimi ... Un semplice esempio per leggere il foglio utilizzando 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();
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.