Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript NodeJs-从JWT令牌检索用户信息?_Javascript_Angularjs_Node.js_Jwt - Fatal编程技术网

Javascript NodeJs-从JWT令牌检索用户信息?

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});

节点和角度。我有一个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});
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);