Spring Security5 を使ったソーシャルログインの実装

アソビュー Advent Calendar 2020の23日目です。

初めまして!
アソビュー!バックエンドエンジニアの山野です。

今回はSpring Security5 OAuth2を利用した
ソーシャルログイン機能の実装について書きたいと思います。

現在のWEBサービスではSNSアカウントを利用した
ソーシャルログインが一般的になっていると思います。

ソーシャルログインはユーザーが会員登録の手間なく、
自身の利用しているSNSアカウントで利用したいサービスにログインできるというメリットと、
WEBサービス側はユーザーの情報をSNS側から取得できるというメリットがあります。
一方でソーシャルログイン機能を自身のサービスに組み込みたいとなった場合、
多くのソーシャルログインで利用されている OAuth2.0OpenID Connectの仕組み理解し、
それに則った複雑な実装をする必要があります。

Spring Security OAuth2では複雑な実装をすることなく、
設定ファイルに指定の記述をすることで簡単にログイン機能を実装することができます。

ソーシャルログインの認証・認可フロー

ここから実装方法について説明したいと思いますが、 その前に実装にあたっては一般的なソーシャルログインが どのようなフローで行われているか理解しておく必要があります。 以下の通り図でログインフローを表してみましたのでご覧ください。
(今回はSpring Securityの説明が本目的のため、 図は簡易的な内容になっています。 詳細はOAuth2.0OIDCの規約・仕様等をご確認ください。)

実装ではこの図で登場する以下の項目の情報を
設定ファイルに記述することでログイン機能が実現できます。

- Client ID
- Client Secret
- 認可エンドポイント
- トークン(アクセストークン)エンドポイント
- JWKsエンドポイント (OIDCの場合)
- リソースエンドポイント
OAuth2.0(認可コードフロー) タイプのログインフロー

OAuth2.0(認可コードフロー) タイプのログインフロー
OAuth2.0(認可コードフロー) タイプのログインフロー

Open ID Connect (認可コードフロー) タイプのログインフロー

Open ID Connect (認可コードフロー) タイプのログインフロー
Open ID Connect (認可コードフロー) タイプのログインフロー

実装方法

上記を踏まえ、実装方法について説明したいと思います。
以下のような挙動をする簡単なデモアプリケーションの実装です。
今回はプロバイダとしてGithubを利用したログイン処理となっています。

[未ログイン状態]
- ヘッダーにログインボタンを表示
- メインコンテンツに未ログイン状態のメッセージを表示
[ログイン状態]
- ヘッダーにユーザー名とログアウトボタンを表示
- メインコンテンツにユーザー情報を表示
ベース開発環境
- Open JDK 11
- SpringBoot 2.4.1
build.gradle

gist.github.com

application.yaml

記述・設定内容のポイントはファイル内にコメントしてますので参照してください。

gist.github.com

Configurationクラス

gist.github.com

Controllerクラス

gist.github.com

HTMLテンプレート(thymeleaf)

■ログインページ

gist.github.com

ポイントはリンク先を以下にすること。
このリンク先に指定すると、Spring Securityが
対象のプロバイダにリダイレクト 処理を行ってくれます。
※registration IDはapplication.yamlのコメントを参照してください。

/oauth2/authorization/{registration ID}

■indexページ

gist.github.com

以上の実装でアプリケーションを起動しindexページ(http://localhost:8080)にアクセスします。

◆未ログイン状態のため右上にログインリンクが表示されています。

デモ画面
デモ画面

◆ログイン画面に進みます

デモ画面
デモ画面

◆ログイン画面で表示されているGithubリンクを押下すると、
デモアプリケーションからGithubの認可画面にリダイレクトされます。

デモ画面
デモ画面

◆認可承諾(Authorize xxxx)ボタンするを押下すると、
Githubからデモアプリケーションにリダイレクトされログイン完了となります。
またGithub上に登録されているユーザー情報(リソース情報)が取得され、
デモアプリケーション上に表示されます。

デモ画面
デモ画面

Spring Security OAuth2の認証・認可の仕組み

上記デモアプリケーションの例の通り、
簡単にソーシャルログイン機能が実装できることが分かっていただけたと思いますが、
Spring Securityがどのような仕組みで認証・認可処理を行っているのか最後に説明したいと思います。

簡単ではありますが、認証・認可の仕組みと
Spring Securityの各クラスの役割を以下の通り、図で表してみました。

開発しているアプリケーションの要件によっては、
「デフォルトの認証・認可処理を拡張したい」 、
「独自の認証・認可処理を実装したい」といったケースも発生する場合もあると思います。

その場合は図の中に登場するクラスを拡張させたり、
同様の処理を行う独自クラスを実装する必要がありますので、
各クラスの役割や処理内容を理解しておくことをおすすめします。

認証・認可の仕組みとSpring Securityの各クラスの役割
認証・認可の仕組みとSpring Securityの各クラスの役割

今回のブログは以上となります。

ログイン機能という重要で複雑な部分をSpring Serurityの仕組みを使うことにより、
簡単に実装できることは開発の手間を軽減でき嬉しいですね。

参考にしたサイト
https://spring.pleiades.io/guides/tutorials/spring-boot-oauth2/ https://qiita.com/kazuki43zoo/items/53804e18337933a77ad0 https://www.slideshare.net/ngzm/oauth-10-oauth-20-openid-connect https://qiita.com/TakahikoKawasaki/items/4ee9b55db9f7ef352b47 https://qiita.com/TakahikoKawasaki/items/200951e5b5929f840a1f https://qiita.com/TakahikoKawasaki/items/e37caf50776e00e733be https://developer.yahoo.co.jp/yconnect/v2/authorization_code/ https://github.com/spring-projects/spring-security/tree/master/samples/boot/oauth2login

最後に

アソビュー!では一緒に働くメンバーを募集しています。
興味がありましたらお気軽にご応募ください!

www.wantedly.com