Usando um clientId Android (sem client_secret), obtive a seguinte resposta de erro:
{
"error": "invalid_grant",
"error_description": "Missing code verifier."
}
Não consigo encontrar nenhuma documentação para o campo 'code_verifier', mas descobri que se você configurá-lo com valores iguais nas solicitações de autorização e de token, esse erro será removido. Não tenho certeza de qual deve ser o valor pretendido ou se deve ser seguro. Tem um comprimento mínimo (16? Caracteres), mas descobri que a configuração para null
também funciona.
Estou usando AppAuth para a solicitação de autorização em meu cliente Android, que tem uma setCodeVerifier()
função.
AuthorizationRequest authRequest = new AuthorizationRequest.Builder(
serviceConfiguration,
provider.getClientId(),
ResponseTypeValues.CODE,
provider.getRedirectUri()
)
.setScope(provider.getScope())
.setCodeVerifier(null)
.build();
Aqui está um exemplo de solicitação de token no nó:
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);
}
);
Eu testei e isso funciona com ambos https://www.googleapis.com/oauth2/v4/token
ehttps://accounts.google.com/o/oauth2/token
.
Se você estiver usando em GoogleAuthorizationCodeTokenRequest
vez disso:
final GoogleAuthorizationCodeTokenRequest req = new GoogleAuthorizationCodeTokenRequest(
TRANSPORT,
JSON_FACTORY,
getClientId(),
getClientSecret(),
code,
redirectUrl
);
req.set("code_verifier", null);
GoogleTokenResponse response = req.execute();