Пример #1
0
        /// <summary>
        /// Request access token responding to authenticated request token.
        /// </summary>
        /// <param name="verifier">Verifier string for authenticaed request token</param>
        /// <param name="requestToken">Authenticated request token</param>
        /// <param name="accessTokenUrl">Access token URL</param>
        /// <param name="realm">Realm for requesting access token</param>
        /// <param name="additionalParameters">Parameters added to Authorization header</param>
        /// <param name="responseParameters" >Parameters returned in response</param>
        /// <param name="createRequest" >Factory method to create request object</param>
        /// <returns>Responding access token</returns>
        public AccessToken RequestAccessToken(
            String verifier,
            RequestToken requestToken,
            String accessTokenUrl,
            String realm,
            Parameter[] additionalParameters,
            ref Parameter [] responseParameters,
            RequestFactoryMethod createRequest)
        {
            if (additionalParameters == null)
            {
                additionalParameters = new Parameter[0];
            }

            String oauth_consumer_key     = _consumerKey;
            String oauth_token            = requestToken.TokenValue;
            String oauth_signature_method = "HMAC-SHA1";
            String oauth_timestamp        =
                ((DateTime.UtcNow.Ticks - new DateTime(1970, 1, 1).Ticks) / (1000 * 10000)).ToString();
            String oauth_nonce =
                Guid.NewGuid().ToString();

            HttpWebRequest req = createRequest(accessTokenUrl);

            if (_webProxy != null)
            {
                req.Proxy = _webProxy;
            }

            req.Method = "POST";

            String oauth_signature =
                CreateHMACSHA1Signature(
                    req.Method,
                    accessTokenUrl,
                    Parameter.ConCatAsArray(
                        new Parameter[] {
                new Parameter("oauth_consumer_key", oauth_consumer_key),
                new Parameter("oauth_token", oauth_token),
                new Parameter("oauth_signature_method", oauth_signature_method),
                new Parameter("oauth_timestamp", oauth_timestamp),
                new Parameter("oauth_nonce", oauth_nonce),
                new Parameter("oauth_verifier", verifier),
            },
                        additionalParameters
                        ),
                    _consumerSecret,
                    requestToken.TokenSecret
                    );

            req.Headers.Add(
                "Authorization: OAuth " +
                "realm=\"" + realm + "\"," +
                "oauth_consumer_key=\"" + Parameter.EncodeParameterString(oauth_consumer_key) + "\"," +
                "oauth_token=\"" + Parameter.EncodeParameterString(oauth_token) + "\"," +
                "oauth_signature_method=\"" + Parameter.EncodeParameterString(oauth_signature_method) + "\"," +
                "oauth_signature=\"" + Parameter.EncodeParameterString(oauth_signature) + "\"," +
                "oauth_timestamp=\"" + Parameter.EncodeParameterString(oauth_timestamp) + "\"," +
                "oauth_nonce=\"" + Parameter.EncodeParameterString(oauth_nonce) + "\"," +
                "oauth_verifier=\"" + Parameter.EncodeParameterString(verifier) + "\"" +
                (additionalParameters.Length > 0 ?
                 "," + Parameter.ConCat(additionalParameters, "\"") :
                 ""
                )
                );

            HttpWebResponse resp = null;

            try
            {
                resp = (HttpWebResponse)req.GetResponse();
                StreamReader sr = new StreamReader(resp.GetResponseStream());

                responseParameters =
                    Parameter.Parse(sr.ReadToEnd());

                String accessToken       = null;
                String accessTokenSecret = null;
                foreach (Parameter param in responseParameters)
                {
                    if (param.Name == "oauth_token")
                    {
                        accessToken = param.Value;
                    }

                    if (param.Name == "oauth_token_secret")
                    {
                        accessTokenSecret = param.Value;
                    }
                }

                if (accessToken == null || accessTokenSecret == null)
                {
                    throw new InvalidOperationException();
                }

                return(new AccessToken(accessToken, accessTokenSecret));
            }
            finally
            {
                if (resp != null)
                {
                    resp.Close();
                }
            }
        }