Spring SecurityのOAuth2ログイン入門!Google・GitHubのクライアント登録と属性マッピングをやさしく解説
生徒
「ログイン機能をSpring Securityで実装したいんですけど、GoogleやGitHubでログインさせる方法ってありますか?」
先生
「はい、Spring SecurityのOAuth2機能を使えば、GoogleやGitHubのアカウントを使ってログイン認証ができますよ。」
生徒
「どこに何を設定すればいいのか、ちょっとピンとこないんです…」
先生
「それでは、クライアント登録から属性マッピングの仕組みまで順番に説明していきましょう。」
1. OAuth2ログインとは?
OAuth2ログインは、外部サービス(例えばGoogleやGitHub)のアカウント情報を使って、自分のWebアプリにログインさせる仕組みです。パスワードを直接扱わずに安全なログイン機構を実現できます。
Spring Securityでは、このOAuth2ログインを簡単に取り入れるための機能が標準で用意されており、設定ファイルと依存関係を追加するだけで基本的なログインが可能になります。
2. GoogleのクライアントID・シークレットの取得手順
まずGoogleアカウントでOAuth2ログインを使うには、Google Cloud Consoleでクライアントを登録します。
- Google Cloud Consoleにアクセス
- 新しいプロジェクトを作成
- 「OAuth同意画面」を構成(アプリ名やメールアドレスなど)
- 「認証情報」から「OAuth 2.0 クライアントID」を作成
- リダイレクトURIに
http://localhost:8080/login/oauth2/code/googleを登録
この設定を完了すると、クライアントIDとクライアントシークレットが発行されます。
3. GitHubのクライアントID・シークレットの取得手順
GitHubでも同様に、開発者向け設定からOAuthアプリを登録します。
- GitHubの「Settings」→「Developer settings」→「OAuth Apps」
- 新しいOAuthアプリを登録
- Homepage URL:
http://localhost:8080 - Authorization callback URL:
http://localhost:8080/login/oauth2/code/github
登録が完了すると、Client IDとClient Secretが表示されます。
4. Spring Bootの設定ファイルでOAuth2を有効化
application.ymlやapplication.propertiesに、クライアントIDとシークレットを記述します。以下はGoogleとGitHubの両方を使う場合の例です。
spring:
security:
oauth2:
client:
registration:
google:
client-id: your-google-client-id
client-secret: your-google-client-secret
scope: profile, email
github:
client-id: your-github-client-id
client-secret: your-github-client-secret
scope: read:user, user:email
provider:
github:
authorization-uri: https://github.com/login/oauth/authorize
token-uri: https://github.com/login/oauth/access_token
user-info-uri: https://api.github.com/user
user-name-attribute: login
これでSpring SecurityはGoogleとGitHubのログインボタンを自動で生成してくれます。
5. OAuth2ユーザー情報をマッピングする仕組み
ログイン後に取得できるユーザー情報(nameやemailなど)はプロバイダによって異なります。Spring SecurityではOAuth2UserServiceを使ってカスタムマッピングが可能です。
@Component
public class CustomOAuth2UserService implements OAuth2UserService<OAuth2UserRequest, OAuth2User> {
@Override
public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException {
OAuth2UserService<OAuth2UserRequest, OAuth2User> delegate = new DefaultOAuth2UserService();
OAuth2User oAuth2User = delegate.loadUser(userRequest);
Map<String, Object> attributes = oAuth2User.getAttributes();
String provider = userRequest.getClientRegistration().getRegistrationId();
String nameAttributeKey = userRequest.getClientRegistration()
.getProviderDetails()
.getUserInfoEndpoint()
.getUserNameAttributeName();
return new DefaultOAuth2User(
Collections.singleton(new SimpleGrantedAuthority("ROLE_USER")),
attributes,
nameAttributeKey
);
}
}
このカスタムクラスをBeanとして登録すると、自分で属性名(name、emailなど)を抽出して使うことができます。
6. カスタムユーザー情報をアプリで活用する
認証後に取得できるOAuth2ユーザー情報を、自分のアプリケーションで活用するには、セッションに保存したりデータベースに保存したりします。ユーザー名やメールアドレスを取り出すには、次のようにPrincipalを使います。
@Controller
public class HomeController {
@GetMapping("/")
public String home(Model model, @AuthenticationPrincipal OAuth2User principal) {
String name = principal.getAttribute("name");
model.addAttribute("userName", name);
return "home";
}
}
これにより、Googleログインユーザーであれば「Googleアカウントの名前」が、GitHubログインユーザーであれば「GitHubのユーザー名」が取得できます。
7. 属性名の違いに注意しよう
GoogleとGitHubでは、ユーザー属性のキー名が異なる場合があります。例えば、Googleではnameやemailが使えますが、GitHubではloginやemailが使われます。
カスタムマッピング時に条件分岐で使い分けることが大切です。以下はその例です。
String userName;
if (provider.equals("google")) {
userName = attributes.get("name").toString();
} else if (provider.equals("github")) {
userName = attributes.get("login").toString();
}
8. OAuth2ログインの注意点とベストプラクティス
OAuth2ログインは便利ですが、以下のような注意点もあります。
- プロバイダの仕様変更により属性キーが変わることがある
- ユーザー情報は必要最小限だけを使用する
- データベースへの保存は認証後に明示的に行う
- セッションに保存しすぎない(メモリ対策)
実際の商用アプリケーションでは、ログイン後にユーザーをDBに登録する処理や、再ログイン時のチェックなども必要になります。
Spring FrameworkやThymeleafを使った Webアプリ開発の全体像をやさしく理解したい人には、 この入門書が定番です。
Spring Framework超入門をAmazonで見る※ Amazon広告リンク