Spring Security OAuth2の新機能 - クレームの確認

1概要

このクイックチュートリアルでは、Spring Security OAuth2実装を扱い、https://spring.io/blog/2017/07/28/spring-で紹介されている新しい JwtClaimsSetVerifier を使用してJWTクレームを検証する方法を学習します。 security-oauth-2-2 - [Spring Security OAuth 2.2.0.RELEASE]をリリースしました。

2 Mavenの設定

まず、最新の spring-security-oauth2 pom.xml に追加する必要があります。

<dependency>
    <groupId>org.springframework.security.oauth</groupId>
    <artifactId>spring-security-oauth2</artifactId>
    <version>2.2.0.RELEASE</version>
</dependency>

3トークンストアの設定

次に、Resource Serverで TokenStore を設定しましょう。

@Bean
public TokenStore tokenStore() {
    return new JwtTokenStore(accessTokenConverter());
}

@Bean
public JwtAccessTokenConverter accessTokenConverter() {
    JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
    converter.setSigningKey("123");
    converter.setJwtClaimsSetVerifier(jwtClaimsSetVerifier());
    return converter;
}

JwtAccessTokenConverter に新しいベリファイアを追加する方法に注意してください。

JwtTokenStore の設定方法の詳細については、 Spring Security OAuthでJWTを使う

それでは、次のセクションでは、さまざまな種類のクレーム検証機能とそれらを連携させる方法について説明します。

4 IssuerClaimVerifier

次のように、 IssuerClaimVerifier を使用して発行者の " iss "クレームを確認することから始めます。

@Bean
public JwtClaimsSetVerifier issuerClaimVerifier() {
    try {
        return new IssuerClaimVerifier(new URL("http://localhost:8081"));
    } catch (MalformedURLException e) {
        throw new RuntimeException(e);
    }
}

この例では、発行者を検証するために単純な IssuerClaimVerifier を追加しました。 JWTトークンに発行者の「iss」要求に対して異なる値が含まれている場合は、単純な InvalidTokenException がスローされます。

当然、トークンに発行者の「iss」クレームが含まれている場合、例外はスローされず、トークンは有効と見なされます。

5カスタムクレーム検証機能

しかし、ここで興味深いのは、カスタムクレーム検証機能も構築できることです。

@Bean
public JwtClaimsSetVerifier customJwtClaimVerifier() {
    return new CustomClaimVerifier();
}

これは、 user name__クレームがJWTトークンに存在するかどうかを確認するための簡単な実装です。

public class CustomClaimVerifier implements JwtClaimsSetVerifier {
    @Override
    public void verify(Map<String, Object> claims) throws InvalidTokenException {
        String username = (String) claims.get("user__name");
        if ((username == null) || (username.length() == 0)) {
            throw new InvalidTokenException("user__name claim is empty");
        }
    }
}

ここで JwtClaimsSetVerifier インターフェースを単純に実装していることに注目してから、verifyメソッドのための完全にカスタムな実装を提供してください - これは私たちが必要とするあらゆる種類のチェックに対して完全な柔軟性を与えます。

6. 複数のクレーム検証機能を組み合わせる

最後に、 DelegatingJwtClaimsSetVerifier を使用して複数のクレーム検証を組み合わせる方法を説明します。

@Bean
public JwtClaimsSetVerifier jwtClaimsSetVerifier() {
    return new DelegatingJwtClaimsSetVerifier(Arrays.asList(
      issuerClaimVerifier(), customJwtClaimVerifier()));
}

DelegatingJwtClaimsSetVerifier は、 JwtClaimsSetVerifier オブジェクトのリストを受け取り、これらの検証者にクレーム検証プロセスを委任します。

7. 単純統合テスト

実装が完了したので、簡単なhttps://github.com/Baeldung/spring-security-oauth/blob/master/oauth-resource-server-2/src/test/を使用して、クレーム検証機能をテストしましょう。 java/com/baeldung/test/JwtClaimsVerifierIntegrationTest.java[統合テスト]:

@RunWith(SpringRunner.class)
@SpringBootTest(
  classes = ResourceServerApplication.class,
  webEnvironment = WebEnvironment.RANDOM__PORT)
public class JwtClaimsVerifierIntegrationTest {

    @Autowired
    private JwtTokenStore tokenStore;

    ...
}

発行者を含まない(ただし user name__を含む)トークンから始めます。

@Test
public void whenTokenDontContainIssuer__thenSuccess() {
    String tokenValue = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9....";
    OAuth2Authentication auth = tokenStore.readAuthentication(tokenValue);

    assertTrue(auth.isAuthenticated());
}

これが有効である理由は単純です - 最初の検証者は、発行者の請求がトークンに存在する場合にのみアクティブになります。その主張が存在しない場合 - 検証者は参加しません。

次に、有効な発行者( http://localhost:8081 )と user name__を含むトークンを見てみましょう。これも有効です。

@Test
public void whenTokenContainValidIssuer__thenSuccess() {
    String tokenValue = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9....";
    OAuth2Authentication auth = tokenStore.readAuthentication(tokenValue);

    assertTrue(auth.isAuthenticated());
}

トークンに無効な発行者( http://localhost:8082 )が含まれている場合 - 検証され、無効と判断されます。

@Test(expected = InvalidTokenException.class)
public void whenTokenContainInvalidIssuer__thenException() {
    String tokenValue = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9....";
    OAuth2Authentication auth = tokenStore.readAuthentication(tokenValue);

    assertTrue(auth.isAuthenticated());
}

次に、トークンに user name__クレームが含まれていない場合は無効になります。

@Test(expected = InvalidTokenException.class)
public void whenTokenDontContainUsername__thenException() {
    String tokenValue = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9....";
    OAuth2Authentication auth = tokenStore.readAuthentication(tokenValue);

    assertTrue(auth.isAuthenticated());
}

そして最後に、トークンに空の user name__クレームが含まれていると、それも無効になります。

@Test(expected = InvalidTokenException.class)
public void whenTokenContainEmptyUsername__thenException() {
    String tokenValue = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9....";
    OAuth2Authentication auth = tokenStore.readAuthentication(tokenValue);

    assertTrue(auth.isAuthenticated());
}

8結論

このクイック記事では、Spring Security OAuthの新しい検証機能について説明しました。

いつものように、完全なソースコードは利用可能ですhttps://github.com/Baeldung/spring-security-oauth/blob/master/oauth-resource- server -2/src/test/java/com/baeldung/test/JwtClaimsVerifierIntegrationTest .java[over GitHub]