1
0
B Thibault 8 жил өмнө
parent
commit
5b6849c4bb

BIN
srv/public/btn_facebook_connect.png


+ 2 - 1
srv/public/login.css

@@ -1,4 +1,5 @@
 body { text-align: center; display: flex; }
 .services h1 { font-family: Lato; }
 .services { display: inline-block; border: 1px solid #e0e1e2; width: 250px; margin: auto; padding: 14px; }
-.services a { display: block; }
+.services a { display: block; margin: 5px 0; }
+.services a > * { width: 185px; height: 40px; }

+ 56 - 0
srv/src/facebookOAuth.js

@@ -0,0 +1,56 @@
+
+const FACEBOOK_OAUTH_TOKEN_URI = "https://graph.facebook.com/v2.9/oauth/access_token"
+    FACEBOOK_OAUTH_TOKEN_APP = "https://graph.facebook.com/oauth/access_token"
+    ,FACEBOOK_OAUTH_TOKEN_INFO = "https://graph.facebook.com/debug_token";
+
+const facebookConfig = require('../config.js').login.facebook
+    ,httpsRequest = require('./httpsRequest.js').httpsRequest
+    ,httpsPost = require('./httpsRequest.js').httpsPost
+;
+
+function getAppToken(cb) {
+    httpsRequest(FACEBOOK_OAUTH_TOKEN_APP
+        +"?client_id=" +facebookConfig.clientId
+        +"&client_secret=" +facebookConfig.clientSecret
+        +"&grant_type=client_credentials",
+        (status, resp) => {
+            if (status === 200 && resp && resp.access_token) {
+                cb(resp.access_token);
+            } else {
+                cb(null);
+            }
+    });
+}
+
+function getUserId(code, cb) {
+    httpsRequest(FACEBOOK_OAUTH_TOKEN_URI
+        +"?client_id=" +facebookConfig.clientId
+        +"&client_secret=" +facebookConfig.clientSecret
+        +"&redirect_uri=" +facebookConfig.redirect_uri
+        +"&code=" +code,
+    (status, resp) => {
+        if (status === 200 && resp && resp.access_token) {
+            getAppToken((appToken) => {
+                if (appToken) {
+                    httpsRequest(FACEBOOK_OAUTH_TOKEN_INFO +"?input_token="+resp.access_token +"&access_token=" +appToken,
+                    (status, resp) => {
+                        if (status === 200 && resp && resp.data && resp.data.user_id) {
+                            cb(resp.data.user_id);
+                        } else {
+                            cb(null);
+                        }
+                    });
+                } else {
+                    cb(null);
+                }
+            });
+        } else {
+            cb(null);
+        }
+    });
+}
+
+module.exports.FacebookOAuth = {
+    getUserId: getUserId
+};
+

+ 2 - 2
srv/src/googleOAuth.js

@@ -7,7 +7,7 @@ const googleConfig = require('../config.js').login.google
     ,httpsPost = require('./httpsRequest.js').httpsPost
 ;
 
-function getUserMail(code, cb) {
+function getUserId(code, cb) {
     httpsPost(GOOGLE_OAUTH_TOKEN_URI, {
         "client_id": googleConfig.clientId
         ,"client_secret": googleConfig.clientSecret
@@ -32,6 +32,6 @@ function getUserMail(code, cb) {
 }
 
 module.exports.GoogleOAuth = {
-    getUserMail: getUserMail
+    getUserId: getUserId
 };
 

+ 26 - 5
srv/template/login.js

@@ -2,6 +2,7 @@
 const config = require("../config.js")
     ,Slack = require("../src/slack.js").Slack
     ,GoogleOAuth = require("../src/googleOAuth.js").GoogleOAuth
+    ,FacebookOAuth = require("../src/facebookOAuth.js").FacebookOAuth
     ,slackManager = require("../src/slackManager.js").SlackManager
     ,accountManager = require("../src/accounts.js").accountManager
     ,templates = require('./_templates.js');
@@ -26,7 +27,7 @@ function checkTokens(service, req, cb) {
 
         case "google":
             if (req.urlObj.queryTokens.code) {
-                GoogleOAuth.getUserMail(req.urlObj.queryTokens.code, (id) => {
+                GoogleOAuth.getUserId(req.urlObj.queryTokens.code, (id) => {
                     if (id) {
                         console.log("from google id " +id);
                         var account = accountManager.fromGoogleIdAuth(id);
@@ -40,6 +41,22 @@ function checkTokens(service, req, cb) {
             }
         break;
 
+        case "facebook":
+            if (req.urlObj.queryTokens.code) {
+                FacebookOAuth.getUserId(req.urlObj.queryTokens.code[0], (id) => {
+                    if (id) {
+                        console.log("from facebook id " +id);
+                        var account = accountManager.fromFacebookIdAuth(id);
+                        cb(account);
+                    } else {
+                        cb(null);
+                    }
+                });
+            } else {
+                cb(null);
+            }
+        break;
+
         default:
             cb(null);
         break;
@@ -48,20 +65,24 @@ function checkTokens(service, req, cb) {
 
 function makeLoginPage() {
     const
-    slackUri = config.login.slack.endpoint
+    slackUri = config.login.slack.requestLoginUri
         +"?client_id=" +config.login.slack.clientId
         +"&scope=" +slackManager.getAuthScope().join(',')
         +"&redirect_uri=" +config.login.slack.redirect_uri,
-    googleUri = config.login.google.endpoint
+    googleUri = config.login.google.requestLoginUri
         +"?client_id=" +config.login.google.clientId
         +"&scope=" +(["openid", "email", "profile"]).join("%20")
         +"&redirect_uri=" +config.login.google.redirect_uri
-        +"&response_type=code";
+        +"&response_type=code"
+    facebookUri = config.login.facebook.requestLoginUri
+        +"?client_id=" +config.login.facebook.clientId
+        +"&redirect_uri=" +config.login.facebook.redirect_uri;
 
     return templates.header("Mimou - login", ["login.css"])
         +`<div class="services"><h1>Login</h1>`
-        +`<a href="${slackUri}"><img src="https://platform.slack-edge.com/img/sign_in_with_slack.png" srcset="https://platform.slack-edge.com/img/sign_in_with_slack.png 1x, https://platform.slack-edge.com/img/sign_in_with_slack@2x.png 2x" /></a>`
         +`<a href="${googleUri}"><img src="https://developers.google.com/identity/images/btn_google_signin_light_normal_web.png" alt="Sign in with Google" class="attempt-right"></a>`
+        +`<a href="${facebookUri}"><img src="${config.rootUrl}btn_facebook_connect.png" alt="Log in with facebook"/></a>`
+        +`<a href="${slackUri}"><img src="https://platform.slack-edge.com/img/sign_in_with_slack.png" srcset="https://platform.slack-edge.com/img/sign_in_with_slack.png 1x, https://platform.slack-edge.com/img/sign_in_with_slack@2x.png 2x" /></a>`
         +`</div>`
         +templates.footer();
 }