Как я могу восстановить конечную точку Google Api с помощью служебного ключа? - PullRequest
0 голосов
/ 16 июня 2020

Я использую почтальон для вызова c спокойного API и пытаюсь получить доступ к конечной точке API листов Google. Когда я пытаюсь получить доступ к своей конечной точке, она возвращает:

{
  "error": {
    "code": 403,
    "message": "The request is missing a valid API key.",
    "status": "PERMISSION_DENIED"
  }
}

, что достаточно справедливо, поскольку я не использовал свой ключ API. Я создал учетную запись службы и получил файл json, но я планирую получить доступ с помощью конечной точки отдыха, поэтому мне нужно передать токен в заголовке, но я не уверен, как это сделать.

Я просмотрел файл json и не был уверен, что извлечь, чтобы передать его для моего вызова отдыха.

Удалось ли кому-нибудь это сделать успешно?

1 Ответ

1 голос
/ 16 июня 2020

Перед вызовом служб Google из Postman вам необходимо заново создать поток для получения учетных данных учетной записи службы формы токена доступа:

  • построить и закодировать полезную нагрузку JWT из данных из файлов учетных данных (для заполнения aud, iss, sub, iat и exp)
  • запросить токен доступа с помощью этого JWT
  • сделать запрос к API, используя этот токен доступа

Вы можете найти полное руководство для этого потока здесь: https://developers.google.com/identity/protocols/oauth2/service-account#authorizingrequests

Вот пример в python. Вам нужно будет установить pycrypto и pyjwt для запуска этого скрипта:

import requests
import json
import jwt
import time

#for RS256 you may need this
#from jwt.contrib.algorithms.pycrypto import RSAAlgorithm
#jwt.register_algorithm('RS256', RSAAlgorithm(RSAAlgorithm.SHA256))

token_url = "https://oauth2.googleapis.com/token"
credentials_file_path = "./google.json"

#build and sign JWT
def build_jwt(config):
    iat = int(time.time())
    exp = iat + 3600
    payload = {
        'iss': config["client_email"],
        'sub': config["client_email"],
        'aud': token_url,
        'iat': iat,
        'exp': exp,
        'scope': 'https://www.googleapis.com/auth/spreadsheets'
    }
    jwt_headers = {
        'kid': config["private_key_id"],
        "alg": 'RS256',
        "typ": 'JWT'
    }
    signed_jwt = jwt.encode(
        payload, 
        config["private_key"], 
        headers = jwt_headers,
        algorithm = 'RS256'
    )
    return signed_jwt

with open(credentials_file_path) as conf_file:
    config = json.load(conf_file)
    # 1) build and sign JWT
    signed_jwt = build_jwt(config)
    # 2) get access token
    r = requests.post(token_url, data= {
        "grant_type": "urn:ietf:params:oauth:grant-type:jwt-bearer",
        "assertion": signed_jwt.decode("utf-8")
    })
    token = r.json()
    print(f'token will expire in {token["expires_in"]} seconds')
    at = token["access_token"]
    print(at)

Обратите внимание на значение области: https://www.googleapis.com/auth/spreadsheets

Вероятно, вы можете выполнить все описанные выше действия с помощью Google API. библиотека в зависимости от того, какой язык программирования вы предпочитаете

Приведенный выше сценарий напечатает токен доступа:

ya29.AHES67zeEn-RDg9CA5gGKMLKuG4uVB7W4O4WjNr-NBfY6Dtad4vbIZ

Затем вы можете использовать его в Postman в заголовке Authorization как Bearer {TOKEN}.

Или используя :

curl "https://sheets.googleapis.com/v4/spreadsheets/$SPREADSHEET_ID" \
     -H "Authorization: Bearer $ACCESS_TOKEN"

Примечание: вы можете найти пример использования ключей сервисного аккаунта для вызова Google Translate API здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...