web-dev-qa-db-ja.com

JWTのExpおよびIatを正しく設定できません

私はこれに少し困惑しています。有効な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の両方)

14
Ebbs

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を確認できます。

4
Ebbs

この:

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)
15

ライブラリによって作成されたエポックは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');
1
Ahmed Elkoussy

_*1000_をexpiatに追加すると、正しい日付が表示されます。

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

0
Yahia Badr