oauth_request.erl 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. -module(oauth_request).
  2. -export([new/3, is_signed/1, sign/3]).
  3. -export([to_header/2, to_header/4, to_string/3, to_string/1, to_url/3, to_url/1]).
  4. new(Method, URL, Params) ->
  5. {Method, URL, Params}.
  6. is_signed(Request) ->
  7. proplists:is_defined(oauth_signature, params(Request)).
  8. sign(Request, Consumer, {Token, TokenSecret}) ->
  9. Params = oauth_params(Request, Consumer, Token),
  10. Signature = signature(Params, Request, Consumer, TokenSecret),
  11. setelement(3, Request, [{oauth_signature, Signature}|Params]).
  12. to_header(Realm, Request, Consumer, TokenPair) ->
  13. to_header(Realm, sign(Request, Consumer, TokenPair)).
  14. to_header(Realm, SignedRequest) ->
  15. HeaderString = oauth_params:to_header_string(params(SignedRequest)),
  16. HeaderValue = fmt:sprintf("OAuth realm=\"%s\", %s", [Realm, HeaderString]),
  17. {"Authorization", HeaderValue}.
  18. to_string(Request, Consumer, TokenPair) ->
  19. to_string(sign(Request, Consumer, TokenPair)).
  20. to_string(SignedRequest) ->
  21. oauth_params:to_string(params(SignedRequest)).
  22. to_url(Request, Consumer, TokenPair) ->
  23. to_url(sign(Request, Consumer, TokenPair)).
  24. to_url(SignedRequest) ->
  25. fmt:sprintf("%s?%s", [url(SignedRequest), to_string(SignedRequest)]).
  26. signature(Params, Request, Consumer, TokenSecret) ->
  27. ConsumerSecret = oauth_consumer:secret(Consumer),
  28. case oauth_consumer:signature_method(Consumer) of
  29. "PLAINTEXT" ->
  30. oauth_crypto:plaintext_signature(ConsumerSecret, TokenSecret);
  31. "HMAC-SHA1" ->
  32. BaseString = oauth_base:string(method(Request), url(Request), Params),
  33. oauth_crypto:hmac_signature(BaseString, ConsumerSecret, TokenSecret);
  34. {"RSA-SHA1", PrivateKey} ->
  35. BaseString = oauth_base:string(method(Request), url(Request), Params),
  36. oauth_crypto:rsa_signature(BaseString, PrivateKey)
  37. end.
  38. oauth_params(Request, Consumer, Token) ->
  39. set_consumer_key(params(Request), Consumer, Token).
  40. set_consumer_key(Params, Consumer, Token) ->
  41. Param = {oauth_consumer_key, oauth_consumer:key(Consumer)},
  42. set_signature_method([Param|Params], Consumer, Token).
  43. set_signature_method(Params, Consumer, Token) ->
  44. Method = oauth_consumer:signature_method_string(Consumer),
  45. set_token([{oauth_signature_method, Method}|Params], Token).
  46. set_token(Params, []) ->
  47. set_timestamp(Params);
  48. set_token(Params, Token) ->
  49. set_timestamp([{oauth_token, Token}|Params]).
  50. set_timestamp(Params) ->
  51. set_nonce([{oauth_timestamp, oauth_util:unix_timestamp()}|Params]).
  52. set_nonce(Params) ->
  53. set_version([{oauth_nonce, oauth_util:nonce()}|Params]).
  54. set_version(Params) ->
  55. [{oauth_version, "1.0"}|Params].
  56. method(_Request={Method, _, _}) ->
  57. Method.
  58. url(_Request={_, URL, _}) ->
  59. URL.
  60. params(_Request={_, _, Params}) ->
  61. Params.