首页 > 解决方案 > 多次谷歌登录,路由问题

问题描述

您好,我正在编写一个 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;

标签: node.jspassport.jsgoogle-oauthpassport-google-oauth

解决方案


/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('....')
  }
 } )

类似上面的东西。


推荐阅读