Javascript NodeJs-从JWT令牌检索用户信息?
节点和角度。我有一个MEAN stack身份验证应用程序,其中我在成功登录时设置JWT令牌,如下所示,并将其存储在控制器中的会话中。通过服务拦截器将JWT令牌分配给config.headers:Javascript NodeJs-从JWT令牌检索用户信息?,javascript,angularjs,node.js,jwt,Javascript,Angularjs,Node.js,Jwt,节点和角度。我有一个MEAN stack身份验证应用程序,其中我在成功登录时设置JWT令牌,如下所示,并将其存储在控制器中的会话中。通过服务拦截器将JWT令牌分配给config.headers: var token = jwt.sign({id: user._id}, secret.secretToken, { expiresIn: tokenManager.TOKEN_EXPIRATION_SEC }); return res.json({token:token});
var token = jwt.sign({id: user._id}, secret.secretToken, { expiresIn: tokenManager.TOKEN_EXPIRATION_SEC });
return res.json({token:token});
authservice.js拦截器(省略了requestError、response和responseError):
现在我想从令牌中获取登录用户的详细信息,我该怎么做?我试了以下方法,但没有成功。当我从Users.js文件记录错误时,它说“ReferenceError:headers未定义”
authController.js:
$scope.me = function() {
UserService.me(function(res) {
$scope.myDetails = res;
}, function() {
console.log('Failed to fetch details');
$rootScope.error = 'Failed to fetch details';
})
};
authService.js:
authServices.factory('UserService',['$http', function($http) {
return {
me:function() {
return $http.get(options.api.base_url + '/me');
}
}
}]);
Users.js(节点):
我是否也必须将令牌作为参数传递以检索用户详细信息?或者也将用户详细信息保存在单独的会话变量中?您正在使用两个回调调用函数
UserService.me
,尽管函数不接受任何参数。我想你要做的是:
$scope.me = function() {
UserService.me().then(function(res) {
$scope.myDetails = res;
}, function() {
console.log('Failed to fetch details');
$rootScope.error = 'Failed to fetch details';
});
};
另外,请注意,$http方法返回一个。确保您需要的不是$scope.myDetails=res.data
在Users.js文件中,您直接使用变量headers.authorization
,而它应该是req.header.authorization
:
var authorization = req.headers.authorization;
首先,使用Passport中间件进行用户授权处理是一个很好的实践。它承担了解析请求的所有繁琐工作,还提供了许多授权选项。 现在看一下Node.js代码。 您需要使用jwt方法验证和解析传递的令牌,然后通过从令牌中提取的id查找用户:
exports.me = function(req,res){
if (req.headers && req.headers.authorization) {
var authorization = req.headers.authorization.split(' ')[1],
decoded;
try {
decoded = jwt.verify(authorization, secret.secretToken);
} catch (e) {
return res.status(401).send('unauthorized');
}
var userId = decoded.id;
// Fetch the user by id
User.findOne({_id: userId}).then(function(user){
// Do something with the user
return res.send(200);
});
}
return res.send(500);
}
根据文档,您可以使用
request.user
。注意,我假设您正在使用passport和passport jwt。
这是可能的,因为身份验证上下文中的passport正在设置请求对象并填充用户属性。所以,只需访问该属性。你不需要做中间件 从请求数据中查找令牌:
const usertoken = req.headers.authorization;
const token = usertoken.split(' ');
const decoded = jwt.verify(token[1], 'secret-key');
console.log(decoded);
感谢您更正我的函数,尽管这也是一个问题,但我的主要问题是无法从config.headers检索令牌。你知道吗?对不起,错过了那个错误。现在查看答案以检查它是否已修复。:)已更正,但问题仍然存在。事实上,它在users.js中的if语句本身失败了。甚至都不进去。非常感谢!成功了。只需做一个简单的更改decoded=jwt.verify(authorization.split(“”)[1],secret.secretToken);因为我有持票人+代币作为我的代币。我发现使用JWT比使用passport更有优势。我关注这两个:和。请告知passport是否是一个好的选择。passport同样可以使用JWT。它只是为您提供了一个方便的身份验证过程的抽象。我的受保护方法的路由器代码如下所示:
app.get('/api/content',passport.authenticate('local-authentication',{session:false}),api.listContent)代码>我得到“jwt.verify不是一个函数”与您的解决方案您应该导入jwt库使此代码工作。
exports.me = function(req,res){
if (req.headers && req.headers.authorization) {
var authorization = req.headers.authorization.split(' ')[1],
decoded;
try {
decoded = jwt.verify(authorization, secret.secretToken);
} catch (e) {
return res.status(401).send('unauthorized');
}
var userId = decoded.id;
// Fetch the user by id
User.findOne({_id: userId}).then(function(user){
// Do something with the user
return res.send(200);
});
}
return res.send(500);
}
const usertoken = req.headers.authorization;
const token = usertoken.split(' ');
const decoded = jwt.verify(token[1], 'secret-key');
console.log(decoded);