/RestSharp/Authenticators/OAuth1Authenticator.cs

https://github.com/NokNokLLC/RestSharp · C# · 232 lines · 207 code · 24 blank · 1 comment · 8 complexity · 79dc836b95bcedca88b36378607bfe6b MD5 · raw file

  1. using System;
  2. using System.Linq;
  3. using System.Text;
  4. using RestSharp.Authenticators.OAuth;
  5. using RestSharp.Authenticators.OAuth.Extensions;
  6. #if WINDOWS_PHONE
  7. using System.Net;
  8. #else
  9. using RestSharp.Contrib;
  10. #endif
  11. namespace RestSharp.Authenticators
  12. {
  13. public class OAuth1Authenticator : IAuthenticator
  14. {
  15. public virtual string Realm { get; set; }
  16. public virtual OAuthParameterHandling ParameterHandling { get; set; }
  17. public virtual OAuthSignatureMethod SignatureMethod { get; set; }
  18. public virtual OAuthSignatureTreatment SignatureTreatment { get; set; }
  19. internal virtual OAuthType Type { get; set; }
  20. internal virtual string ConsumerKey { get; set; }
  21. internal virtual string ConsumerSecret { get; set; }
  22. internal virtual string Token { get; set; }
  23. internal virtual string TokenSecret { get; set; }
  24. internal virtual string Verifier { get; set; }
  25. internal virtual string Version { get; set; }
  26. internal virtual string CallbackUrl { get; set; }
  27. internal virtual string SessionHandle { get; set; }
  28. internal virtual string ClientUsername { get; set; }
  29. internal virtual string ClientPassword { get; set; }
  30. public static OAuth1Authenticator ForRequestToken(string consumerKey, string consumerSecret)
  31. {
  32. var authenticator = new OAuth1Authenticator
  33. {
  34. ParameterHandling = OAuthParameterHandling.HttpAuthorizationHeader,
  35. SignatureMethod = OAuthSignatureMethod.HmacSha1,
  36. SignatureTreatment = OAuthSignatureTreatment.Escaped,
  37. ConsumerKey = consumerKey,
  38. ConsumerSecret = consumerSecret,
  39. Type = OAuthType.RequestToken
  40. };
  41. return authenticator;
  42. }
  43. public static OAuth1Authenticator ForRequestToken(string consumerKey, string consumerSecret, string callbackUrl)
  44. {
  45. var authenticator = ForRequestToken(consumerKey, consumerSecret);
  46. authenticator.CallbackUrl = callbackUrl;
  47. return authenticator;
  48. }
  49. public static OAuth1Authenticator ForAccessToken(string consumerKey, string consumerSecret, string token, string tokenSecret)
  50. {
  51. var authenticator = new OAuth1Authenticator
  52. {
  53. ParameterHandling = OAuthParameterHandling.HttpAuthorizationHeader,
  54. SignatureMethod = OAuthSignatureMethod.HmacSha1,
  55. SignatureTreatment = OAuthSignatureTreatment.Escaped,
  56. ConsumerKey = consumerKey,
  57. ConsumerSecret = consumerSecret,
  58. Token = token,
  59. TokenSecret = tokenSecret,
  60. Type = OAuthType.AccessToken
  61. };
  62. return authenticator;
  63. }
  64. public static OAuth1Authenticator ForAccessToken(string consumerKey, string consumerSecret, string token, string tokenSecret, string verifier)
  65. {
  66. var authenticator = ForAccessToken(consumerKey, consumerSecret, token, tokenSecret);
  67. authenticator.Verifier = verifier;
  68. return authenticator;
  69. }
  70. public static OAuth1Authenticator ForAccessTokenRefresh(string consumerKey, string consumerSecret, string token, string tokenSecret, string sessionHandle)
  71. {
  72. var authenticator = ForAccessToken(consumerKey, consumerSecret, token, tokenSecret);
  73. authenticator.SessionHandle = sessionHandle;
  74. return authenticator;
  75. }
  76. public static OAuth1Authenticator ForAccessTokenRefresh(string consumerKey, string consumerSecret, string token, string tokenSecret, string verifier, string sessionHandle)
  77. {
  78. var authenticator = ForAccessToken(consumerKey, consumerSecret, token, tokenSecret);
  79. authenticator.SessionHandle = sessionHandle;
  80. authenticator.Verifier = verifier;
  81. return authenticator;
  82. }
  83. public static OAuth1Authenticator ForClientAuthentication(string consumerKey, string consumerSecret, string username, string password)
  84. {
  85. var authenticator = new OAuth1Authenticator
  86. {
  87. ParameterHandling = OAuthParameterHandling.HttpAuthorizationHeader,
  88. SignatureMethod = OAuthSignatureMethod.HmacSha1,
  89. SignatureTreatment = OAuthSignatureTreatment.Escaped,
  90. ConsumerKey = consumerKey,
  91. ConsumerSecret = consumerSecret,
  92. ClientUsername = username,
  93. ClientPassword = password,
  94. Type = OAuthType.ClientAuthentication
  95. };
  96. return authenticator;
  97. }
  98. public static OAuth1Authenticator ForProtectedResource(string consumerKey, string consumerSecret, string accessToken, string accessTokenSecret)
  99. {
  100. var authenticator = new OAuth1Authenticator
  101. {
  102. Type = OAuthType.ProtectedResource,
  103. ParameterHandling = OAuthParameterHandling.HttpAuthorizationHeader,
  104. SignatureMethod = OAuthSignatureMethod.HmacSha1,
  105. SignatureTreatment = OAuthSignatureTreatment.Escaped,
  106. ConsumerKey = consumerKey,
  107. ConsumerSecret = consumerSecret,
  108. Token = accessToken,
  109. TokenSecret = accessTokenSecret
  110. };
  111. return authenticator;
  112. }
  113. public void Authenticate(IRestClient client, IRestRequest request)
  114. {
  115. var workflow = new OAuthWorkflow
  116. {
  117. ConsumerKey = ConsumerKey,
  118. ConsumerSecret = ConsumerSecret,
  119. ParameterHandling = ParameterHandling,
  120. SignatureMethod = SignatureMethod,
  121. SignatureTreatment = SignatureTreatment,
  122. Verifier = Verifier,
  123. Version = Version,
  124. CallbackUrl = CallbackUrl,
  125. SessionHandle = SessionHandle,
  126. Token = Token,
  127. TokenSecret = TokenSecret,
  128. ClientUsername = ClientUsername,
  129. ClientPassword = ClientPassword
  130. };
  131. AddOAuthData(client, request, workflow);
  132. }
  133. private void AddOAuthData(IRestClient client, IRestRequest request, OAuthWorkflow workflow)
  134. {
  135. var url = client.BuildUri(request).ToString();
  136. OAuthWebQueryInfo oauth;
  137. var method = request.Method.ToString().ToUpperInvariant();
  138. var parameters = new WebParameterCollection();
  139. // for non-GET style requests make sure params are part of oauth signature
  140. if (request.Method != Method.GET && request.Method != Method.DELETE)
  141. {
  142. foreach (var p in request.Parameters.Where(p => p.Type == ParameterType.GetOrPost))
  143. {
  144. parameters.Add(new WebPair(p.Name, p.Value.ToString()));
  145. }
  146. }
  147. switch (Type)
  148. {
  149. case OAuthType.RequestToken:
  150. workflow.RequestTokenUrl = url;
  151. oauth = workflow.BuildRequestTokenInfo(method, parameters);
  152. break;
  153. case OAuthType.AccessToken:
  154. workflow.AccessTokenUrl = url;
  155. oauth = workflow.BuildAccessTokenInfo(method, parameters);
  156. break;
  157. case OAuthType.ClientAuthentication:
  158. workflow.AccessTokenUrl = url;
  159. oauth = workflow.BuildClientAuthAccessTokenInfo(method, parameters);
  160. break;
  161. case OAuthType.ProtectedResource:
  162. oauth = workflow.BuildProtectedResourceInfo(method, parameters, url);
  163. break;
  164. default:
  165. throw new ArgumentOutOfRangeException();
  166. }
  167. switch (ParameterHandling)
  168. {
  169. case OAuthParameterHandling.HttpAuthorizationHeader:
  170. parameters.Add("oauth_signature", oauth.Signature);
  171. request.AddHeader("Authorization", GetAuthorizationHeader(parameters));
  172. break;
  173. case OAuthParameterHandling.UrlOrPostParameters:
  174. parameters.Add("oauth_signature", HttpUtility.UrlDecode(oauth.Signature));
  175. foreach (var parameter in parameters)
  176. {
  177. request.AddParameter(parameter.Name, parameter.Value);
  178. }
  179. break;
  180. default:
  181. throw new ArgumentOutOfRangeException();
  182. }
  183. }
  184. private string GetAuthorizationHeader(WebPairCollection parameters)
  185. {
  186. var sb = new StringBuilder("OAuth ");
  187. if (!Realm.IsNullOrBlank())
  188. {
  189. sb.Append("realm=\"{0}\",".FormatWith(OAuthTools.UrlEncodeRelaxed(Realm)));
  190. }
  191. parameters.Sort((l, r) => l.Name.CompareTo(r.Name));
  192. var parameterCount = 0;
  193. var oathParameters = parameters.Where(parameter =>
  194. !parameter.Name.IsNullOrBlank() &&
  195. !parameter.Value.IsNullOrBlank() &&
  196. parameter.Name.StartsWith("oauth_")
  197. ).ToList();
  198. foreach (var parameter in oathParameters)
  199. {
  200. parameterCount++;
  201. var format = parameterCount < oathParameters.Count ? "{0}=\"{1}\"," : "{0}=\"{1}\"";
  202. sb.Append(format.FormatWith(parameter.Name, parameter.Value));
  203. }
  204. var authorization = sb.ToString();
  205. return authorization;
  206. }
  207. }
  208. }