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

Yasuhiro Yamano
asoview-engineering
Dec 23, 2020

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

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

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

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

ソーシャルログインはユーザーが会員登録の手間なく、
自身の利用しているSNSアカウントで利用したいサービスにログインできるというメリットと、WEBサービス側はユーザーの情報をSNS側から取得できるというメリットがあります。

一方でソーシャルログイン機能を自身のサービスに組み込みたいとなった場合、多くのソーシャルログインで利用されている
OAuth2.0 ・OpenID Connectの仕組み理解し、それに則った複雑な実装をする必要があります。

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

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

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

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

- Client ID
- Client Secret
- 認可エンドポイント
- トークン(アクセストークン)エンドポイント
- JWKsエンドポイント (OIDCの場合)
- リソースエンドポイント

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

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

実装方法

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

[未ログイン状態]
- ヘッダーにログインボタンを表示
- メインコンテンツに未ログイン状態のメッセージを表示
[ログイン状態]
- ヘッダーにユーザー名とログアウトボタンを表示
- メインコンテンツにユーザー情報を表示

ベース開発環境

- Open JDK 11
- SpringBoot 2.4.1

build.gradle

application.yaml

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

Configurationクラス

Controllerクラス

HTMLテンプレート(thymeleaf)

ログインページ

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

/oauth2/authorization/{registration ID}

indexページ

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

すると最初に以下の画面が表示されます。
未ログイン状態のため、右上にログインリンクが表示されています。

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

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

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

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

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

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

開発しているアプリケーションの要件によっては、
「デフォルトの認証・認可処理を拡張したい」 、「独自の認証・認可処理を実装したい」といったケースも発生する場合もあると思います。
その場合は図の中に登場するクラスを拡張させたり、
同様の処理を行う独自クラスを実装する必要がありますので、
各クラスの役割や処理内容を理解しておくことをおすすめします。

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

--

--