angularjs - oauth 回调后 Passport session 消失

标签 angularjs node.js express ionic-framework passport.js

使用 Ionic、Angular、nodejs 等制作混合应用。

用户使用电子邮件和密码登录,然后想要向其帐户添加第 3 方身份验证。
它们被序列化到 session 中。
我们使用 Passport 检查他们是否获得了第三方授权,如果没有则派他们这样做。
当用户返回回调 URL 时,我们不再知道他们是谁,因为 req.session 未定义。

编辑:我一直在尝试简化代码以找到问题的根源。

// require everything and app.use them
// this is what I'm using for the session config
app.use(session({
    secret: 'thisIsASecret',
    resave: false,
    saveUninitialized: false,   
    cookie: {secure: true, maxAge: (4*60*60*1000)}
}));

var user = {  // simple user model for testing
    id: 1,
    username: 'username',
    password: 'password',
    oauthId: null
};

passport.serializeUser(function(user, done) {
    done(null, user.id);
});
passport.deserializeUser(function(id, done) {
    done(err, user);
});

// Local Passport
passport.use(new LocalStrategy(function(username, password, done) {
    return done(null, user);
}));
app.post('/login', passport.authenticate('local'), function(req, res) {
    console.log(req.session);  // Prints out session object with passport.user = 1
    res.end();
});

// oauth Passport
passport.use(new oauthStrategy({
    clientID: ****,
    clientSecret: ****,
    callbackURL: 'http://localhost:3000/auth/oauth/callback',
    passReqToCallback: true
}, function(req, accessToken, refreshToken, profile, done) {
    console.log(req.session);  // no passport object in session anymore
    return done(null, profile);
}));
app.get('/auth/oauth', passport.authorize('oauth'));
app.get('/auth/oauth/callback', passport.authorize('oauth'), function(req, res) {
    console.log(req.session);  // no passport object in session here either
    res.end();
});

登录后在客户端我使用这个,因为常规的 http 请求方法不起作用。

window.location.href = 'http://localhost:3000/auth/oauth';

编辑 2:Ionic 显然不允许 session 。因此,我发现您可以使用 state 参数发送带有 oauth 请求的 token ,该请求返回到回调,并使用它将 oauth 详细信息链接到用户的帐户。

app.get('auth/oauth/:token', function(req, res) {
    passport.authorize('oauth', {state: req.params.token});
});

唯一的问题是现在它不会重定向到第三方来授权他们。只是超时...

最佳答案

解决方案是使用这样的路由,其中​​ token 用于识别用户。

app.get('auth/oauth/:token', function(req, res, next) {
    passport.authorize('oauth', {state: req.params.token})(req, res, next);
});

然后, token 在回调 (req.query.state) 中可用,我们可以将新详细信息添加到现有的用户详细信息中。

关于angularjs - oauth 回调后 Passport session 消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36311529/

相关文章:

javascript - Express.js 无法使用异步等待从查询 mysql 获取结果

node.js - 使用 promises 在 Node.js + Express 中处理错误

node.js - 如何使用 Handlebars 更改 Express 中的默认布局?

javascript - Angular JS ng-repeat 显示 JSON 数据

javascript - 按钮不改变背景和文本的颜色

node.js - 来自 lambda 的 context.awsRequestId

node.js - 无法使用 Node.js 在 Mac OSX 上发送 UDP 广播

javascript - 如何在 AngularJS 中动态设置页面加载的标题标签?

javascript - 未检测到 Bootstrap 崩溃事件 hidden.bs.collapse

javascript - 运行一个 Promise.all 的 Promise.alls