Используя Android clientId (без client_secret), я получил следующий ответ об ошибке:
{
"error": "invalid_grant",
"error_description": "Missing code verifier."
}
Я не могу найти никакой документации для поля «code_verifier», но обнаружил, что если вы установите для него равные значения как в запросах авторизации, так и в запросах токенов, это устранит эту ошибку. Я не уверен, каким должно быть предполагаемое значение и должно ли оно быть безопасным. Он имеет некоторую минимальную длину (16? Символов), но я обнаружил, что настройка null
также работает.
Я использую AppAuth для запроса авторизации в своем Android-клиенте, который имеет setCodeVerifier()
функцию.
AuthorizationRequest authRequest = new AuthorizationRequest.Builder(
serviceConfiguration,
provider.getClientId(),
ResponseTypeValues.CODE,
provider.getRedirectUri()
)
.setScope(provider.getScope())
.setCodeVerifier(null)
.build();
Вот пример запроса токена в узле:
request.post(
'https://www.googleapis.com/oauth2/v4/token',
{ form: {
'code': '4/xxxxxxxxxxxxxxxxxxxx',
'code_verifier': null,
'client_id': 'xxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com',
'client_secret': null,
'redirect_uri': 'com.domain.app:/oauth2redirect',
'grant_type': 'authorization_code'
} },
function (error, response, body) {
if (!error && response.statusCode == 200) {
console.log('Success!');
} else {
console.log(response.statusCode + ' ' + error);
}
console.log(body);
}
);
Я тестировал, и это работает с обоими https://www.googleapis.com/oauth2/v4/token
и https://accounts.google.com/o/oauth2/token
.
Если вы используете GoogleAuthorizationCodeTokenRequest
вместо этого:
final GoogleAuthorizationCodeTokenRequest req = new GoogleAuthorizationCodeTokenRequest(
TRANSPORT,
JSON_FACTORY,
getClientId(),
getClientSecret(),
code,
redirectUrl
);
req.set("code_verifier", null);
GoogleTokenResponse response = req.execute();