From 8249a9d74bcc8195c48f64bd9d6e790953f9ce8e Mon Sep 17 00:00:00 2001 From: Moe Date: Sat, 3 Apr 2021 14:16:15 -0700 Subject: [PATCH] allow binding google auth with login screen --- libs/auth/google.js | 42 ++++++++++++++++++++++++++++++++---------- libs/auth/utils.js | 4 +++- libs/webServerPaths.js | 3 +-- 3 files changed, 36 insertions(+), 13 deletions(-) diff --git a/libs/auth/google.js b/libs/auth/google.js index 4848fb7f..7147c208 100644 --- a/libs/auth/google.js +++ b/libs/auth/google.js @@ -1,5 +1,8 @@ const {OAuth2Client} = require('google-auth-library'); module.exports = (s,config,lang) => { + const { + basicAuth, + } = require('./utils.js')(s,config,lang) const client = new OAuth2Client(config.appTokenGoogle); async function verifyToken(userLoginToken) { const ticket = await client.verifyIdToken({ @@ -25,7 +28,7 @@ module.exports = (s,config,lang) => { columns: '*', table: "LoginTokens", where: [ - ['loginId','=',user.id], + ['loginId','=',loginId], ] }) if(!searchResponse.rows[0]){ @@ -71,10 +74,12 @@ module.exports = (s,config,lang) => { return response } async function loginWithGoogleAccount(userLoginToken) { - const response = {ok: false} + const response = {ok: false, googleSignedIn: false} const tokenResponse = await verifyToken(userLoginToken) if(tokenResponse.ok){ const user = tokenResponse.user + response.googleSignedIn = true + response.googleUser = user const searchResponse = await s.knexQueryPromise({ action: "select", columns: '*', @@ -104,15 +109,32 @@ module.exports = (s,config,lang) => { } return response } - s.alternateLogins['google'] = async (loginToken) => { - const response = { ok: false } - const tokenVerifyResponse = await loginWithGoogleAccount(loginToken) - if(tokenVerifyResponse.user){ - response.ok = true - response.user = tokenVerifyResponse.user + s.onProcessReady(() => { + s.alternateLogins['google'] = async (params) => { + const response = { ok: false } + const loginToken = params.alternateLoginToken + const username = params.mail + const password = params.pass + const googleLoginResponse = await loginWithGoogleAccount(loginToken) + if(googleLoginResponse.user){ + response.ok = true + response.user = googleLoginResponse.user + }else if(config.allowBindingAltLoginsFromLoginPage && googleLoginResponse.googleSignedIn && username && password){ + const basicAuthResponse = await basicAuth(username,password) + if(basicAuthResponse.user){ + const user = basicAuthResponse.user + const loginId = googleLoginResponse.googleUser.id + const groupKey = user.ke + const userId = user.uid + const bindResponse = await bindLoginIdToUser(loginId,groupKey,userId) + response.ok = true + response.user = basicAuthResponse.user + } + } + return response } - return response - } + // s.customAutoLoadTree['LibsJs'].push(`dash2.googleSignIn.js`) + }) return { client: client, verifyToken: verifyToken, diff --git a/libs/auth/utils.js b/libs/auth/utils.js index 39661bdf..29035a8a 100644 --- a/libs/auth/utils.js +++ b/libs/auth/utils.js @@ -14,8 +14,10 @@ module.exports = function(s,config,lang){ limit: 1 },(err,r) => { if(!err && r && r[0]){ + const user = r[0] response.ok = true - response.user = r[0] + user.details = s.parseJSON(user.details) + response.user = user }else{ response.err = err } diff --git a/libs/webServerPaths.js b/libs/webServerPaths.js index 90beee5d..6878f9e1 100644 --- a/libs/webServerPaths.js +++ b/libs/webServerPaths.js @@ -355,7 +355,7 @@ module.exports = function(s,config,lang,app,io){ console.log(req.body) if(req.body.alternateLogin && s.alternateLogins[req.body.alternateLogin]){ const alternateLogin = s.alternateLogins[req.body.alternateLogin] - const alternateLoginResponse = await alternateLogin(req.body.alternateLoginToken) + const alternateLoginResponse = await alternateLogin(req.body) if(alternateLoginResponse.ok && alternateLoginResponse.user){ const user = alternateLoginResponse.user const sessionKey = s.md5(s.gid()) @@ -389,7 +389,6 @@ module.exports = function(s,config,lang,app,io){ const user = basicAuthResponse.user; const sessionKey = s.md5(s.gid()) user.auth = sessionKey - user.details = s.parseJSON(user.details) user.lang = s.getLanguageFile(user.details.lang) s.knexQuery({ action: "update",