Google Sheets API повертає "Абонент не має дозволу" при використанні ключа сервера


89

Я створив серверний ключ в диспетчері API і спробував виконати наступне на своєму Mac:

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

Але це повертається:

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

Що я тут роблю не так?


4
Ключ призначений для доступу до публічних даних, для того, що ви робите, потрібен автентифікований доступ.
DaImTo

У більшості випадків існує певна проблема сфери застосування. Будь ласка, перевірте та підтвердьте, які сфери дії вимагаються сценарієм.
dpkrai96,

Відповіді:


119

Щоб вирішити цю проблему, спробуйте:

  1. Створіть обліковий запис служби: https://console.developers.google.com/iam-admin/serviceaccounts/
  2. У параметрах створіть ключ: цей ключ - це ваш звичайний client_secret.json - використовуйте його так само
  3. Вкажіть власника ролі для облікового запису служби (ім’я учасника = ідентифікатор службового рахунку = електронна адреса службового облікового запису, наприклад: thomasapp@appname-201813.iam.gserviceaccount.com
  4. Скопіюйте електронну адресу свого облікового запису служби = ідентифікатор облікового запису служби
  5. Просто перейдіть у своєму браузері до аркуша Google, з яким ви хочете взаємодіяти
  6. Перейдіть до розділу SHARE у верхньому правому куті екрана
  7. Перейдіть у розширені налаштування та надайте їм електронну адресу свого облікового запису служби, наприклад: thomasapp@appname-201813.iam.gserviceaccount.com

У мене це вийшло :)


1
це спрацювало для мене. до речі: у адміністраторі Google Cloud перейдіть до ... project> IAM & Admin> Service Accounts .... Якщо ви налаштували облікові записи служб, ви побачите спеціальний електронний лист для кожного відповідного облікового запису служби. Переконайтеся, що ви також увімкнули API Google Sheets. Буквально ви просто передаєте електронну адресу облікового запису служби за допомогою кнопки "Поділитися" на аркуші Google.
Джейсон Ф

1
так ... головне - просто поділитися документом із електронною поштою службового облікового запису ....
user1102171

2
Ключ json сильно відрізняється від облікових даних json, які я отримав із посібника з швидкого запуску Java (для API Sheets). Як це реалізувати?
Кардинал -

2
Як ви використовуєте секрет клієнта? Чи можете ви замість цього зробити ключ API із обліковим записом служби?
Стівен Філліпс,

42

Я знаю, що трохи пізно відповідати, але для інших людей, які борються з тим самим питанням.
Просто змініть дозвіл аркуша на загальнодоступний на своєму диску, щоб отримати доступ до нього без автентифікації за допомогою викликів API.

Щоб змінити доступ:

  1. Відкрити аркуш на Google Drive
  2. У верхньому правому куті натисніть "Поділитися"
  3. Унизу вікна запиту натисніть розширені
  4. Змінити дозвіл для загальнодоступних або людей із посиланням (вхід не потрібен)

Надішліть запит API для отримання даних з аркушів без автентифікації.

Примітка: якщо аркуш містить конфіденційні дані, небезпечно робити його загальнодоступним, а радше робити це за допомогою автентифікованого доступу.


36
Крім того, ви можете поділитися цим аркушем із конкретним електронним листом, напр. електронною поштою вашого облікового запису служби (проекту). "client_email": "XXXXX@northern-gasket-XXXX.iam.gserviceaccount.com", це дозволить отримати доступ до аркуша вашого сценарію.
Kishan Patel

4
Дякую, брате. У документації немає жодних письмових речей, подібних до яких ви згадали.
Maulik Dodia

1
Погодився @MaulikDodia. Документи Google API говорять про це тут , але людям, які просто хочуть використовувати API для відображення даних на загальнодоступному веб-сайті, незрозуміло. Я в процесі написання інструкцій щодо всього цього. Коли я закінчу, я надішлю вам DM.
Едвард

Велике спасибі, друг @ user3411192
Maulik Dodia

27

Обов’язково зверніть увагу на коментар @ KishanPatel:

Крім того, ви можете поділитися цим аркушем із конкретним електронним листом, наприклад. електронною поштою вашого облікового запису служби (проекту). "client_email": "XXXXX@northern-gasket-XXXX.iam.gserviceaccount.com", це дозволить отримати доступ до аркуша вашого сценарію.


4

Найпростіший спосіб - це виправити за допомогою gcloud cli. Більше документів тут https://cloud.google.com/pubsub/docs/quickstart-cli#before-you-begin

встановити gcloud - -

sudo apt-get install google-cloud-sdk

то дзвоніть

gcloud init

потім перевірте свій активний проект та облікові дані

gcloud config configurations list

Якщо це не нормально, переконайтеся, що ви автентифікувались із правильним обліковим записом:

gcloud auth list
* account 1
  account 2

Якщо ні, перейдіть до облікового запису проекту:

gcloud config set account `ACCOUNT`

Залежно від облікового запису, список проектів буде різним:

gcloud projects list

- project 1
- project 2...

Перейти до запланованого проекту:

gcloud config set project `PROJECT NAME`

Потім створіть облікові дані за промовчанням за допомогою gcloud auth application-default login, і Google Cloud автоматично визначить такі облікові дані.


0

Мої 10 центів ... Простий приклад читання аркуша за допомогою 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();
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.