2017-05-18 15 views
-1

マイシステム:セキュリティプロバイダは、秘密鍵に基づいてJWTトークンを生成します。秘密鍵は期限切れになる証明書に属します。OAuth2複数のキー、公開鍵の移行、リソースサーバー

  1. リソースサーバーで複数の公開キーを設定することはできますか?

ローリングアップデートをしたいので、しばらくの間、古い公開鍵と新しい公開鍵をサポートする必要があります。証明書が期限切れになるため、デフォルトのユースケースとなります。

  1. oauth/token_keyは複数のキーを提供できますか?アウト・オブ・ボックス

    @Bean 
    public JwtAccessTokenConverter accessTokenConverter() { 
        JwtAccessTokenConverter converter = new JwtAccessTokenConverter(); 
        Resource resource = new ClassPathResource("public.txt"); 
        String publicKey = null; 
        try { 
         publicKey = IOUtils.toString(resource.getInputStream()); 
        } 
        catch (final IOException e) { throw new RuntimeException(e); 
    } 
        **converter.setVerifierKey(publicKey);** 
        **converter.setVerifierKeys(publicKey1, publicKey2);?** 
        return converter; 
    } 
    

http://www.baeldung.com/spring-security-oauth-jwt

おかげ

+0

あなたは複数のキーを持つことができましたか? –

答えて

0

これはない標準的な方法であるとSpringのJWTのフレームワークは、複数のセキュリティプロバイダ(または複数のアクティブな検証キー)をサポートしていません。言いましたが、あなたがしたいことは理論的に可能です。あなたは、ワイヤアップJwtAccessTokenConverterに似AccessTokenConverterのための新しい実装を持っていますが、このようなdecodeメソッドを実装します:基本的に

protected Map<String, Object> decode(String token) { 
    try { 
     Jwt jwt = JwtHelper.decodeAndVerify(token, verifier1); 
     String content = jwt.getClaims(); 
     Map<String, Object> map = objectMapper.parseMap(content); 
     if (map.containsKey(EXP) && map.get(EXP) instanceof Integer) { 
      Integer intValue = (Integer) map.get(EXP); 
      map.put(EXP, new Long(intValue)); 
     } 
     return map; 
    } 
    catch (Exception e) { 
     //try the other verifier 
     try { 
     Jwt jwt = JwtHelper.decodeAndVerify(token, verifier2); 
     String content = jwt.getClaims(); 
     Map<String, Object> map = objectMapper.parseMap(content); 
     if (map.containsKey(EXP) && map.get(EXP) instanceof Integer) { 
      Integer intValue = (Integer) map.get(EXP); 
      map.put(EXP, new Long(intValue)); 
     } 
     return map; 
    } 
    catch(InvalidTokenException te){ 
     throw te; 
    }catch (Exception e) { 

     throw new InvalidTokenException("Cannot convert access token to JSON", e); 
    } 
    } 
} 

を、最初のキーを検証するためにtrys上記のコードが、どの例外がそれをスローされた場合2番目のものを検証しようとします。

また、tokenConverterにオーバーライドして、提供されたトークンを "。"のような区切り文字で分割することをお勧めします。またはベリファイアキーを生成するハッシュアルゴリズムのエンコーディング文字セットに含まれていないもの。そして、あなたができる呼び出すとき:setVerifierKey("verifierKey1" + delimiter + "verifierKey2")

  • 注:私はこのコードをテストしていませんが、ただいくつかの考えを:)
関連する問題