私はこれに少し困惑しています。有効なJWTをセットアップしようとしています。私はjsonwebtokenミドルウェアでnode.jsを使用しています。私はリポジトリにあるドキュメント( ここにあります )をたどっていますが、間違ったExpとIatを取得しています。明らかに、有効期限が切れたJWTを許可しないように、これを正しくしたいと考えています。
テストとして、次のコードがあります。
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);
この出力は次のとおりです。
{ 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)
タイムスタンプを取得してjavascript Epochではなく、1時間後の時刻を反映するにはどうすればよいですか? (iatとexpの両方)
Krzysztof Sztompkaが投稿した内容に基づいて、Extに正しい有効期限を表示させることができました。 (私の最初の要件は将来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時間です。
Iatが正しい日付を表示するようにするには(sign
関数で設定してから、decode
関数でそれを確認してから)、ペイロードの一部として設定する必要がありました。私は私の答えを得た ここ
したがって、最後にIatを正しく表示させるために、次のようにペイロードに追加しました。
var token = jwt.sign({"id": user._id, "iat": (new Date().getTime())}, configGeneral.JWT, { expiresIn: calculatedExpiresIn });
これにより、次の出力が得られます。
{ 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)
これは、ユーザーが正常にサインインしたときにユーザーに返されるエンコードされていないJWTです。これにより、今後のすべてのリクエストがまだ有効で、まだ期限が切れていないため、ユーザーが渡す必要があるJWTを確認できます。
この:
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 = 60min * 60 sだから
この時点で、jwtトークンからの秒単位の時間と、秒単位の計算された時間があります。この値のみを比較する必要があります。
正確には、jwtトークンの時間と実際の時間(秒)を比較する必要があります。jwtトークンの有効期限が実際の時間よりも長い場合、それはまだ有効であることを意味します。 jwtトークンのドキュメントから:
Expクレームの処理では、現在の日付/時刻がexpクレームにリストされている有効期限の日付/時刻よりも前である必要があります。
Iatから正しい日付を取得するには、値に1000を掛けて、新しいDateコンストラクターに追加します。
new Date(iat*1000)
ライブラリによって作成されたエポックはUnixエポック時間であり、任意のWebサイトでjwt iat&exp値を確認できます( たとえば、このように )&有効
たとえば、質問1445714161のiatはGMTです:2015年10月24日土曜日19:16:01
あなたの経験はGMTである1445717761でした:2015年10月24日土曜日20:16:01
それで、最初からあなたの目的であったそれは1時間後でした
javascript new Date(1445714161)で試した場合、間違った時間になります
したがって、jsonwebtokenライブラリのドキュメントに従って、IAT(自動作成)とexpクレームを作成する最も簡単な方法 here
この方法で有効期限を簡単に設定できます
jwt.sign({
data: 'foobar'
}, 'secret', { expiresIn: 60 * 60 });
またはさらに良い:
jwt.sign({
data: 'foobar'
}, 'secret', { expiresIn: '1h' });
これにより、次のようにjwtにexpクレームが配置されます。iatとexpの両方の正しいUNIXエポック時間(時間に発行されたものより1時間遅れて有効期限があるため)は、たとえば次のようになります(これは次のように簡単に確認できます) jwtライブラリ):
{
"data": "foobar",
"iat": 1539549664,
"exp": 1539553264
}
上記のexpiresIn
オプションはjsonwebtokenライブラリに固有であり、より一般的な方法は次のようになります。
jwt.sign({
exp: Math.floor(Date.now() / 1000) + (60 * 60),
data: 'foobar'
}, 'secret');
_*1000
_をexp
とiat
に追加すると、正しい日付が表示されます。
var d1 = new Date(decoded.exp*1000);
var d2 = new Date(decoded.iat*1000);