node.js - 多次谷歌登录,路由问题
问题描述
您好,我正在编写一个 Web 应用程序,Node JS
我正在尝试将我的网站中的用户作为学生或讲师进行身份验证,我为每条路线定义了多个凭据,并且我定义了两个锚点,它们是:但不幸的是/auth/google/student
,/auth/google/instructor
只有第一条路线passport.js
会被调用用于回调。
我该如何解决这个问题并准确地告诉 express 调用哪条路线?
这是我的代码:
app.js
const express = require("express");
const cors = require("cors");
const env = require("./env");
const mysql = require("mysql");
const passport = require("passport");
const studentLoginGoogle = require("./studentLoginGoogle");
const instructorLoginGoogle = require("./instructorLoginGoogle");
const app = express();
app.use(passport.initialize());
app.use(passport.session());
app.use("/auth/google/instructor", instructorLoginGoogle);
app.use("/auth/google/student", studentLoginGoogle);
studentLoginGoogle.js:
const express = require("express");
const mysql = require("mysql");
const env = require("./env");
const cors = require("cors");
const passport = require("passport");
const GoogleStrategy = require("passport-google-oauth").OAuth2Strategy;
const FacebookStrategy = require("passport-facebook");
const app = express();
env.get();
const router = express.Router();
app.use(cors());
let userProfile;
passport.serializeUser(function (user, cb) {
cb(null, user);
});
passport.deserializeUser(function (obj, cb) {
cb(null, obj);
});
//authentication with google
passport.use(
new GoogleStrategy(
{
clientID: process.env.GOOGLE_CLIENT_ID_STUDENT,
clientSecret: process.env.GOOGLE_CLIENT_SECRET_STUDENT,
callbackURL: "http://localhost:3001/auth/google/student/callback",
},
function (accessToken, refreshToken, profile, done) {
userProfile = profile;
return done(null, userProfile);
}
)
);
router.get(
"/",
passport.authenticate("google", { scope: ["profile", "email"] })
);
router.get(
"/callback",
passport.authenticate("google", { failureRedirect: "/" }),
function (req, res) {
console.log(userProfile);
let sql = `SELECT user_name FROM students WHERE email="${userProfile.emails[0].value}"`;
con.query(sql, (err, result) => {
if (err) console.log(err);
if (result.length !== 0) {
res.send("you are validated as student ...");
} else {
let sql2 = `INSERT INTO students (first_name,last_name,email,user_name) VALUES ("${userProfile.name.givenName}","${userProfile.name.familyName}","${userProfile.emails[0].value}","${userProfile.displayName}")`;
con.query(sql2, (err, result) => {
if (err) console.log(err);
res.send("you are registered as student for this app");
});
}
});
}
);
module.exports = router;
instructorLoginGoogle.js:
const express = require("express");
const mysql = require("mysql");
const env = require("./env");
const cors = require("cors");
const passport = require("passport");
const GoogleStrategy = require("passport-google-oauth").OAuth2Strategy;
const FacebookStrategy = require("passport-facebook");
const app = express();
env.get();
const router = express.Router();
app.use(cors());
let userProfile;
passport.serializeUser(function (user, cb) {
cb(null, user);
});
passport.deserializeUser(function (obj, cb) {
cb(null, obj);
});
//authentication with google
passport.use(
new GoogleStrategy(
{
clientID: process.env.GOOGLE_CLIENT_ID_INSTRUCTOR,
clientSecret: process.env.GOOGLE_CLIENT_SECRET_INSTRUCTOR,
callbackURL: "http://localhost:3001/auth/google/instructor/callback",
},
function (accessToken, refreshToken, profile, done) {
userProfile = profile;
return done(null, userProfile);
}
)
);
router.get(
"/",
passport.authenticate("google", { scope: ["profile", "email"] })
);
router.get(
"/callback",
passport.authenticate("google", { failureRedirect: "/" }),
function (req, res) {
let sql = `SELECT user_name FROM instructors WHERE email="${userProfile.emails[0].value}"`;
con.query(sql, (err, result) => {
if (err) console.log(err);
if (result.length !== 0) {
res.send("you are validated as instructor ...");
} else {
let sql2 = `INSERT INTO instructors (first_name,last_name,email,user_name,gender,year_of_birth) VALUES ("${userProfile.name.givenName}","${userProfile.name.familyName}","${userProfile.emails[0].value}","${userProfile.displayName}","male",1990)`;
con.query(sql2, (err, result) => {
if (err) console.log(err);
res.send("you are registered as instructor for this app");
});
}
});
}
);
module.exports = router;
解决方案
/auth/google/callback
例如,我们可以有多个如下redirect urls
:
router.get('/auth/google/callback' , passport.use('google'), (req,res) => {
if(req. ...){
res.redirect('http://localhost:3000/....')
}
else{
res.redirect('....')
}
} )
类似上面的东西。
推荐阅读
- python - 在不同的 conda 环境中将 R 内核安装到 jupyter notebook
- c++ - 如何在txt文件(c ++ ifstream)中获取随机字符串?
- python - (Python tkinter):RuntimeError:主线程不在主循环中
- gpu - 在 grafana prometheus 中对 unix 时间戳求和
- java - 解组时找不到类:com.google.android.play.core.review.b
- javascript - 如何在不删除第一个“li”的情况下将“li”标签移动到另一个“ul”标签中?
- php - PHP:如何在 iframe 中使用不同域名的会话/cookie?
- entity-framework - Dotnet Core 5.0 - 实体框架 - 设计时迁移工作但完成时出错
- javascript - 使用 ElemMatch 更新 MongoDb
- opengl - 低分辨率帧缓冲区重复自身