0

私はspring-security-oauth2モジュールでSpring Bootを使用してRESTful APIを構築します。 私はJWTを提供する(外部)認証サーバーと、署名を確認するための秘密鍵(security.oauth2.resource.jwt.key-value)も持っています。アルゴリズムはHMACです。security.oauth2.resource.jwt.key-valueのエンコーディング

問題は、キーが64エンコードされたベースURLであり、ソースコードの読み取りを理解する限り、プロパティーsecurity.oauth2.resource.jwt.key-valueはプレーンテキストである必要があります。

手動でキーをデコードして外部設定ファイルに設定しようとしましたが、これは機能しません。

質問は次のとおりです。私は何ができますか? Beanが設定される前にそれをデコードする方法はありますか?もう一つの提案?

ありがとうございます。

+0

私はEnvironmentPostProcessorを使ってオンザフライでキーを解読することに成功しました。トリックはしますが、トークン署名の検証はまだ失敗します。 – cdelmas

答えて

0

私は問題を理解:これは、デフォルトプラットフォームのエンコーディング(UTF-8私の場合)を使用しています

final Base64.Decoder decoder = Base64.getUrlDecoder(); 
final byte[] decoded = decoder.decode(key.getBytes()); 

:私はこのコードを使用してベース64 URLエンコードされた文字列をデコードします。 [文字列のI再エンコードは

String decodedKey = new String(decoded); 

JwtAccessTokenConverterに設定するために後で、JwtAccessTokenConverterパラメータとしてこの文字列でMacSignerのインスタンスを作成します。そのコンストラクタは文字列からバイトを取得します。

... 
new SecretKeySpec(key.getBytes(), ...); 

最後に、JWT署名を検証しようとすると失敗します。働くことができない事実

、文字列に戻って変換しながら、情報の損失があるため:

assertThat(decoded, equalTo(decodedKey.getBytes)); // fails! 

だから、解決策は、デコードされたバイト配列でMacSignerを構築することです。私はJwtAccessTokenConverterを再実装する必要があります。

関連する問題