/// <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(); } } }