Interfejs API Arkuszy Google zwraca „Rozmówca nie ma pozwolenia” podczas korzystania z klucza serwera


89

Wygenerowałem klucz serwera w menedżerze API i próbowałem wykonać następujące czynności na moim Macu:

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

Ale oto, co zwraca:

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

Co ja tu robię źle?


4
Klucz służy do uzyskiwania dostępu do danych publicznych, co robisz, wymaga uwierzytelnionego dostępu.
— DaImTo

W większości przypadków występuje problem z zakresami. Sprawdź i sprawdź, które zakresy są wymagane przez skrypt.
— dpkrai96

Odpowiedzi:


119

Aby rozwiązać ten problem, spróbuj:

  1. Utwórz konto usługi: https://console.developers.google.com/iam-admin/serviceaccounts/
  2. W opcjach utwórz klucz: ten klucz to twój zwykły client_secret.json - użyj go w ten sam sposób
  3. Ustaw rolę właściciela konta usługi (nazwa członka = identyfikator konta usługi = adres e-mail konta usługi, np .: thomasapp@appname-201813.iam.gserviceaccount.com
  4. Skopiuj adres e-mail swojego konta usługi = identyfikator konta usługi
  5. Po prostu przejdź w przeglądarce do arkusza Google, z którym chcesz korzystać
  6. Idź do UDOSTĘPNIJ w prawym górnym rogu ekranu
  7. Przejdź do ustawień zaawansowanych i udostępnij je za pomocą adresu e-mail konta usługi, np .: thomasapp@appname-201813.iam.gserviceaccount.com

U mnie zadziałało :)


1
to działało dla mnie. przy okazji: w Google Cloud Admin przejdź do ... projekt> IAM & Admin> Service Accounts .... Jeśli masz skonfigurowane konta usług, zobaczysz specjalny e-mail dla każdego konta usługi. Upewnij się, że masz również włączony interfejs API Arkuszy Google. Dosłownie po prostu udostępniasz adres e-mail konta usługi za pomocą przycisku „Udostępnij” arkusza Google.
— Jason F

1
tak ... kluczem jest po prostu udostępnienie dokumentu za pomocą adresu e-mail konta usługi ....
— user1102171

2
Plik JSON z kluczem bardzo różni się od pliku JSON poświadczeń, który otrzymałem z przewodnika Szybki start dla języka Java (dla interfejsu API Arkuszy). Jak to zaimplementować?
— Kardynał - Przywróć Monikę

2
Jak używasz klucza klienta? Czy możesz zamiast tego utworzyć klucz API za pomocą konta usługi?
— Stephen Phillips

41

Wiem, że na odpowiedź jest trochę za późno, ale dla innych osób borykających się z tym samym problemem.
Po prostu zmień uprawnienia arkusza na publiczne na dysku, aby można było uzyskać do niego dostęp bez uwierzytelniania za pośrednictwem wywołań API.

Aby zmienić dostęp:

  1. Otwórz arkusz na dysku Google
  2. W prawym górnym rogu kliknij udostępnij
  3. W dolnej części okna zachęty kliknij zaawansowane
  4. Zmień uprawnienia na publiczne lub osoby z linkiem (bez konieczności logowania się)

Wyślij żądanie API, aby pobrać dane z arkuszy bez uwierzytelniania.

Uwaga: jeśli arkusz zawiera dane wrażliwe, nie jest bezpieczne udostępnianie go publicznie i raczej robienie tego z dostępem uwierzytelnionym.


35
Możesz również udostępnić ten arkusz konkretnemu e-mailowi ​​Np. adres e-mail konta usługi (projektu). "client_email": "XXXXX@northern-gasket-XXXX.iam.gserviceaccount.com", Umożliwi to dostęp do arkusza przez twój skrypt.
— Kishan Patel

4
Dzięki stary. W dokumentacji nie ma napisanych rzeczy, o których wspomniałeś.
— Maulik Dodia

1
Zgoda @MaulikDodia. Dokumenty Google API mówią o tym tutaj , ale nie jest to jasne dla osób, które chcą używać interfejsu API do wyświetlania danych w publicznej witrynie internetowej. Jestem w trakcie pisania poradnika na ten temat. Wyślę ci DM, kiedy skończę.
— Edward

Wielkie dzięki przyjaciel @ user3411192
— Maulik Dodia

27

Zwróć uwagę na komentarz @ KishanPatel:

Możesz również udostępnić ten arkusz konkretnemu e-mailowi ​​Np. adres e-mail konta usługi (projektu). "client_email": "XXXXX@northern-gasket-XXXX.iam.gserviceaccount.com", Umożliwi to dostęp do arkusza przez twój skrypt.


4

Najłatwiej jest to naprawić za pomocą gcloud cli. Więcej dokumentów tutaj https://cloud.google.com/pubsub/docs/quickstart-cli#before-you-begin

zainstaluj gcloud

sudo apt-get install google-cloud-sdk

Wtedy zadzwoń

gcloud init

następnie sprawdź swój aktywny projekt i poświadczenia

gcloud config configurations list

Jeśli to nie jest w porządku, upewnij się, że jesteś uwierzytelniony za pomocą właściwego konta:

gcloud auth list
* account 1
  account 2

Zmień na konto projektu, jeśli nie:

gcloud config set account `ACCOUNT`

W zależności od konta lista projektów będzie się różnić:

gcloud projects list

- project 1
- project 2...

Przejdź do zamierzonego projektu:

gcloud config set project `PROJECT NAME`

Następnie utwórz domyślne dane logowania aplikacji za pomocą gcloud auth application-default login, a następnie google-cloud automatycznie wykryje takie poświadczenia.


0

Moje 10 centów ... Prosty przykład czytania arkusza za pomocą 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();
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.