web-dev-qa-db-ja.com

JWTが「JWT不正な形式」をデコードしない-Node Angular

ログインすると、JSONWebトークンをクライアント側に送信します。 JSONWebトークンをサーバー側に送り返すカスタムauthInterceptorがあります。

ログインすると、すべてが機能します。別のサブページに移動し、うまく機能します。これは、パスポート認証またはトークン認証のいずれかをチェックする機能があり、ログインするとパスポート認証が機能するためです。

ブラウザを閉じてサイトに戻ると、JWTはデコードできません。 JWTは、エンコード機能のすぐ下に配置されたときにデコードできます。 jwt-simpleノードモジュールとjsonwebtokenノードモジュールの両方を試しましたが、同じエラーが返されます。

これは、有効なトークンをチェックする私のカスタム関数です。

_function checkAuthentication(req, res, next){
  if (!req.headers.authorization) {
     return res.status(401).send({ message: 'Please make sure your request has an Authorization header' });
  }
  console.log("Here");
  var token = req.headers.authorization.split('.')[1];
  console.log(token);
  console.log(config.secret);
  var payload = null;
  try {
    console.log("And here....");
    payload = jwt.decode(token, config.secret);
    console.log(payload);
  }
  catch (err) {
    console.log(err);
    return false;
  }

  if (payload.exp <= moment().unix()) {
    return false;
  }
  req.user = payload.sub;
  return true;
}
_

jwt-simpleはjwt.encode()と_jwt.decode_を使用し、jsonwebtokenはjwt.sign()jwt.verify()を使用します。これは私が私のコンソールで得るものです:

_Here
eyJzdWIiOiI1NmEyZDk3MWQwZDg2OThhMTYwYTBkM2QiLCJleHAiOjE0NTYxOTEyNzQsImlhdCI6MTQ1NTMyNzI3NH0
VerySecretPhrase
And here....
{ [JsonWebTokenError: jwt malformed] name: 'JsonWebTokenError', message: 'jwt malformed' } 
_

これは、クライアント側のauthInterceptorです。トークンを収集し、リクエストヘッダーに設定します。

_app.factory('httpInterceptor', function($q, $store, $window) {
return {
    request: function (config){
        config.headers = config.headers || {};
        if($store.get('token')){
            var token = config.headers.Authorization = 'Bearer ' + $store.get('token');
        }
        return config;
    },
    responseError: function(response){
        if(response.status === 401 || response.status === 403) {
            $window.location.href = "http://localhost:3000/login";
        }
        return $q.reject(response);
    }
};
});
_
4
Les Paul

あなたがそれを理解してくれてうれしいです!後世のための問題は次のとおりでした:JWTは、ヘッダー、ペイロード、および署名の3つのコンポーネントで構成されています( このトップの投稿に適切で詳細な説明があります )。 JWTをvar token = req.headers.authorization.split('.')でコンポーネントに分割していました。これは、tokenに割り当てた値が、完全なJWTではなくペイロードのみを参照していました。

Jwt-simpleデコードメソッドは完全なトークンを想定しており、評価するペイロードのみを与えていたため、コードが「jwtmalformed」エラーをトリガーしていました。あなたの場合、Authorizationヘッダーでトークンの前にBearerを付けたので、代わりにvar token = req.headers.authorization.split(' ')で完全なトークンを取得できます。

9
Bennett Adams