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