web-dev-qa-db-ja.com

NodeJs-JWTトークンからユーザー情報を取得しますか?

ノードと角度。次のようにログイン成功時にJWTトークンを設定し、それをコントローラーのセッションに保存するMEANスタック認証アプリケーションがあります。サービスインターセプターを介して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を省略):

authServices.factory('TokenInterceptor', ['$q', '$window', '$location','AuthenticationService',function ($q, $window, $location, AuthenticationService) {
        return {
            request: function (config) {
                config.headers = config.headers || {};
                if ($window.sessionStorage.token) {
                    config.headers.Authorization = 'Bearer ' + $window.sessionStorage.token;
                }
                return config;
            }               
        };
    }]);

ログインしたユーザーの詳細をトークンから取得したいのですが、どうすればいいですか?私は次のように試しましたが、動作しませんでした。 Users.jsファイルからエラーを記録すると、「ReferenceError:headers is not defined」と表示されます

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(ノード):

 exports.me = function(req,res){
    if (req.headers && req.headers.authorization) {
        var authorization =req.headers.authorization;
        var part = authorization.split(' ');
        //logic here to retrieve the user from database
    }
    return res.send(200);
}

ユーザーの詳細を取得するためにも、トークンをパラメーターとして渡す必要がありますか?または、ユーザーの詳細を別のセッション変数に保存しますか?

15
Sri7

まず、ユーザー認証の処理に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);
}
26

リクエストデータからトークンを見つける:

const usertoken = req.headers.authorization;
const token = usertoken.split(' ');
const decoded = jwt.verify(token[1], 'secret-key');
console.log(decoded);
5
Ajay yadav

2つのコールバックで関数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;
2
Pedro M. Silva

ドキュメントによると https://github.com/themikenicholson/passport-jwt を使用すると、request.user。注、passport-jwtでパスポートを使用していると仮定しています。認証のコンテキスト中のパスポートが要求オブジェクトを設定し、ユーザープロパティを設定しているため、可能です。したがって、そのプロパティにアクセスするだけです。ミドルウェアを実行する必要はありません。

0