API контактов Google - после получения токена доступа (oauth) - PullRequest
4 голосов
/ 17 января 2012

Мне удалось получить токен доступа для API контактов Google, но когда я пытаюсь позвонить, чтобы получить профиль авторизованного пользователя, я получаю 401 несанкционированную ошибку ...

Я провел некоторое исследование иследовал инструкциям, описанным в «различных» документациях Google (например, , этом и , этом и многих других), но без толку ...

Пока я думаюЯ неправильно подписываю запрос.Вот что я делаю после получения токена доступа.

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);

Ошибка 401 возникает при отправке запроса с использованием oAuth.WebRequest () (последняя строка кода выше)

Мне просто нужно избавиться от ошибки 401 ... Я использую ASP.NET/C#.Любая помощь будет оценена.Спасибо ...

1 Ответ

1 голос
/ 17 января 2012

Ваш пример кода определяет reqURL, который не используется, и использует url, который не определен.

Обычно параметры запроса OAuth указываются в заголовке авторизации, а не в строке запроса.

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

Я хотел бы представить подпись запроса и установку Авторизации, это то, что обрабатывается внутри вашего объекта OAuth.

Для уточнения

Я использовал такой метод для подписи http-запросов в моей реализации 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();
    }

Который я так использую

    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));
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...