javascript - 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 中的路由中替换localhost
,127.0.0.1
但它不起作用。
解决方案
你错过了 ”/”
app.get("/auth/google/callback",
passport.authenticate("google", {
successRedirect: '/good',
failureRedirect: "/failed"
}),
推荐阅读
- python - 敌人的射手 2 次而不是 1 次。但我只想击落 1 颗子弹而不是 2 次
- scala - Spark Streaming 1.6 + Kafka:处于“排队”状态的批次过多
- apache-spark - 在 Spark Structured Streaming 中计算写入 Hive 表的记录数
- sql - 相同条件下除最新数据外的查询更新
- c# - 使用 PDF 元数据来识别使用 C# 的文件
- ruby - 在 Ruby 中通过 rspec 测试
- c - 将一个字符串中的一个字符添加到另一个字符串的末尾 (strcat)
- sql - IgniteRDD SQL 表名
- excel - 粘贴过滤表
- c# - 使用多线程并从不同的任务返回不同的类型