2015-10-24 36 views
8

私はこれで少し悩まされています。私は有効なJWTを設定しようとしています。私はjsonwebtokenミドルウェアでnode.jsを使用しています。私はレポ(located here)にある文書に従ってきましたが、私は間違ったExpとIatを得続けます。明らかに、私はJWTが期限切れになっていないようにこの権利を取得したいと思います。JWTのExpとIatを正しく設定できません

私は、次のコードを持ってテストしたよう:

var token = jwt.sign({"id": user._id}, configGeneral.JWT, { expiresIn: '1h' }); 

var decoded = jwt.decode(token, configGeneral.JWT); 

var d1 = new Date(decoded.exp); 
var d2 = new Date(decoded.iat); 

console.log(decoded); 
console.log(d1); 
console.log(d2); 

これの出力は次のとおりです。私は、タイムスタンプはjavascriptのエポックではなく、時間を反映していないことを得るにはどうすればよい

{ id: '56253091fe0397c80133f3e4', 
    iat: 1445714161, 
    exp: 1445717761 } 
Sat Jan 17 1970 19:35:17 GMT+0200 (South Africa Standard Time) 
Sat Jan 17 1970 19:35:14 GMT+0200 (South Africa Standard Time) 

今から1時間? (IATとEXPの両方のために。)

答えて

2

正しい有効期限を示します。前回のミス対の変化を追跡するために

(私の元の要件は、将来的には1時間だった)、私はここに、上記のコードは更新されません、私は変更するものである:

var d = new Date(); 

var calculatedExpiresIn = (((d.getTime()) + (60 * 60 * 1000)) - (d.getTime() - d.getMilliseconds())/1000); 

var token = jwt.sign({"id": user._id}, configGeneral.JWT, { expiresIn: calculatedExpiresIn }); 

console.logには、Extが私の望むように、今+ 1時間で表示されます。

正しい日付を表示するには(sign関数で設定してからdecode関数で健全性チェックを行った後)、ペイロードの一部として設定する必要がありました。

{ id: '56253091fe0397c80133f3e4', 
    iat: 1445763099706, 
    exp: 1445766699705 } 
Sun Oct 25 2015 11:51:39 GMT+0200 (South Africa Standard Time) 
Sun Oct 25 2015 10:51:39 GMT+0200 (South Africa Standard Time) 

これは次のとおりです。これは、出力を与える

var token = jwt.sign({"id": user._id, "iat": (new Date().getTime())}, configGeneral.JWT, { expiresIn: calculatedExpiresIn }); 

:ここに示したように、私は、IATは私がペイロードに追加して、正しく表示するために取得するために私の答えだから、最終的にはhere

を得ました暗号化されていないJWTは、ユーザーが正常にサインインしたときにユーザーに返信され、今後のリクエストごとにJWTが渡されなければならないかどうかを確認することができます。

10

この:

new Date().getTime() 

はあなたにミリ秒単位での時間を与えます。しかし、JWTトークンの時間は(IAT、EXP)ので、私たちは今から数秒でいくつかの時間を取得するためにどのように1000

var actualTimeInSeconds = new Date().getTime()/1000; 

で結果を分割する必要があり、秒単位である:

(new Date().getTime() + someTimeInSeconds * 1000)/1000 

あなたが必要な場合1時間今から:

(new Date().getTime() + 60 * 60 * 1000)/1000 

ため1H = 60分×60秒

そして、この時点で、あなたはseconの時間を持っていますjwtトークンからのdsと秒単位の計算時間。この値は比較するだけです。

正確には、jwtトークンの時刻と実際の時刻を秒単位で比較する必要があります。 jwtトークン満了時間が実際の時間より長い場合、それはまだ有効であることを意味します。 JWTトークンのドキュメントから

EXP請求の処理は、現在の日付/時刻がEXPの、請求項に記載された有効期限の日付/時刻の前でなければならないことが必要です。

編集:

1000で乗算値、IATからcoorect日付を取得し、新しいDateコンストラクタに追加するには:クシシュトフSztompka私は内線に得ることができる、掲載内容に基づい

new Date(iat*1000) 
+0

私があなたの4番目のコード例をとり、それをexpiresInにフィードすると、エポックと数日(1970年2月3日)が得られます。しかし、私が1000で除算を削除すると、今日の日付+ 17日と数時間のエポックが得られます。私はちょっと遊んだが、正しい有効期限を示すためにExtを入手した(私の質問の更新を見てください)。しかし、これはまだ私に間違った耳を残す。 – Ebbs

+1

私が思いついた解決策を掲載したのは、ExtとIatを正しくJWTに取り込んでいないという問題を実際に解決したからです。私はその部分を十分に説明していないかもしれないし、あなたはそれのためにその要件を誤解しているかもしれないと思う。しかし、あなたの入力は間違いなく正しい答えを得るのを助けました。 :)私はJWTを解読して、JWTが期限切れになっているかどうかを判断できるように、現在の時刻とExtの秒数を比較しなければならないということが正しいです。 – Ebbs

+0

私は 'new Date().getTime()/ 1000 + 60 * 60'を好むでしょう – ChrLipp

関連する問題