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.