Używając Android clientId (no client_secret) otrzymałem następującą odpowiedź o błędzie:
{
"error": "invalid_grant",
"error_description": "Missing code verifier."
}
Nie mogę znaleźć żadnej dokumentacji dla pola „code_verifier”, ale odkryłem, że jeśli ustawisz je na równe wartości zarówno w żądaniach autoryzacji, jak i tokenów, usunie to błąd. Nie jestem pewien, jaka powinna być zamierzona wartość lub czy powinna być bezpieczna. Ma jakąś minimalną długość (16 znaków), ale okazało się, że ustawienie null
również działa.
Używam AppAuth do żądania autoryzacji w moim kliencie z Androidem, który ma setCodeVerifier()
funkcję.
AuthorizationRequest authRequest = new AuthorizationRequest.Builder(
serviceConfiguration,
provider.getClientId(),
ResponseTypeValues.CODE,
provider.getRedirectUri()
)
.setScope(provider.getScope())
.setCodeVerifier(null)
.build();
Oto przykładowe żądanie tokena w węźle:
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);
}
);
Testowałem i to działa zarówno z, jak https://www.googleapis.com/oauth2/v4/token
i https://accounts.google.com/o/oauth2/token
.
Jeśli GoogleAuthorizationCodeTokenRequest
zamiast tego używasz :
final GoogleAuthorizationCodeTokenRequest req = new GoogleAuthorizationCodeTokenRequest(
TRANSPORT,
JSON_FACTORY,
getClientId(),
getClientSecret(),
code,
redirectUrl
);
req.set("code_verifier", null);
GoogleTokenResponse response = req.execute();