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のセットアップが少し必要です。
- ユーザープールを作成する
- ユーザーの追加–このユーザーを使用してSpringアプリケーションにログインします
- AppClientを作成する
- AppClientを構成する
アプリケーションクライアントの構成で、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でから入手できます。