oauth回调后,Passport会话消失

时间:2016-03-30 14:14:54

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

使用Ionic,Angular,nodejs等制作混合应用程序

用户使用电子邮件和密码登录,然后想要在其帐户中添加第三方身份验证 它们被序列化为会话 如果他们获得第三方授权,我们会使用护照进行检查,如果没有,则发送给他们 当用户回到回调网址时,我们不知道他们是谁,因为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显然不允许进行会话。因此,我发现您可以使用state参数发送带有oauth请求的令牌,该请求返回到回调并使用该请求将oauth详细信息链接到用户的帐户。

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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