Browse Source

Add Google contacts example.

Tim Fletcher 16 years ago
parent
commit
44de303f49
2 changed files with 46 additions and 4 deletions
  1. 10 4
      Makefile
  2. 36 0
      test/oauth_google.erl

+ 10 - 4
Makefile

@@ -2,7 +2,7 @@ SOURCE_FILES := $(wildcard src/*.erl)
 
 ERLC := erlc -W +debug_info -o ebin
 
-ERL := erl -pa ebin -pa ../erlang-fmt/ebin -s crypto
+ERL := erl -pa ebin -pa ../erlang-fmt/ebin -s crypto -s inets -s ssl
 
 
 all: beam_files
@@ -19,6 +19,9 @@ ebin/oauth_unit.beam: test/oauth_unit.erl
 ebin/oauth_termie.beam: test/oauth_termie.erl
 	$(ERLC) test/oauth_termie.erl
 
+ebin/oauth_google.beam: test/oauth_google.erl
+	$(ERLC) test/oauth_google.erl
+
 clean:
 	rm -rf ebin/*.beam erl_crash.dump
 
@@ -26,13 +29,16 @@ test: beam_files ebin/oauth_unit.beam
 	@$(ERL) -noshell -s oauth_unit test -s init stop
 
 termie_hmac: beam_files ebin/oauth_termie.beam
-	@$(ERL) -noshell -s inets -s oauth_termie test_hmac -s init stop
+	@$(ERL) -noshell -s oauth_termie test_hmac -s init stop
 
 termie_rsa: beam_files ebin/oauth_termie.beam
-	@$(ERL) -noshell -s inets -s oauth_termie test_rsa -s init stop
+	@$(ERL) -noshell -s oauth_termie test_rsa -s init stop
+
+google: beam_files ebin/oauth_google.beam
+	@$(ERL) -noshell -s oauth_google test -s init stop
 
 shell: beam_files
-	@$(ERL) -s inets
+	@$(ERL)
 
 dialyzer:
 	dialyzer --no_check_plt --src -c src/

+ 36 - 0
test/oauth_google.erl

@@ -0,0 +1,36 @@
+-module(oauth_google).
+
+-compile(export_all).
+
+-include_lib("xmerl/include/xmerl.hrl").
+
+% cf. http://groups.google.com/group/oauth/msg/0cf50121f946a889
+
+
+test() ->
+  SignatureMethod = {"RSA-SHA1", "test/rsa_private_key.pem"},
+  get_request_token(oauth_consumer:new("weitu.googlepages.com", "x", SignatureMethod)).
+
+get_request_token(Consumer) ->
+  RequestTokenURL = "https://www.google.com/accounts/OAuthGetRequestToken",
+  Params = [{scope, "http://www.google.com/m8/feeds"}],
+  Response = oauth:get(RequestTokenURL, Consumer, Params),
+  authorize_token(Consumer, tee("RequestTokenPair: ", oauth_token_pair:new(Response))).
+
+authorize_token(Consumer, RequestTokenPair={RequestToken, _}) ->
+  AuthorizeTokenURL = "https://www.google.com/accounts/OAuthAuthorizeToken",
+  Params = [{oauth_token, RequestToken}],
+  Prompt = fmt:sprintf("Please authorize at %s?%s~n", [AuthorizeTokenURL, oauth_params:to_string(Params)]),
+  io:get_line(Prompt),
+  get_access_token(Consumer, RequestTokenPair).
+
+get_access_token(Consumer, RequestTokenPair) ->
+  AccessTokenURL = "https://www.google.com/accounts/OAuthGetAccessToken",
+  AccessTokenPair = tee("AccessTokenPair: ", oauth_token_pair:new(oauth:get(AccessTokenURL, Consumer, RequestTokenPair))),
+  {ok, {_, _, Data}} = oauth:get("http://www.google.com/m8/feeds/contacts/default/base", Consumer, AccessTokenPair),
+  {XML, _} = xmerl_scan:string(Data),
+  Titles = [Node#xmlText.value || Node <- xmerl_xpath:string("//feed/entry/title/text()", XML)],
+  lists:foreach(fun(Title) -> io:format("~s~n", [Title]) end, Titles).
+
+tee(Tag, X) ->
+  io:format("~s: ~p~n~n", [Tag, X]), X.