-module(oauth). -export( [ get/5 , header/1 , post/5 , signature/5 , signature_base_string/3 , signed_params/6 , token/1 , token_secret/1 , uri/2 , verify/6 ]). get(URL, ExtraParams, Consumer, Token, TokenSecret) -> SignedParams = signed_params("GET", URL, ExtraParams, Consumer, Token, TokenSecret), oauth_http:get(uri(URL, SignedParams)). post(URL, ExtraParams, Consumer, Token, TokenSecret) -> SignedParams = signed_params("POST", URL, ExtraParams, Consumer, Token, TokenSecret), oauth_http:post(URL, oauth_uri:params_to_string(SignedParams)). uri(Base, []) -> Base; uri(Base, Params) -> lists:concat([Base, "?", oauth_uri:params_to_string(Params)]). header(Params) -> {"Authorization", "OAuth " ++ oauth_uri:params_to_header_string(Params)}. token(Params) -> proplists:get_value("oauth_token", Params). token_secret(Params) -> proplists:get_value("oauth_token_secret", Params). verify(Signature, HttpMethod, URL, Params, Consumer, TokenSecret) -> case signature_method(Consumer) of plaintext -> oauth_plaintext:verify(Signature, consumer_secret(Consumer), TokenSecret); hmac_sha1 -> BaseString = signature_base_string(HttpMethod, URL, Params), oauth_hmac_sha1:verify(Signature, BaseString, consumer_secret(Consumer), TokenSecret); rsa_sha1 -> BaseString = signature_base_string(HttpMethod, URL, Params), oauth_rsa_sha1:verify(Signature, BaseString, consumer_secret(Consumer)) end. signed_params(HttpMethod, URL, ExtraParams, Consumer, Token, TokenSecret) -> Params = token_param(Token, params(Consumer, ExtraParams)), [{"oauth_signature", signature(HttpMethod, URL, Params, Consumer, TokenSecret)}|Params]. signature(HttpMethod, URL, Params, Consumer, TokenSecret) -> case signature_method(Consumer) of plaintext -> oauth_plaintext:signature(consumer_secret(Consumer), TokenSecret); hmac_sha1 -> BaseString = signature_base_string(HttpMethod, URL, Params), oauth_hmac_sha1:signature(BaseString, consumer_secret(Consumer), TokenSecret); rsa_sha1 -> BaseString = signature_base_string(HttpMethod, URL, Params), oauth_rsa_sha1:signature(BaseString, consumer_secret(Consumer)) end. signature_base_string(HttpMethod, URL, Params) -> NormalizedURL = oauth_uri:normalize(URL), NormalizedParams = oauth_uri:params_to_string(lists:sort(Params)), oauth_uri:calate("&", [HttpMethod, NormalizedURL, NormalizedParams]). token_param("", Params) -> Params; token_param(Token, Params) -> [{"oauth_token", Token}|Params]. params(Consumer, Params) -> Nonce = base64:encode_to_string(crypto:rand_bytes(32)), % cf. ruby-oauth params(Consumer, oauth_unix:timestamp(), Nonce, Params). params(Consumer, Timestamp, Nonce, Params) -> [ {"oauth_version", "1.0"} , {"oauth_nonce", Nonce} , {"oauth_timestamp", integer_to_list(Timestamp)} , {"oauth_signature_method", signature_method_string(Consumer)} , {"oauth_consumer_key", consumer_key(Consumer)} | Params ]. signature_method_string(Consumer) -> case signature_method(Consumer) of plaintext -> "PLAINTEXT"; hmac_sha1 -> "HMAC-SHA1"; rsa_sha1 -> "RSA-SHA1" end. signature_method(_Consumer={_, _, Method}) -> Method. consumer_secret(_Consumer={_, Secret, _}) -> Secret. consumer_key(_Consumer={Key, _, _}) -> Key.