Skip to content

KeycloakでAuthorization Code Flowを有効化する

Keycloak

cf. https://www.keycloak.org/docs/latest/server_admin/index.html#assembly-managing-clients_server_administration_guide

設定

  • Realmを作成します(例: easyapp)。
  • Clientを作成します:
    • Client authenticationをONにします。
    • Authentication flowはStandard flowとします。
    • Valid Redirect URIsをhttp://localhost:8081/login/oauth2/code/*とします。
    • Web originsをhttp://localhost:8081とします。
    • 保存後、CredentinalsタブにおいてClient Secretが取得できます。
  • Userを作成し、パスワードの設定を行います:

業務アプリ(Spring Boot)

cf. https://docs.spring.io/spring-security/reference/servlet/oauth2/?utm_source=chatgpt.com#oauth2-client-log-users-in

実装

  • pom.xmlに下記を追加します:
        <!-- Source: https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-security -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
            <version>4.0.2</version>
            <scope>compile</scope>
        </dependency>
        <!-- Source: https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-oauth2-client -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-oauth2-client</artifactId>
            <version>4.0.2</version>
            <scope>compile</scope>
        </dependency>
  • SecurityConfig.javaを下記で作成します:
package nob.example.easyapp.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.Customizer;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
public class SecurityConfig {

    @Bean
    SecurityFilterChain filterChain(HttpSecurity http) throws Exception {

        http
                .authorizeHttpRequests((authorize) -> authorize
                        .anyRequest().authenticated())
                .oauth2Login(Customizer.withDefaults()); // Authorization Code Flow / OAuth2 Login を有効化
        return http.build();
    }
}
  • サンプルAPIを下記で作成します:
package nob.example.easyapp.controller;

import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.oauth2.core.user.OAuth2User;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * サンプルのAPIです。
 *
 * @author nob
 */
@RestController
@RequestMapping(value = "/api/v1")
public class SampleController {

    /**
     * 認証が必要なAPIです。
     *
     * @return 挨拶メッセージ
     */
    @GetMapping("/me")
    public String me(@AuthenticationPrincipal OAuth2User user) {
        return "Hello " + user.getAttribute("preferred_username");
    }
}
  • application.propertiesに下記を追記します:
server.port=8081

spring.security.oauth2.client.registration.keycloak.client-id=easyapp
spring.security.oauth2.client.registration.keycloak.client-secret=TODO_ADD_CLIENT_SECRET
spring.security.oauth2.client.registration.keycloak.scope=openid
spring.security.oauth2.client.registration.keycloak.authorization-grant-type=authorization_code
spring.security.oauth2.client.registration.keycloak.redirect-uri={baseUrl}/login/oauth2/code/{registrationId}
spring.security.oauth2.client.provider.keycloak.issuer-uri=http://localhost:8080/realms/easyapp

API打鍵

ブラウザ上で http://localhost:8081/api/v1/me にアクセスすると(未認証であれば)Keycloakの画面にリダイレクトし、認証後に業務アプリのコンテンツを取得できます。