2012-04-01 4 views
1

J'essaie de tirer une liste de contacts à partir d'un compte google. Mais Google renvoie un 401.Google Data Api retournant un jeton d'accès invalide

L'URL utilisée pour demander un code d'autorisation:

String codeUrl = 'https://accounts.google.com/o/oauth2/auth' + '?' 
      + 'client_id=' + EncodingUtil.urlEncode(CLIENT_ID, 'UTF-8') 
      + '&redirect_uri=' + EncodingUtil.urlEncode(MY_URL, 'UTF-8') 
      + '&scope=' + EncodingUtil.urlEncode('https://www.google.com/m8/feeds/', 'UTF-8') 
      + '&access_type=' + 'offline' 
      + '&response_type=' + EncodingUtil.urlEncode('code', 'UTF-8') 
      + '&approval_prompt=' + EncodingUtil.urlEncode('force', 'UTF-8'); 

Remplacement du code d'autorisation de retour pour un jeton d'accès (et rafraîchissement jeton):

String params = 'code=' + EncodingUtil.urlEncode(authCode, 'UTF-8') 
       + '&client_id=' + EncodingUtil.urlEncode(CLIENT_ID, 'UTF-8') 
       + '&client_secret=' + EncodingUtil.urlEncode(CLIENT_SECRET, 'UTF-8') 
       + '&redirect_uri=' + EncodingUtil.urlEncode(MY_URL, 'UTF-8')  
       + '&grant_type=' + EncodingUtil.urlEncode('authorization_code', 'UTF-8'); 

Http con = new Http(); 
Httprequest req = new Httprequest(); 
req.setEndpoint('https://accounts.google.com/o/oauth2/token'); 
req.setHeader('Content-Type', 'application/x-www-form-urlencoded');     
req.setBody(params); 
req.setMethod('POST'); 
Httpresponse reply = con.send(req); 

qui retourne un tableau JSON avec ce qui ressemble à un jeton d'accès valide:

{ 
    "access_token" : "{access_token}", 
    "token_type" : "Bearer", 
    "expires_in" : 3600, 
    "refresh_token" : "{refresh_token}" 
} 

Cependant quand j'essaie d'utiliser le jeton d'accès (en code ou boucle) Google renvoie un 401:

curl -H "Authorization: Bearer {access_token}" https://www.google.com/m8/feeds/contacts/default/full/ 

Soit dit en passant, la même commande curl mais avec un jeton d'accès acquis par https://code.google.com/oauthplayground/ œuvres. Ce qui me porte à croire qu'il y a quelque chose de mal avec le code d'autorisation d'échange pour la demande de jeton d'accès car le jeton d'accès retourné ne fonctionne pas.

Je dois ajouter tout cela est dans le laps de temps expires_in si ce ne est pas que le access_token a expiré

Répondre

0

Ok, donc le problème dans le champ lors de la demande d'un code d'autorisation. J'avais accidentellement mis la portée à https://www.google.com/m8/feeds/contacts/default/full (l'URL pour récupérer tous les contacts), les périls du codage tard dans la nuit. Ironiquement, comme l'exemple de la question utilisait l'url correctement codée, elle n'avait pas l'erreur. Je vais laisser la question dans l'espoir que ceux qui ont un problème similaire le trouveront et que le code de la question fonctionne.

Questions connexes