ОБНОВЛЕНИЕ: Решено. Между прочим, я действительно делал основную ошибку. Мое использование функции session.headers.update
было неправильным; вместо session.headers.update = {foo:bar}
, мне нужно было делать session.headers.update({foo:bar})
. Кроме того, я изменил следующий фрагмент кода:Запрос доступа к учетной записи доступа к службе Google: «Необходимый параметр отсутствует: grant_type»
Отсюда:
payload = urllib.parse.urlencode({
"grant_type":"urn:ietf:params:oauth:grant-type:jwt-bearer",
"assertion": str(token)
})
Для этого:
payload = "grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=" + token.decode("utf-8")
код теперь работает как задумано.
Оригинальный вопрос ниже
Я видел несколько хитов на SO и Google об этой проблеме; ни один из них не помог, хотя я, конечно же, обязательно дважды проверял свой код, чтобы убедиться, что я не виноват в тех же проблемах, которые они детализируют. Проблемы, которые, как правило, связаны с передачей данных POST в качестве параметров или POSTing на неправильный URL-адрес, чего я не делаю, насколько я могу судить. Кроме того, большинство хитов, которые я нашел, включают в себя 3-сторонние OAuth2 с участием пользователей; Я обнаружил сравнительно небольшое количество обращений к учетным записям служб и JWT, которые отличаются от потока пользователей, которые меня волнуют, насколько они актуальны для моей проблемы.
Я пытаюсь получить токен доступа с сервера аутентификации Google для учетной записи службы. Я создал свой JWT и теперь хочу POST на сервер, чтобы получить обратно токен доступа. Я установил заголовки в соответствии с документацией, описанной here, в разделе «Выполнение запроса доступа к токену», и, насколько я могу судить, мой запрос соответствует спецификации, но Google отвечает на ответ с ответом 400, а следующий JSON :
{'error': 'invalid_request', 'error_description': 'Required parameter is missing: grant_type'}
Вот код, вызывающий проблемы:
# Returns the session, now with the Host and Authorization headers set.
def gAuthenticate(session):
token = createJWT()
session.headers.update = {
"Host": "www.googleapis.com",
"Content-Type": "application/x-www-form-urlencoded"
}
payload = urllib.parse.urlencode({
"grant_type":"urn:ietf:params:oauth:grant-type:jwt-bearer",
"assertion": str(token)
})
response = session.post("https://www.googleapis.com/oauth2/v4/token", data = payload)
session.headers.update = {"Authorization": "Bearer " + response.json()["access_token"]}
return session
У меня много странных проблем с этим кодом. Прежде всего, если у меня нет urllib.parse.urlencode
моего словаря (т. Е. Просто payload = {dictionary}
), я получаю только ошибку Bad Request/'invalid_request'
, которая, как я полагаю, из менее конкретного сообщения об ошибке означает, что это менее приемлемо, чем то, что я сейчас делаю. Почему я должен это делать? Разве запросы не предназначены для кодирования моих данных для меня? У меня никогда не было этой проблемы, когда POSTing с запросами раньше.
Во-вторых, рассмотрение подготовленного запроса до его отправки показывает, что мои заголовки не установлены правильно, несмотря на обновление заголовка. Ни один из заголовков, которые я добавил в запрос, не передается.
Я исследовал тело запроса и, похоже, он идентичен (за исключением, конечно, содержимого JWT) того, который Google предоставляет в качестве примера в документации.
Все это приводит меня к мысли, что я делаю простую ошибку, но я не имел никакого успеха в ее поиске. Что я здесь делаю неправильно? Ссылки на любую полезную документацию были бы чрезвычайно оценены; спасибо за ваше время и внимание.
Я попытался это, но безуспешно; Я все еще получаю такое же сообщение об ошибке. – ModelHX
Вы добавили grant_type как часть заголовка, а не как полезную нагрузку? – Sayali
Проводка с 'grant_type' в полезной нагрузке и в заголовке (и изменена на' authorisation_code' дает такое же сообщение об ошибке, как указано выше, размещение с 'grant_type' только в заголовке дает сообщение об ошибке' {'error_uri': '', 'error_description': 'Обязательный параметр отсутствует: grant_type', 'error': 'invalid_request'} ' – ModelHX