最近、私はJWTベースの認証で働き始めました。ユーザのログイン後、ユーザートークンは「eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ」のように見えますが生成されます。
それぞれがドット(。)で区切られた3つの部分で構成されています。最初の部分は、Base64でエンコードされたヘッダーです。デコード後、{"alg": "HS256"、// Algorithm used "typ": "JWT"}のようなものが得られます
2番目の部分は、クレームとBase64エンコードです。デコード後、{"sub": "1234567890"、 "name": "John Doe"、 "admin":true}のようなものが得られます
3番目の部分は署名であり、次で生成されます
HMACSHA256(base64UrlEncode(header)+ "。" + base64UrlEncode(payload)、secret base64 encoded)
さて、この秘密鍵とは何か、この秘密鍵を生成する方法は??
「 http://kjur.github.io/jsjws/tool_jwt.html 」のようなオンラインジェネレーターを試しましたが、dintは多くの助けを得ます。
アルゴリズム(HS256
)JWTの署名に使用されるのは、シークレットが送信者と受信者の両方に知られている対称鍵であることを意味します。ネゴシエートされ、帯域外で配布されます。したがって、あなたがトークンの受信者である場合、送信者は帯域外の秘密を提供しているはずです。
あなたが送信者である場合、任意のバイト文字列をシークレットとして使用でき、生成または意図的に選択できます。意図した受信者に帯域外で秘密を提供することを確認する必要があります。
レコードの場合、JWTの3つの要素はbase64エンコードではなくbase64urlエンコードされます。これはbase64エンコードのバリアントであり、URLセーフな値になります。
独自のジェネレータを作成できます。秘密鍵は基本的にバイト配列です。バイト配列に変換する文字列がbase64エンコードされていることを確認してください。 Javaでは、このようなことができます。
String key = "random_secret_key";
String base64Key = DatatypeConverter.printBase64Binary(key.getBytes());
byte[] secretBytes = DatatypeConverter.parseBase64Binary(base64Key);
秘密鍵はヘッダーとペイロードと組み合わされて、一意のハッシュが作成されます。秘密鍵を持っている場合にのみ、このハッシュを検証できます。
適切な長いパスワードを選択できます。または、 this のようなサイトから生成できます。
例(ただし、今はこれを使用しないでください):
8Zz5tw0Ionm3XPZZfN0NOml3z9FMfmpgXwovR9fp6ryDIoGRM8EPHAB6iHsc0fb