如何在Sails.js中使用jsonwebtoken获取当前用户?
How to get the current user using jsonwebtoken in Sails.js?
我从几周前就开始使用 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。
我想存储当前用户,以便以后能够在某个控制器中使用它,而无需在每个控制器中重复相同的代码,例如助手或服务。
诀窍在于放置 next()
的位置。由于您正在进行异步调用,因此只有在数据库操作完成后,控制权才应转移到下一个策略/控制器。
您应将政策修改为:
User.findOne({id: token.id}).exec(function findOneCB(err, found){
if(err) next(err);
req.currentUser = found;
next();
});
并且您应该能够通过 req.currentUser
访问使用 isAuthorized
策略的控制器中的用户详细信息
如果
For example, when creating a comment, this comment should belongs to the current user.
你的意思是用户名、国家等某些属性,而不是验证后查询数据库,你可以选择做的是将这些附加属性发送到jwToken.issue 在 api/controllers/UsersController.js
例如。
jwToken.issue({
id: user.id,
username: user.name,
country: user.country
})
这有什么帮助,您可以保持 api/policies/isAuthorized.js
不变,并且在您将来使用的所有控制器中,您可以从 as
访问有效负载值
token.username or token.country
无需再次查询数据库,从而节省您宝贵的响应时间。
Beware however, of the data you choose to send in the token (you could also send {user:user} if you want to) however, as the secret key or hashing is not required to decrypt the payload as you can figure @ jwt.io , you might want to exercise restraint.
我从几周前就开始使用 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。
我想存储当前用户,以便以后能够在某个控制器中使用它,而无需在每个控制器中重复相同的代码,例如助手或服务。
诀窍在于放置 next()
的位置。由于您正在进行异步调用,因此只有在数据库操作完成后,控制权才应转移到下一个策略/控制器。
您应将政策修改为:
User.findOne({id: token.id}).exec(function findOneCB(err, found){
if(err) next(err);
req.currentUser = found;
next();
});
并且您应该能够通过 req.currentUser
isAuthorized
策略的控制器中的用户详细信息
如果
For example, when creating a comment, this comment should belongs to the current user.
你的意思是用户名、国家等某些属性,而不是验证后查询数据库,你可以选择做的是将这些附加属性发送到jwToken.issue 在 api/controllers/UsersController.js
例如。
jwToken.issue({
id: user.id,
username: user.name,
country: user.country
})
这有什么帮助,您可以保持 api/policies/isAuthorized.js
不变,并且在您将来使用的所有控制器中,您可以从 as
token.username or token.country
无需再次查询数据库,从而节省您宝贵的响应时间。
Beware however, of the data you choose to send in the token (you could also send {user:user} if you want to) however, as the secret key or hashing is not required to decrypt the payload as you can figure @ jwt.io , you might want to exercise restraint.