使用Facebook登录,Passport,Express,React和Node时没有设置用户cookie

时间:2017-04-28 13:17:28

标签: javascript reactjs express passport.js

我目前正在向相当大的React / Redux / Express应用程序添加身份验证,但永远不会设置用户cookie。

我使用客户端会话来存储cookie,因为我无意创建数据库或类似存储(我尝试了快速会话实现,但不应使用默认存储适用于生产环境)。

据我所知,护照+客户端会话应该有效,只要客户端会话cookie的名称设置为" user",但什么都没有存储。但是,我不认为客户端会话是我当前的问题,因为即使Facebook登录成功返回(在返回时向URL添加一个大的/?code = verylongstring),passport.serializeUser也永远不会被解雇。

要么我忽略了一些细节,要么在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)。不知道如何在没有相当大的重写的情况下绕过它。

1 个答案:

答案 0 :(得分:0)

似乎我忘了仔细检查我的网址。解决方案非常简单:回调URL必须与护照回调相匹配,因此在这种情况下,它应该是http://localhost:8081/auth/facebook/callback