Використовуючи 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();