|
@@ -2,6 +2,8 @@
|
|
|
|
|
|
-export([base_string/3, normalize/1, signature/3]).
|
|
-export([base_string/3, normalize/1, signature/3]).
|
|
|
|
|
|
|
|
+-import(fmt, [percent_encode/1]).
|
|
|
|
+
|
|
|
|
|
|
signature({Method, URL, Params}, ConsumerSecret, TokenSecret) ->
|
|
signature({Method, URL, Params}, ConsumerSecret, TokenSecret) ->
|
|
signature(base_string(Method, URL, Params), ConsumerSecret, TokenSecret);
|
|
signature(base_string(Method, URL, Params), ConsumerSecret, TokenSecret);
|
|
@@ -9,7 +11,8 @@ signature(BaseString, ConsumerSecret, TokenSecret) ->
|
|
b64(crypto:sha_mac(key(ConsumerSecret, TokenSecret), BaseString)).
|
|
b64(crypto:sha_mac(key(ConsumerSecret, TokenSecret), BaseString)).
|
|
|
|
|
|
base_string(Method, URL, Params) when is_list(Method) ->
|
|
base_string(Method, URL, Params) when is_list(Method) ->
|
|
- string:join(lists:map(fun fmt:percent_encode/1, [Method, oauth_uri:normalize(URL), normalize(Params)]), "&").
|
|
|
|
|
|
+ Unencoded = [Method, oauth_uri:normalize(URL), normalize(Params)],
|
|
|
|
+ string:join([percent_encode(Str) || Str <- Unencoded], "&").
|
|
|
|
|
|
normalize(Params) ->
|
|
normalize(Params) ->
|
|
StringParams = lists:map(fun({K, V}) when is_atom(K) -> {atom_to_list(K), V}; (I) -> I end, Params),
|
|
StringParams = lists:map(fun({K, V}) when is_atom(K) -> {atom_to_list(K), V}; (I) -> I end, Params),
|
|
@@ -19,7 +22,7 @@ sort(Params) ->
|
|
lists:sort(fun({K,X},{K,Y}) -> X < Y; ({A,_},{B,_}) -> A < B end, Params).
|
|
lists:sort(fun({K,X},{K,Y}) -> X < Y; ({A,_},{B,_}) -> A < B end, Params).
|
|
|
|
|
|
key(ConsumerSecret, TokenSecret) ->
|
|
key(ConsumerSecret, TokenSecret) ->
|
|
- fmt:sprintf("%s&%s", [fmt:percent_encode(ConsumerSecret), fmt:percent_encode(TokenSecret)]).
|
|
|
|
|
|
+ fmt:sprintf("%s&%s", [percent_encode(ConsumerSecret), percent_encode(TokenSecret)]).
|
|
|
|
|
|
b64(Data) ->
|
|
b64(Data) ->
|
|
base64:encode_to_string(Data).
|
|
base64:encode_to_string(Data).
|