ログインすると、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);
}
};
});
_
あなたがそれを理解してくれてうれしいです!後世のための問題は次のとおりでした:JWTは、ヘッダー、ペイロード、および署名の3つのコンポーネントで構成されています( このトップの投稿に適切で詳細な説明があります )。 JWTをvar token = req.headers.authorization.split('.')
でコンポーネントに分割していました。これは、token
に割り当てた値が、完全なJWTではなくペイロードのみを参照していました。
Jwt-simpleデコードメソッドは完全なトークンを想定しており、評価するペイロードのみを与えていたため、コードが「jwtmalformed」エラーをトリガーしていました。あなたの場合、Authorizationヘッダーでトークンの前にBearer
を付けたので、代わりにvar token = req.headers.authorization.split(' ')
で完全なトークンを取得できます。