0

ОБНОВЛЕНИЕ: Решено. Между прочим, я действительно делал основную ошибку. Мое использование функции 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 предоставляет в качестве примера в документации.

Все это приводит меня к мысли, что я делаю простую ошибку, но я не имел никакого успеха в ее поиске. Что я здесь делаю неправильно? Ссылки на любую полезную документацию были бы чрезвычайно оценены; спасибо за ваше время и внимание.

ответ

0

Попробуйте "grant_type": "authorization_code". И добавьте тип гранта в качестве заголовка.

Кроме того, проверьте эту ссылку - Accessing Google oAuth giving invalid grant_type (Bad request)

+0

Я попытался это, но безуспешно; Я все еще получаю такое же сообщение об ошибке. – ModelHX

+0

Вы добавили grant_type как часть заголовка, а не как полезную нагрузку? – Sayali

+0

Проводка с 'grant_type' в полезной нагрузке и в заголовке (и изменена на' authorisation_code' дает такое же сообщение об ошибке, как указано выше, размещение с 'grant_type' только в заголовке дает сообщение об ошибке' {'error_uri': '', 'error_description': 'Обязательный параметр отсутствует: grant_type', 'error': 'invalid_request'} ' – ModelHX

Смежные вопросы