我尝试使用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的重点是避免使用会话,不是吗?
答案 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];
}