Google API: недопустимый тип grant_type при попытке получить токен доступа

У меня есть следующий код JS, чтобы получить код аутентификации для потока OAuth2 с Google:

        gapi.client.init({
          apiKey: apiKey,
          clientId: clientId,
          scope: scopes
        });

//...

        gapi.auth2.getAuthInstance().grantOfflineAccess({
              scope: 'email profile'
            })
            .then(function(response) {
              if (response && !response.error) {
                // google authentication succeed, now post data to server.
                $.ajax({
                  type: 'POST',
                  url: "my_url",
                  data:  {
                    code: response.code
                  },
                  success: function(data) {
                       //...
                  },
                  error: function(er) {
                    console.log(er);
                  }
                });
              } else {
                console.log('google authentication failed');
                console.log(response)
              }
            });

POST сделан с кодом для приложения Ruby on Rails, в котором я использую Signet gem для обработки потока аутентификации, я инициализирую его следующим образом:

  @client = Signet::OAuth2::Client.new(
      :authorization_uri => 'https://accounts.google.com/o/oauth2/auth',
      :token_credential_uri =>  'https://www.googleapis.com/oauth2/v3/token',
      :client_id => GCAL_CLIENT_KEY,
      :client_secret => GCAL_CLIENT_SECRET,
      :scope => 'email profile',
      additional_parameters: {
          "access_type" => "offline",
          "include_granted_scopes" => "true"
      }
  )

а затем попробуйте получить токен доступа:

  @client.code = auth_code
  @client.fetch_access_token!

Но получаю следующее исключение:

#<Signet::AuthorizationError: Authorization failed.  Server message:
{
 "error": "unsupported_grant_type",
 "error_description": "Invalid grant_type: "
}>

Пробовал также использовать HTTP/REST вызов https://www.googleapis.com/oauth2/v4/token с телом запроса, как описано здесь. Но тот же ответ - неверный тип grant_type

1 ответ

Вы не установили redirect_uri в инициализации своего гема Signet, и похоже, что Signet полагается на это, чтобы установить grant_type для authorization_code: https://github.com/google/signet/blob/621515ddeec1dfb6aef662cdfaca7ab30e90e5a1/lib/signet/oauth_2/client.rb#L834

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