Browse Source

microsoft auth added by lrrr request

Maxim Sokhatsky 11 years ago
parent
commit
d76a4c94ec
5 changed files with 111 additions and 3 deletions
  1. 1 1
      include/avz.hrl
  2. 57 0
      priv/microsoft_sdk.dtl
  3. 1 0
      src/avz.erl
  4. 1 2
      src/facebook.erl
  5. 51 0
      src/microsoft.erl

+ 1 - 1
include/avz.hrl

@@ -1,7 +1,7 @@
 -record(struct, {lst=[]}).
 -record(struct, {lst=[]}).
 -define(AFTER_LOGIN, "/account").
 -define(AFTER_LOGIN, "/account").
 -define(LOGIN_PAGE, "/login").
 -define(LOGIN_PAGE, "/login").
--define(METHODS, [facebook,google,github,twitter]).
+-define(METHODS, [facebook,google,github,twitter,microsoft]).
 -define(API,[sdk/0,               % JavaScript for page embedding for JavaScript based login methods
 -define(API,[sdk/0,               % JavaScript for page embedding for JavaScript based login methods
              login_button/0,      % HTML Button for page embedding
              login_button/0,      % HTML Button for page embedding
              event/1,             % Page Event for HTTP redirect based login methods
              event/1,             % Page Event for HTTP redirect based login methods

+ 57 - 0
priv/microsoft_sdk.dtl

@@ -0,0 +1,57 @@
+<script>
+
+WL.init({ client_id: "{{client}}", redirect_uri: "{{redirect}}" });
+//WL.Event.subscribe("auth.login", onLogin);
+//WL.Event.subscribe("auth.sessionChange", onSessionChange);
+
+function microsoft_login2() {
+    var session = WL.getSession();
+    if (session) {
+        console.log("You are already signed in!");
+    } else {
+        WL.login({ scope: "wl.signin" });
+    }
+}
+
+function microsoft_login() {
+
+    WL.login({ "scope": "wl.basic" }).then(
+        function (response) {
+            showUserData();
+        },
+        function (response) {
+            log("Could not connect, status = " + response.status);
+        }
+    );
+
+}
+
+function showUserData() {
+    WL.api({ path: "/me", method: "GET" }).then(
+        function (response) {
+            winLogin(JSON.stringify(response));
+        },
+        function (response) {
+            log("API call failed: " + JSON.stringify(response.error).replace(/,/g, "\n"));
+        }
+    );
+}
+
+function onLogin() {
+    var session = WL.getSession();
+    if (session) {
+        console.log("You are signed in!");
+        console.log("{{event}}");
+    }
+}
+ 
+function onSessionChange() {
+    var session = WL.getSession();
+    if (session) {
+        winLogin(session);
+        console.log("Your session has changed.");
+        console.log(session);
+    }
+}
+
+</script>

+ 1 - 0
src/avz.erl

@@ -18,6 +18,7 @@ event(Ev) ->  error_logger:info_msg("Page Event ~p",[Ev]).
 
 
 api_event(plusLogin, Args, Term) -> google:api_event(plusLogin, Args, Term);
 api_event(plusLogin, Args, Term) -> google:api_event(plusLogin, Args, Term);
 api_event(fbLogin, Args, Term)   -> facebook:api_event(fbLogin, Args, Term);
 api_event(fbLogin, Args, Term)   -> facebook:api_event(fbLogin, Args, Term);
+api_event(winLogin, Args, Term)   -> microsoft:api_event(winLogin, Args, Term);
 api_event(Name, Args, Term)      -> error_logger:info_msg("Unknown API event: ~p ~p ~p",[Name, Args, Term]).
 api_event(Name, Args, Term)      -> error_logger:info_msg("Unknown API event: ~p ~p ~p",[Name, Args, Term]).
 
 
 login_user(User) -> wf:user(User), wf:redirect(?AFTER_LOGIN).
 login_user(User) -> wf:user(User), wf:redirect(?AFTER_LOGIN).

+ 1 - 2
src/facebook.erl

@@ -42,6 +42,5 @@ sdk() ->
     wf:wire(#api{name=setFbIframe, tag=fb}),
     wf:wire(#api{name=setFbIframe, tag=fb}),
     wf:wire(#api{name=fbAutoLogin, tag=fb}),
     wf:wire(#api{name=fbAutoLogin, tag=fb}),
     wf:wire(#api{name=fbLogin, tag=fb}),
     wf:wire(#api{name=fbLogin, tag=fb}),
-  [ #panel{id="fb-root"},
-    #dtl{bind_script=false, file="facebook_sdk", ext="dtl", folder="priv/static/js",
+  [ #dtl{bind_script=false, file="facebook_sdk", ext="dtl", folder="priv/static/js",
         bindings=[{appid, ?FB_APP_ID},{channelUrl, ?HTTP_ADDRESS ++ "/static/channel.html"} ] } ].
         bindings=[{appid, ?FB_APP_ID},{channelUrl, ?HTTP_ADDRESS ++ "/static/channel.html"} ] } ].

+ 51 - 0
src/microsoft.erl

@@ -0,0 +1,51 @@
+-module(microsoft).
+-author('Maxim Sokhatsku').
+-include_lib("avz/include/avz.hrl").
+-include_lib("n2o/include/wf.hrl").
+-include_lib("kvs/include/users.hrl").
+-compile(export_all).
+-export(?API).
+-define(CLIENT_ID, "000000004C0FEEB0").
+-define(REDIRECT_URI, "http://skyline.synrc.com:8000").
+
+api_event(_, Args, _)-> 
+    error_logger:info_msg("Args: ~p",[Args]),
+    JSArgs = string:tokens(Args,"\\\\"),
+    J = string:join(JSArgs,""),
+    error_logger:info_msg("J: ~p",[J]),
+    [_,_|K1] = J,
+    [_,_|K2] = lists:reverse(K1),
+    K = lists:reverse(K2),
+    error_logger:info_msg("K: ~p",[K]),
+    Struct = n2o_json:decode(K),
+    avz:login(microsoft, Struct#struct.lst).
+
+registration_data(Props, microsoft, Ori)->
+    error_logger:info_msg("Microsoft Login: ~p",[Props]),
+    Id = proplists:get_value(<<"id">>, Props),
+    Name = proplists:get_value(<<"name">>, Props),
+    GivenName = proplists:get_value(<<"first_name">>, Props),
+    FamilyName = proplists:get_value(<<"last_name">>, Props),
+    {Id, Ori#user{ display_name = proplists:get_value(<<"name">>, Props),
+                   email = email_prop(Props,microsoft),
+                   name = GivenName,
+                   surname = FamilyName,
+                   googleplus_id = Id,
+                   register_date = erlang:now(),
+                   sex = proplists:get_value(<<"gender">>, Props),
+                   status = ok }}.
+
+email_prop(Props, _) -> binary_to_list(proplists:get_value(<<"id">>, Props)) ++ "@microsoft.com".
+
+login_button()-> #panel{class=["btn-group"], body=
+    #link{id=microsoftbtn, class=[btn, "btn-microsoft", "btn-large"], 
+        body=[#i{class=["icon-microsoft", "icon-large"]}, <<"Microsoft">>],
+              actions= "$('#microsoftbtn').on('click', microsoft_login);" }}.
+
+event(_) -> ok.
+callback() -> ok.
+sdk() ->
+    wf:wire(#api{name=winLogin, tag=plus}),
+    #dtl{bind_script=false, file="microsoft_sdk", ext="dtl", folder="priv/static/js",
+        bindings=[{event, microsoft_login},{client, ?CLIENT_ID},{redirect, ?REDIRECT_URI}]}.
+