我目前正在向相当大的React / Redux / Express应用程序添加身份验证,但永远不会设置用户cookie。
我使用客户端会话来存储cookie,因为我无意创建数据库或类似存储(我尝试了快速会话实现,但不应使用默认存储适用于生产环境)。
据我所知,护照+客户端会话应该有效,只要客户端会话cookie的名称设置为" user",但什么都没有存储。但是,我不认为客户端会话是我当前的问题,因为即使Facebook登录成功返回(在返回时向URL添加一个大的/?code = verylongstring),passport.serializeUser也永远不会被解雇。/ p>
要么我忽略了一些细节,要么在React / Redux设置中隐藏了一个问题导致这种情况(例如,我在我的所有路线上都使用了React路由器,除了在例子如下)。
登录按钮非常简单:
<div><a href="/auth/facebook">Login with Facebook</a></div>
我已删除了server.jsx文件的绝大部分内容,但保留了相关代码:
/*
Lots of other imports
....
....
....
*/
import express from 'express';
import passport from 'passport';
import strategy from 'passport-facebook';
import sessions from 'client-sessions';
const app = express();
// Facebook strategy
passport.use(new strategy.Strategy({
clientID: process.env.CLIENT_ID,
clientSecret: process.env.CLIENT_SECRET,
callbackURL: 'http://localhost:8081/',
passReqToCallback: true
},
function(accessToken, refreshToken, profile, cb) {
return cb(null, profile);
}));
// Serialize passport user
passport.serializeUser(function(user, cb) {
console.log("SERIALIZE");
cb(null, user);
});
// Deserialize passport user
passport.deserializeUser(function(obj, cb) {
console.log("DESERIALIZE");
cb(null, obj);
});
// Client-sessions
app.use(sessions({
cookieName: 'user',
secret: 'thisisjustatest',
duration: 24 * 60 * 60 * 1000,
activeDuration: 1000 * 60 * 5
}));
// Facebook authentication paths
app.get('/auth/facebook', passport.authenticate('facebook'));
app.get('/auth/facebook/callback',
passport.authenticate('facebook', { successRedirect: '/',
failureRedirect: '/' }));
app.use(passport.initialize());
app.use(passport.session());
app.enable('trust proxy');
app.use((req, res) => {
console.log(req);
/*
A lot of code
....
....
....
*/
}
有什么建议吗?我知道自定义策略需要手动登录才能被调用,但我只使用Facebook策略,所以我在这里遇到了一些损失。
编辑:我怀疑它可能取决于应用程序如何分为前端(app.js)和后端(server.js)。不知道如何在没有相当大的重写的情况下绕过它。
答案 0 :(得分:0)
似乎我忘了仔细检查我的网址。解决方案非常简单:回调URL必须与护照回调相匹配,因此在这种情况下,它应该是http://localhost:8081/auth/facebook/callback。