
OAuth2(Open Authorization 2.0)是一种开放的授权标准,它允许用户(资源所有者)授权第三方应用访问他们存储在另一个服务提供商上的资源,而无需将用户名和密码提供给第三方应用。这极大地增强了用户数据的安全性,同时也为第三方应用提供了一种安全、便捷的方式来访问用户资源。
OAuth2 的主要应用场景包括社交登录(如使用微信、QQ、Google 等账号登录第三方应用)、API 访问授权等。
OAuth2 定义了四种授权流程:授权码模式、简化模式、密码模式和客户端凭证模式。其中,授权码模式是最常用且最安全的模式,下面将重点介绍该模式。
可以使用 Spring Initializr(https://start.spring.io/)创建一个包含 Spring Web、Spring Security 和 Spring Security OAuth2 Client 的项目。
import org.springframework.context.annotation.Bean;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.annotation.web.configuration.WebSecurityConfigurerAdapter;import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository;import org.springframework.security.oauth2.client.web.OAuth2AuthorizationRequestRedirectFilter;import org.springframework.security.oauth2.client.web.OAuth2LoginAuthenticationFilter;import org.springframework.security.web.SecurityFilterChain;@Configuration@EnableWebSecuritypublic class SecurityConfig {@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http, ClientRegistrationRepository clientRegistrationRepository) throws Exception {http.authorizeRequests().anyRequest().authenticated().and().oauth2Login();return http.build();}}
spring.security.oauth2.client.registration.google.client-id=your-google-client-idspring.security.oauth2.client.registration.google.client-secret=your-google-client-secretspring.security.oauth2.client.registration.google.scope=openid,profile,emailspring.security.oauth2.client.provider.google.authorization-uri=https://accounts.google.com/o/oauth2/v2/authspring.security.oauth2.client.provider.google.token-uri=https://www.googleapis.com/oauth2/v4/tokenspring.security.oauth2.client.provider.google.user-info-uri=https://www.googleapis.com/oauth2/v3/userinfospring.security.oauth2.client.provider.google.user-name-attribute=sub
import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class HomeController {@GetMapping("/")public String home() {return "Welcome to the protected resource!";}}
启动 Spring Boot 项目,访问 http://localhost:8080,会自动重定向到 Google 的授权页面,用户登录并授权后,会返回到项目的首页。
| 概念 | 描述 |
|---|---|
| 资源所有者 | 拥有资源的用户 |
| 客户端 | 请求访问资源的第三方应用 |
| 授权服务器 | 验证用户身份并颁发授权凭证 |
| 资源服务器 | 存储用户资源并验证访问令牌 |
| 授权码模式 | 最常用且最安全的授权流程 |
OAuth2 作为一种开放授权标准,为用户和第三方应用提供了安全、便捷的资源访问方式。通过 Spring 集成 OAuth2,我们可以轻松实现社交登录、API 访问授权等功能。在实际应用中,需要根据具体需求选择合适的授权流程,并注意保护用户的隐私和数据安全。