20 - Spring Boot OAuth2
03/03/2025 - 3 phút
Trong bài viết này, chúng ta sẽ tìm hiểu về Spring Boot OAuth2, cách bảo mật ứng dụng với OAuth2.
1. Giới Thiệu
Trong thế giới hiện đại, bảo mật là yếu tố quan trọng trong bất kỳ ứng dụng nào. OAuth2 là một trong những tiêu chuẩn phổ biến nhất để xác thực và ủy quyền trong ứng dụng web và API.
Spring Boot OAuth2 giúp bạn:
- Xác thực người dùng thông qua Google, Facebook, GitHub… (OAuth2 Login).
- Bảo vệ API với JWT hoặc Authorization Server.
- Quản lý quyền hạn trong ứng dụng.
Trong bài viết này, chúng ta sẽ tìm hiểu về OAuth2 với Spring Boot, cách cài đặt và cấu hình để bảo vệ ứng dụng hiệu quả.
2. Các Thành Phần Chính Trong OAuth2
Thành phần | Mô tả |
---|---|
Resource Owner | Người dùng đang đăng nhập vào hệ thống. |
Client | Ứng dụng cần quyền truy cập dữ liệu (ví dụ: ứng dụng web hoặc mobile). |
Authorization Server | Máy chủ cấp phát token (Google, Facebook, Keycloak…). |
Resource Server | Máy chủ API cần bảo vệ. |
Access Token | Mã thông báo (JWT) xác thực quyền truy cập. |
OAuth2 hỗ trợ nhiều flow xác thực, phổ biến nhất là Authorization Code Flow và Client Credentials Flow.
3. Cấu Hình OAuth2 Login Với Google (OAuth2 Login)
3.1. Thêm Dependency
Spring Boot hỗ trợ OAuth2 thông qua Spring Security OAuth2. Thêm vào pom.xml
:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>
3.2. Cấu Hình OAuth2 Trong application.yml
spring:
security:
oauth2:
client:
registration:
google:
client-id: YOUR_GOOGLE_CLIENT_ID
client-secret: YOUR_GOOGLE_CLIENT_SECRET
scope: profile, email
Lưu ý: Thay
YOUR_GOOGLE_CLIENT_ID
vàYOUR_GOOGLE_CLIENT_SECRET
bằng thông tin từ Google Developer Console.
3.3. Tạo Controller Kiểm Tra Đăng Nhập OAuth2
import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/user")
public class UserController {
@GetMapping("/info")
public Object getUserInfo(OAuth2AuthenticationToken authentication) {
return authentication.getPrincipal().getAttributes();
}
}
3.4. Kiểm Tra OAuth2 Login
Sau khi khởi động ứng dụng, truy cập:
http://localhost:8080/login/oauth2/code/google
Sau khi đăng nhập, truy vấn thông tin người dùng qua API:
http://localhost:8080/user/info
4. Bảo Vệ API Với OAuth2 Resource Server (JWT)
4.1. Thêm Dependency Cho Resource Server
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
</dependency>
4.2. Cấu Hình Resource Server Với JWT
spring:
security:
oauth2:
resourceserver:
jwt:
issuer-uri: https://accounts.google.com
4.3. Cấu Hình SecurityConfig Cho Resource Server
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationConverter;
import org.springframework.security.oauth2.server.resource.authentication.JwtGrantedAuthoritiesConverter;
@Configuration
@EnableWebSecurity
public class SecurityConfig {
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/public").permitAll()
.antMatchers("/admin").hasRole("ADMIN")
.anyRequest().authenticated()
.and()
.oauth2ResourceServer()
.jwt();
}
}
4.4. Kiểm Tra Resource Server
Sau khi triển khai, bạn có thể gửi Access Token từ Google hoặc Keycloak để truy cập API.
curl -H "Authorization: Bearer YOUR_ACCESS_TOKEN" http://localhost:8080/protected-api
5. Cấu Hình OAuth2 Authorization Server (Spring Authorization Server)
Nếu bạn muốn tạo OAuth2 Authorization Server của riêng mình, bạn có thể sử dụng Spring Authorization Server.
5.1. Thêm Dependency
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-authorization-server</artifactId>
</dependency>
5.2. Cấu Hình Authorization Server
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.oauth2.server.authorization.config.annotation.web.configuration.OAuth2AuthorizationServerConfigurer;
import org.springframework.security.oauth2.server.authorization.settings.ClientSettings;
import org.springframework.security.oauth2.server.authorization.settings.TokenSettings;
import java.time.Duration;
@Configuration
public class AuthorizationServerConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
OAuth2AuthorizationServerConfigurer<HttpSecurity> authorizationServerConfigurer = new OAuth2AuthorizationServerConfigurer<>();
http.apply(authorizationServerConfigurer);
return http.build();
}
@Bean
public RegisteredClientRepository registeredClientRepository() {
RegisteredClient client = RegisteredClient.withId(UUID.randomUUID().toString())
.clientId("my-client")
.clientSecret("{noop}secret")
.authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE)
.tokenSettings(TokenSettings.builder().accessTokenTimeToLive(Duration.ofHours(1)).build())
.clientSettings(ClientSettings.builder().requireAuthorizationConsent(true).build())
.build();
return new InMemoryRegisteredClientRepository(client);
}
}
Sau khi triển khai, bạn có thể cấp phát token bằng Authorization Code Flow từ chính ứng dụng của mình.
6. Kết Luận
Spring Boot OAuth2 giúp bảo mật ứng dụng với các giải pháp xác thực hiện đại như Google, JWT, Authorization Server.
Tóm tắt:
- OAuth2 Login giúp đăng nhập bằng Google, Facebook…
- OAuth2 Resource Server bảo vệ API với JWT.
- OAuth2 Authorization Server tạo hệ thống quản lý token riêng.
Như vậy ta đã đi qua hết series về Spring Boot Basic. Hy vọng bạn đã học được nhiều điều bổ ích từ series này. Hãy thực hành và xây dựng ứng dụng Spring Boot của riêng bạn!