Попробуйте получить access_token с помощью google oauth api, но перенаправить на `o/oauth2/authentication`

Сейчас я пытаюсь использовать google oauth api, чтобы позволить пользователю Google войти в мое приложение. И я следовал всем вместе с документацией Google OAuth2Login.

Я использовал это, чтобы получить код, и он работал просто отлично.

var u = 'https://accounts.google.com/o/oauth2/auth?'
    + '&response_type=code'
    + '&client_id=' + opts.googleClient
    + '&redirect_uri=' + redirectURI
    + '&scope=' + opts.scope
    + '&approval_prompt=force&access_type=offline';

Но пока я пытаюсь получить access_token с /o/oauth2/token API, как показано ниже:

    var u = 'https://accounts.google.com/o/oauth2/token?'
        + 'code=' + code
        + '&client_id=' + opts.googleClient
        + '&client_secret=' + opts.googleSecret
        + '&scope='
        + '&redirect_uri=' + redirectURI
        + '&grant_type=' + 'authorization_code';
    request.post({url: u, json: true}, fn);

Это вернуло меня

{
    error: "invalid_request"
}

Я проверил это с помощью инструментов разработчика Chrome на панели "Сеть", которые указывают, что URL-адрес запроса https://accounts.google.com/o/oauth2/approval?as=-5013c18c497345fc&hl=en&pageId=none&xsrfsign=APsBz4gAAAAAUcwS1TxlojrAPVNCj7ntTlz1H4xQgysC вместо того, что я отправляю.

Я могу убедиться, что мой пост URL и данные выглядят точно так же, как в https://developers.google.com/oauthplayground/. Но результат совершенно другой.

Я сделал что-то не так? Пожалуйста помоги.

1 ответ

Решение

Данные, которые вы отправляете, выглядят корректно, но похоже, что в формировании запроса есть две ошибки.

Во-первых, когда вы создаете часть данных формы в сообщении, убедитесь, что ваш URL кодирует все значения, например, если значение redirect_uri содержит символ &, это вызовет проблемы, если он не закодирован в формате URL.

Во-вторых, хотя вы правильно делаете POST вместо GET, вы по-прежнему отправляете параметры в строке запроса, а не в теле запроса. Переместите их в тело, установите тип контента на "application/x-www-form-urlencoded", и вы должны быть установлены.

(похоже на JavaScript, но я не уверен, какие библиотеки вы используете, поэтому я не предоставил пример кода)

Другие вопросы по тегам