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/一切正常。我可以进行注册、登录,然后正确地使用令牌进行不同的操作。

现在,我想在某些操作中使用登录用户,例如设计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。

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

4

2 回答 2

4

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

您应该将策略修改为:

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

您应该能够通过以下方式访问使用isAuthorized策略的控制器中的用户详细信息req.currentUser

于 2016-01-31T08:07:49.880 回答
0

如果通过

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

您的意思是某些属性,例如用户名和国家/地区等,而不是在验证后查询数据库,您可以选择将这些附加属性发送到jwToken.issueapi/controllers/UsersController.js

例如。

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

这有什么帮助,您可以保持api/policies/isAuthorized.js原样,并且在您将来使用的所有控制器中,您可以从 as

token.username or token.country

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

但是请注意,您选择在令牌中发送的数据(如果您愿意,您也可以发送 {user:user}),因为解密有效负载不需要密钥或散列,正如您可以想象的@jwt。 io,你可能想保持克制。

于 2017-04-27T08:48:05.147 回答