如何在Sails.js中使用jsonwebtoken获取当前用户?

5

我几周前开始使用Sails,之前我使用的是Rails,没有使用Node.js的经验。

现在我正在尝试使用jsonwebtoken创建一个强大的令牌身份验证。 https://github.com/auth0/node-jsonwebtoken

我遵循了这个指南http://thesabbir.com/how-to-use-json-web-token-authentication-with-sails-js/,一切都很顺利。 我能够进行注册、登录,然后正确地使用令牌进行不同的操作。

现在,有些操作需要使用登录用户,类似于devise中的current_user助手。 例如,在创建评论时,此评论应属于当前用户。

使用Sabbir Ahmed的指南,在isAuthorized.js策略的第33行解密令牌,因此我可以从那里获取当前用户ID。

所以,我的问题是,获取当前用户并能够稍后在某个控制器中使用它的最佳方法是什么? 例如,我尝试了以下内容:

# isAuthorized.js line 34, after getting decrypted token
User.findOne({id: token.id}).exec(function findOneCB(err, found){
    currentUser = found;
});

然而,由于这是异步操作,所以我不能在控制器中使用此currentUser。

我想存储当前用户,以便稍后可以在某些控制器中使用它,而无需在每个控制器中重复相同的代码,类似于帮助程序或服务。

2个回答

4
窍门在于您放置next()的位置。由于您正在进行异步调用,因此只有在完成数据库操作后,控制权才应转移到下一个策略/控制器。

您应修改策略为:

User.findOne({id: token.id}).exec(function findOneCB(err, found){
    if(err) next(err);
    req.currentUser = found;
    next();
});

你应该能够通过 req.currentUser 访问使用 isAuthorized 策略的控制器中的用户详细信息。


0

如果您的意思是某些属性,如用户名、国家等,在验证后而不是查询数据库后进行操作,您可以选择将这些附加属性发送到 jwToken.issue 中在 api/controllers/UsersController.js 中进行操作。

例如,创建评论时,该评论应属于当前用户。

例如:


jwToken.issue({ 
    id: user.id,
    username: user.name,
    country: user.country
    })

这有助于你保持api/policies/isAuthorized.js不变,在将来使用的所有控制器中,你可以访问作为负载值的变量。

token.username or token.country

不必再次查询数据库,从而节省宝贵的响应时间。

然而,请注意您选择发送到令牌中的数据(如果您想,也可以发送{user: user}),因为解密有效负载并不需要秘密密钥或哈希,如您可以在 jwt.io 中了解到的那样,您可能需要克制一下。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接