首页 > 解决方案 > Passport Google Oauth 在登录时不会重定向到成功的路由

问题描述

我正在尝试按照教程使用 Passport.js 在我的 Express 应用程序中设置 Google Oauth。

server.js这是我在文件中定义的路线:

const passport = require("passport");
const express = require("express");
const app = express();
const cors = require("cors");
const bodyParser = require("body-parser");
const cookieSession = require("cookie-session");
require("./passport-setup");
app.use(cors());
// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }));

app.use(bodyParser.json());
app.use(
  cookieSession({
    name: "tuto-session",
    keys: ["key1", "key2"],
  })
);
app.use(passport.initialize()); //initialises passport js and auth process
app.use(passport.session()); //manage using sessions

const isLoggedIn = (req, res, next) => {
  if (req.user) {
    next();
  } else {
    res.sendStatus(401);
  }
};

app.get("/", (req, res) => res.send("Hello World! You're not logged in "));
// 1. You send your users to /google. This opens a google page, in passport-setup.js.
app.get(
  "/google",
  passport.authenticate("google", {
    scope: ["profile", "email"],
  })
);

app.get("auth/google/callback",
  passport.authenticate("google", { 
    successRedirect: '/good', 
    failureRedirect: "/failed" 
  }),
  function (req, res) {
    res.redirect("http://localhost:19006/good");
  }
);

app.get("/failed", (req, res) => res.send("You failed to log in!"));

app.get("/good", isLoggedIn, (req, res) =>
  res.send(`You logged in! Welcome ${req.user.email}`)
);

app.get("/logout", (req, res) => {
  req.session = null; // destroy session
  req.logout(); //logout from passport
  res.redirect("/"); //redirect to home.
});
app.listen(19006, () => console.log("Listening on port"));

server.js还 imports passport-setup.js,我在其中存储了以下配置:

const passport = require('passport')
const GoogleStrategy = require('passport-google-oauth20').Strategy
// it will take the user, and take user.id. This makes the user smaller. Each time I'm directed to a route, will take the cookie in the session, go to deserializeUser 
passport.serializeUser(function (user, done) {
  console.log("serialise user")
  done(null, user)
})

// this function takes the id, returns the user object.
passport.deserializeUser(function (user, done) {
  console.log("deserialise user")
  //User.findById(id, function (err, user) {
  done(null, user)
  //})
  // so we will have the user in req.user. But for the purpose of this tutorial, no db.
})
// this /google page will take clientID, client secret to authenticate.
passport.use(new GoogleStrategy({
  clientID: 'MY_CLIENT_ID',
  clientSecret: 'MY_CLIENT_SECRET',
  callbackURL: "http://localhost:19006/auth/google/callback",
  passReqToCallback: true,
},
  function (accessToken, refreshToken, profile, done) {
      return done(null, profile)
  }
))

当我启动我的应用程序时,我会转到localhost:19006/google,这会将我重定向到 Google Oauth 的登录页面。但是我被重定向到这个链接:http://localhost:19006/auth/google/callback?code=4%2F3AGyrRpoCivQNr2-7sXZDQETVzNi9JvxaOORhTmaAZoQjIHNPAf8nWqgBFkzrVprwhUF4qMo40ljxiGZLsBLn7U&scope=email+profile+https%3A%2F%2F%www.googleinfo.googleinfo. profile+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+openid&authuser=0&prompt=consent#

我还收到一个 404 错误代码,页面显示“无法获取 /auth/google/callback”。

我检查了快速路线并定义了该路线,所以我不明白为什么应用程序没有显示此页面。我尝试将 console.log 消息添加到以下函数:

// this /google page will take clientID, client secret to authenticate.
passport.use(new GoogleStrategy({
  clientID: 'MY_CLIENT_ID',
  clientSecret: 'MY_CLIENT_SECRET',
  callbackURL: "http://localhost:19006/auth/google/callback",
  passReqToCallback: true,
},
  function (accessToken, refreshToken, profile, done) {
   //added a console.log here
      return done(null, profile)
  }

app.get("/", (req, res) => res.send("Hello World! You're not logged in "));
// 1. You send your users to /google. This opens a google page, in passport-setup.js.
app.get(
  "/google",
  passport.authenticate("google", {
    scope: ["profile", "email"],
  })
);

app.get("auth/google/callback",
  passport.authenticate("google", { 
    successRedirect: '/good', 
    failureRedirect: "/failed" 
  }),
  function (req, res) {
// added console.log here
    res.redirect("http://localhost:19006/good");
  }
);

但是我的控制台最终没有记录任何内容。

我试过的

在 Google Developer Console 中,我使用以下字段设置 Web 应用程序的客户端 ID: 凭据图像

我已经尝试在我的代码和 Google Developer Screen 中的路由中替换localhost127.0.0.1但它不起作用。

标签: javascriptexpresspassport.jsgoogle-oauth

解决方案


你错过了 ”/”

app.get("/auth/google/callback",
  passport.authenticate("google", { 
    successRedirect: '/good', 
    failureRedirect: "/failed" 
  }),

推荐阅读