Я работаю в небольшой компании, чья почта размещена через Google. Как один из администраторов, ответственных за управление учетными записями сотрудников, я пытаюсь автоматизировать некоторые задачи с помощью API Google и одной или нескольких специализированных учетных записей служб. Я написал короткий сценарий Python ниже, чтобы запросить токен доступа в соответствии с документацией Google, но я продолжаю получать ошибку «invalid_grant».Ошибка Python OAuth «Недопустимый грант»
Я сделал следующее:
- Записан в консоль разработчика Google в качестве учетной записи службы и создал проект
- Создано идентификатор клиента учетной записи типа службы
- Записан в Google администратор Консоль и добавленные адреса электронной почты и URL-адреса клиента. Я хочу, чтобы учетная запись имела доступ к . .
. Поиск в Интернете дал ответы, указав, что либо система ti я выключен, предел для токенов обновления превышен или что вместо идентификатора клиента используется идентификатор клиента. Я синхронизировал время на машине Windows и машине Linux до запуска скрипта и появляется такая же ошибка. Я даже не получаю токен доступа, поэтому я сомневаюсь, что предел обновления превышен. Как видно ниже, значение iss устанавливается на адрес электронной почты клиента, заканчивающийся на «@ developer.gserviceaccount.com».
Я подозреваю, что есть что-то еще, что мне не хватает, и, поскольку я новичок в Python, я подозреваю, что это что-то неловко просто. Может быть, кто-то может помочь?
import json
import time
import base64
import requests
from datetime import datetime
utc = datetime.utcnow()
iat = time.mktime(utc.timetuple())
exp = iat + 3600
jwt_header = {
"alg":"RS256",
"typ":"JWT"
}
jwt_claim_set = {
"iss":"[email protected]",
"scope":"https://www.googleapis.com/auth/admin.directory.user",
"aud":"https://www.googleapis.com/oauth2/v3/token",
"iat":int(iat),
"exp":int(exp),
"sub":"[email protected]"
}
jwt_jws = bytearray(str(jwt_header) + '.' + str(jwt_claim_set))
jwt_unencoded = str(jwt_header) + '.' + str(jwt_claim_set) + '.' + str(jwt_jws)
jwt_encoded = base64.urlsafe_b64encode(str(jwt_unencoded))
url = 'https://www.googleapis.com/oauth2/v3/token'
headers = {
'content-type': 'application/x-www-form-urlencoded'
}
payload = {
'grant_type': 'urn:ietf:params:oauth:grant-type:jwt-bearer',
'assertion': jwt_encoded
}
response = requests.post(url, headers=headers, params=payload)
print response
print response.json()
Выход следующий:
<Response [400]>
{u'error_description': u'Bad Request', u'error': u'invalid_grant'}
Я думаю, что грант должен быть authorization_code или что-то подобное здесь. https://developers.google.com/accounts/docs/OAuth2WebServer#offline Видя, что ваш grant_type является 'grant_type': 'urn: ietf: params: oauth: grant-type: jwt-bearer', поэтому с ошибкой –
Спасибо за быстрый ответ. Однако предложение и сопутствующая ссылка, включенные в ваш ответ, предназначены для запросов доступа от приложений веб-сервера, а не для учетных записей служб. Выполнение предложенных изменений приводит к тому, что скрипт выдает другую ошибку, которая указывает '{u'error_description ': u'Missing требуемый параметр: code', u'error ': u'invalid_request'}' – r3tic3nc3
Сообщение об ошибке было результатом меня используя 'params' вместо' data'. Первое должно использоваться с запросами на получение, в то время как последнее должно использоваться с почтой. Однако теперь я получаю сообщение об ошибке, в котором говорится: '' u'error_description ': отсутствует u'Required параметр: grant_type', u'error ': u'invalid_request'} '. – r3tic3nc3