18

私はこれに少し困惑しています。有効な 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 エポックではなく、今から 1 時間後のタイムスタンプを取得するにはどうすればよいですか? (iat と exp の両方)

4

4 に答える 4

26

これ:

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

1 時間 = 60 分 * 60 秒なので

この時点で、jwt トークンからの秒単位の時間と秒単位の計算時間があります。この値のみを比較してください。

まさにあなたの状況では、jwt トークン時間と実際の時間 (秒単位) を比較する必要があります。jwt トークンの有効期限が実際の時間よりも長い場合、それはまだ有効であることを意味します。 jwt トークンのドキュメントから:

exp クレームの処理では、現在の日付/時刻が exp クレームにリストされている有効期限の日付/時刻よりも前でなければなりません。

編集:

iat から正確な日付を取得するには、値に 1000 を掛けて、新しい Date コンストラクターに追加します。

new Date(iat*1000)
于 2015-10-24T20:08:28.520 に答える
7

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 がまだ有効であり、まだ期限切れになっていないかどうかを確認できます。

于 2015-10-25T09:20:23.990 に答える