2012-01-17 2 views
4

J'ai réussi à obtenir le jeton d'accès pour l'API Contacts de Google, mais lorsque j'essaye de passer un appel pour récupérer le profil de l'utilisateur connecté, j'obtiens une erreur 401 non autorisée. .API Google Contacts - Après avoir obtenu le jeton d'accès (oauth)

Je l'ai fait quelques recherches et suivi les étapes mentionnées dans « divers » google documentation (comme this one et this one et bien d'autres), mais sans utilisation ...

Je pense que ce jour je signe la demande faux. Voici ce que je fais après avoir obtenu le jeton d'accès.

string outUrl,querystring; 
string sig = oAuth.GenerateSignature(new Uri("https://www.google.com/m8/feeds/contacts/default/full"), Server.UrlEncode(oAuth.ConsumerKey), oAuth.ConsumerSecret, oAuth.Token, null, "GET", timeStamp, nonce, out outUrl, out querystring); 
string reqURL = "https://www.google.com/m8/feeds/contacts/default/full?access_token=" + oAuth.Token + "&oauth_signature_method=HMAC-SHA1&oauth_signature=" + Server.UrlEncode(sig) + "&oauth_consumer_key=" + oAuth.ConsumerKey + "&oauth_timestamp=" + timeStamp + "&oauth_nonce=" + nonce + "&oauth_version=1.0"; 
response = oAuth.WebRequest(oAuthGoogle.Method.GET, reqURL, String.Empty); 

L'erreur 401 apparaît lorsque envoyer la demande à l'aide oAuth.WebRequest() (la dernière ligne du code ci-dessus)

J'ai juste besoin de se débarrasser de l'erreur 401 ... Je suis en utilisant ASP.NET/C#. Toute aide serait appréciée. Merci ...

Répondre

1

Votre exemple de code définit reqURL qui n'est pas utilisé et utilise url qui n'est pas défini.

Vous devez normalement fournir des paramètres de requête OAuth avec l'en-tête d'autorisation plutôt qu'avec la chaîne de requête.

http://oauth.net/core/1.0/#auth_header_authorization

j'imagine la signature de la demande et la mise en l'autorisation c'est quelque chose qui est en cours de traitement à l'intérieur de votre objet OAuth.

Pour clarifier

J'ai utilisé une méthode comme celui-ci pour signer les demandes HTTP dans ma mise en œuvre OAuth 1.0a:

/// <summary> 
    /// Gets the authorization header. 
    /// </summary> 
    /// <param name="method">The method.</param> 
    /// <param name="url">The URL of the request.</param> 
    /// <param name="parameters">The parameters.</param> 
    /// <returns>Authorization header</returns> 
    public string GetAuthorizationHeader(string method, Uri url, NameValueCollection parameters) 
    { 
     parameters.Set("oauth_consumer_key", this.ConsumerKey); 
     parameters.Set("oauth_nonce", this.GetNonce()); 
     parameters.Set("oauth_timestamp", this.GetTimeStamp()); 
     parameters.Set("oauth_version", "1.0"); 
     parameters.Set("oauth_signature_method", "HMAC-SHA1"); 

     string signString = this.GetSignString(method, url, parameters); 
     string signature = this.GetSignature(signString, this.ConsumerSecret, this.tokenSecret); 

     parameters.Set("oauth_signature", signature); 

     StringBuilder authorizationHeader = new StringBuilder(); 
     foreach (string paramKey in parameters.AllKeys) 
     { 
      if (authorizationHeader.Length > 0) 
      { 
       authorizationHeader.Append(", "); 
      } 
      else 
      { 
       authorizationHeader.Append("OAuth "); 
      } 

      authorizationHeader.AppendFormat("{0}=\"{1}\"", paramKey, OAuthHelper.UrlEncode(parameters[paramKey])); 
     } 

     return authorizationHeader.ToString(); 
    } 

que j'utilise comme cette

public void SignHttpWebRequest(string token, string tokenSecret, ref HttpWebRequest request) 
    { 
     NameValueCollection parameters = new NameValueCollection(); 
     this.tokenSecret = tokenSecret; 
     parameters.Set("oauth_token", token); 
     request.Headers.Add("Authorization", this.GetAuthorizationHeader(request, parameters)); 
    } 
+0

Je suis désolé, 9 heures de travail m'ont brouillé la tête un peu. J'utilise reqURL dans le WebRequest. Je vais éditer ma question pour la corriger merci de l'avoir signalé. Je vais essayer de fournir les paramètres dans l'en-tête d'autorisation et voir ce qui se passe. Ceci est déroutant pour moi parce que j'ai déjà fait twitter, Yahoo, LIVE, et beaucoup d'autres et tout ce que je devais faire pour obtenir une réponse est http (s): // RequestURL /? Access_token = _ACCESS_TOKEN_ et cela fonctionnerait. Je vais essayer votre suggestion, merci. – Reyno

+0

Merci, ça l'a fait pour moi. Après avoir regardé votre code, j'ai réalisé comment envoyer la requête avec l'en-tête d'autorisation plutôt que de l'envoyer avec une chaîne de requête. Merci beaucoup! – Reyno

Questions connexes