将护照openID-stategy与JWT结合起来

时间:2015-09-29 12:55:23

标签: node.js authentication express passport.js jwt

我尝试使用openID(passport-steam)使用passport.js进行身份验证时遇到问题,然后使用令牌(JWT)代替会话。

我目前的代码如下:

app.post('/auth/steam', passport.authenticate('steam'));

app.get('/auth/steam/return',
  passport.authenticate('steam', { failureRedirect: '/', session: false }),
  function(req, res) {
    var token = jwt.encode({ useridentifier: req.user.identifier}, tokenSecret);

    res.redirect('/');
  });

然而,我遇到的问题是:我应该如何将令牌传回客户端?由于这是从Steam网站回来后运行的GET请求,我无法用简单的回复

res.json(token)
像我一样,人们看到人们和JWT一起使用本地策略。

我设法提出的唯一解决方案涉及使用包含令牌的会话(例如connect-flash),并在将客户端重定向到&#后通过REST API将其传达给客户端39; /',但使用JWT的重点是避免使用会话,不是吗?

1 个答案:

答案 0 :(得分:3)

经过多天思考而没有到达任何地方,我设法找到另一种方法来解决它,使用cookie。

我发现了护照提供的自定义回调,我可以在其中设置响应的标题,所以我在重定向之前设置了这样的一个:

app.get('/auth/steam', passport.authenticate('steam'));

app.get('/auth/steam/return', 
  function(req, res, next) {
    passport.authenticate('steam', function(err, user, info){ 
      var payload = {
        user: user.identifier
      };

      var token = jwt.sign(payload, "thisisnotthesecretiactuallyuse", {expiresIn : 60*60*24});
      res.cookie('token', token, { httpOnly: true /* TODO: Set secure: true */ }); 

      res.redirect('/'); 
    })(req, res, next)
  });

(还不安全,因为我只在本地服务器上进行测试)

这就是现在整个代码的样子:

- (void)viewDidLoad {
    [super viewDidLoad];

    UILabel *player1 = [[UILabel alloc]initWithFrame:CGRectMake(35, 120,130, 30)];
    [player1 setText:@"Player"];
    player1.layer.borderWidth = 1.0;
    player1.layer.borderColor = [UIColor blackColor].CGColor;
     player1.textAlignment = UITextAlignmentCenter;
    [self.view addSubview: player1];

    UIButton *score1 = [[UIButton alloc]initWithFrame:CGRectMake(165, 120, 60, 30)];
    [score1 setTitle:@"0" forState:UIControlStateNormal];
    score1.layer.borderWidth = 1.0;
    score1.layer.borderColor = [UIColor blackColor].CGColor;
    [self.view addSubview: score1];


    UILabel *player2 = [[UILabel alloc]initWithFrame:CGRectMake(35, 150, 130, 30)];
    [player2 setText:@"Opponent"];
    player2.layer.borderWidth = 1.0;
    player2.layer.borderColor = [UIColor blackColor].CGColor;
    player2.textAlignment = UITextAlignmentCenter;
    [self.view addSubview: player2];
}