1. 序章

このチュートリアルでは、 SpringSecurityのOAuth2.0サポートを使用してAmazonCognitoで認証する方法を見ていきます。

その過程で、Amazon Cognitoとは何か、およびAmazonCognitoがサポートするOAuth2.0フローの種類について簡単に説明します。

最後に、単純な1ページのアプリケーションを作成します。 特別なことは何もありません。

2. Amazon Cognitoとは何ですか?

Cognitoは、ユーザーIDおよびデータ同期サービスであり、複数のデバイス間でアプリのユーザーデータを簡単に管理できます。

Amazon Cognitoを使用すると、次のことができます。

  • アプリケーションのユーザーを作成、認証、および承認します
  • Google、Facebook、Twitterなどの他のパブリックIDプロバイダーを使用するアプリのユーザーのIDを作成します
  • アプリのユーザーデータをキーと値のペアで保存します

3. 設定

3.1. AmazonCognitoのセットアップ

IDプロバイダーとして、Cognitoは authentication_code、implicit、およびclient_credentialsgrantsをサポートしています。 ここでは、authentication_code付与タイプを使用するように設定しましょう。

まず、Cognitoのセットアップが少し必要です。

アプリケーションクライアントの構成で、CallbackURLがSpring構成ファイルのredirect-uriと一致することを確認します。 私たちの場合、これは次のようになります。

http://localhost:8080/login/oauth2/code/cognito

The 許可されたOAuthフローする必要があります承認コードの付与。 次に、同じページで を設定する必要があります許可されたOAuthスコープ openid。

ユーザーをCognitoのカスタムログインページにリダイレクトするには、ユーザープールドメインも追加する必要があります。

3.2. 春のセットアップ

OAuth 2.0ログインを使用するため、spring-security-oauth2-clientおよびspring-security-oauth2-joseの依存関係をアプリケーションに追加する必要があります。

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-oauth2-client</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-oauth2-jose</artifactId>
</dependency>

次に、すべてをバインドするための構成が必要になります。

spring:
  security:
    oauth2:
      client:
        registration:
          cognito:
            clientId: clientId
            clientSecret: clientSecret
            scope: openid
            redirect-uri: http://localhost:8080/login/oauth2/code/cognito
            clientName: clientName
        provider:
          cognito:
            issuerUri: https://cognito-idp.{region}.amazonaws.com/{poolId}
            user-name-attribute: cognito:username

上記の設定では、プロパティ clientId clientSecret clientName issuerUri は、 UserPool[に従って入力する必要があります。 AWSで作成されたX172X]およびAppClient

これで、SpringとAmazonCognitoをセットアップする必要があります。 チュートリアルの残りの部分では、アプリのセキュリティ構成を定義してから、いくつかのルーズエンドを結び付けます。

3.3. Springセキュリティ構成

次に、セキュリティ構成クラスを追加します。

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf()
          .and()
          .authorizeRequests(authz -> authz.mvcMatchers("/")
            .permitAll()
            .anyRequest()
            .authenticated())
          .oauth2Login()
          .and()
          .logout()
          .logoutSuccessUrl("/");
    }
}

ここでは、最初にCSRF攻撃からの保護が必要であることを指定し、次にすべてのユーザーにランディングページへのアクセスを許可しました。 その後、 oauth2Login への呼び出しを追加して、Cognitoクライアント登録を接続しました。

4. ランディングページを追加する

次に、簡単な Thymeleaf ランディングページを追加して、ログインしたときにわかるようにします。

<div>
    <h1 class="title">OAuth 2.0 Spring Security Cognito Demo</h1>
    <div sec:authorize="isAuthenticated()">
        <div class="box">
            Hello, <strong th:text="${#authentication.name}"></strong>!
        </div>
    </div>
    <div sec:authorize="isAnonymous()">
        <div class="box">
            <a class="button login is-primary" th:href="@{/oauth2/authorization/cognito}">
              Log in with Amazon Cognito</a>
        </div>
    </div>
</div>

簡単に言うと、ログインしているときはユーザー名が表示され、ログインしていないときはログインリンクが表示されます。 構成ファイルからコグニート部分を取得するため、リンクがどのように表示されるかに細心の注意を払ってください。

次に、アプリケーションルートをウェルカムページに関連付けていることを確認しましょう:

@Configuration
public class CognitoWebConfiguration implements WebMvcConfigurer {
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("home");
    }
}

5. アプリを実行する

これは、認証に関連するすべてのものを実行するクラスです。

@SpringBootApplication
public class SpringCognitoApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringCognitoApplication.class, args);
    }
}

これで、アプリケーションを起動し、 http:// localhost:8080、に移動して、ログインリンクをクリックします。 AWSで作成したユーザーのクレデンシャルを入力すると、 Hello、usernameメッセージが表示されるはずです。

6. 結論

このチュートリアルでは、いくつかの簡単な構成で、SpringSecurityをAmazonCognitoと統合する方法を確認しました。 そして、ほんの数個のコードですべてをまとめます。

いつものように、この記事で紹介するコードは、Githubから入手できます。