😁

Spring SecurityのアプリにGoogle認証を導入する方法

2023/08/29に公開

今回はSpring Securityを使用して作成したアプリケーションにGoogle認証を導入する方法を説明したいと思います。
SpringSecurityがサポートしている認証方式に関しては以下を参考にしてください。
https://spring.pleiades.io/spring-security/reference/servlet/authentication/

今回使用するGoogle認証はOpenID Connectと言われるものでOAuthを拡張して作成されたものです。主要な認証・認可の方式の違いに関しては以下のサイトを参照してください!
https://zenn.dev/kisukeyas/articles/910898b0bb6ad3

Google認証導入の参考サイト
https://qiita.com/d-yosh/items/148f9a3249c06dbfae10

Google側の設定

  1. GoogleAPIコンソールにアクセス](https://console.cloud.google.com/apis/dashboard)
  2. 認証情報」から「認証情報を作成」→「OAuth クライアント ID」を選択する。
  3. ェブアプリケーションを選択
  4. 認済みのリダイレクトURIに http://localhost:8080/login/oauth2/code/google を追加する。
    ※このURLはデフォルト値なので同じ値を設定する

アプリケーションの設定

  1. build.gradleに以下を以下の依存関係を追加します。
//Spring Security
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6:3.1.1.RELEASE'
testImplementation('org.springframework.security:spring-security-test')
//OAuth
implementation 'org.springframework.security:spring-security-oauth2-client'
implementation 'org.springframework.security:spring-security-oauth2-jose'
  1. application.ymlに以下を追加します。
spring:
  security:
    oauth2:
      client:
        registration:
          google:
            client-id: クライアントID
            client-secret: クライアントシークレット

クライアントIDとクライアントシークレットはGoogleの設定で作成したものを使用してください。

  1. アプリケーションクラス
    特に変更はせず、デフォルトで構いません。
@SpringBootApplication
public class OidcApplication {

    public static void main(String[] args) {
        SpringApplication.run(OidcApplication.class, args);
    }
}
  1. Controllerクラス
@Controller
@RequestMapping
public class OAuthController {
	 @GetMapping("/")
	  public String index(@AuthenticationPrincipal OidcUser user, Model model) {
	    model.addAttribute("username", user.getFullName());
	    return "users/userinfo";
	  }
}

OidcUserに認証情報が格納されているので、そこから取得することができます。
getFullName()の他にも複数のメソッドが用意されており、認証情報の取得に役立ちます。
※メソッドによってはGoogle側が対応していないことでnullが返却される場合もあります。
OdicUserの説明サイト

  1. Security Config クラス
@EnableWebSecurity		
@Configuration		
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {		
     @Override	
     protected void configure(HttpSecurity http) throws Exception {	
	     http.authorizeRequests()
	     .mvcMatchers("/login").permitAll()
	     .anyRequest().authenticated() //上記以外のファイルへのアクセスは認証が必要
	     .and()
	     .oauth2Login()  //OpenID Connect認証(Oauth)を有効にする
     }
}
  1. Thymeleaf
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>UserInfo</title>
</head>
<body>
    <div>username:<span th:text="${username}"></span></div>
    <a href="/">Back</a>
</body>
</html>

認証情報を表示する画面を作成します。${username}にはController側で設定した名前が入ってくればOKということです。

動作確認

  1. Spring Bootアプリケーションを起動し、localhost:8080/にアクセス

    Google認証のページが表示されれば、正しく連携ができています。

  2. Googleの認証情報を入力し、認証を完了する

    上記の画面が表示されれば認証が完了したということ。

おわりに

以上、とても簡単にSpringBootを使用したアプリケーションにGoogle認証を導入することができました。個人的な感想としてはSAMLにくらべ、記載量も少なく、理解しやすいと感じました。

Discussion