微信登录

OAuth2 集成 - OAuth2 简介 - 开放授权标准

Java - Web - Spring 《OAuth2 集成 - OAuth2 简介 - 开放授权标准》

一、OAuth2 简介

OAuth2(Open Authorization 2.0)是一种开放的授权标准,它允许用户(资源所有者)授权第三方应用访问他们存储在另一个服务提供商上的资源,而无需将用户名和密码提供给第三方应用。这极大地增强了用户数据的安全性,同时也为第三方应用提供了一种安全、便捷的方式来访问用户资源。

OAuth2 的主要应用场景包括社交登录(如使用微信、QQ、Google 等账号登录第三方应用)、API 访问授权等。

核心概念

  • 资源所有者(Resource Owner):拥有资源的用户,例如使用社交账号登录第三方应用的用户。
  • 客户端(Client):请求访问资源的第三方应用,如需要获取用户微信信息的某个 APP。
  • 授权服务器(Authorization Server):负责验证资源所有者的身份,并向客户端颁发授权凭证(如授权码、访问令牌等)。
  • 资源服务器(Resource Server):存储用户资源的服务器,它会验证客户端提供的访问令牌,并决定是否允许客户端访问资源。

授权流程

OAuth2 定义了四种授权流程:授权码模式、简化模式、密码模式和客户端凭证模式。其中,授权码模式是最常用且最安全的模式,下面将重点介绍该模式。

二、授权码模式流程

  1. 客户端请求授权:客户端将用户重定向到授权服务器的授权端点,请求用户授权。请求中包含客户端 ID、重定向 URI、请求的权限范围等信息。
  2. 用户授权:用户在授权服务器上登录并确认是否授权给客户端。
  3. 授权服务器返回授权码:如果用户授权,授权服务器将用户重定向回客户端指定的重定向 URI,并附带一个授权码。
  4. 客户端换取访问令牌:客户端使用授权码向授权服务器的令牌端点发送请求,换取访问令牌。请求中包含授权码、客户端 ID、客户端密钥等信息。
  5. 授权服务器颁发访问令牌:授权服务器验证客户端的请求,验证通过后颁发访问令牌。
  6. 客户端使用访问令牌访问资源:客户端使用访问令牌向资源服务器发送请求,访问用户的资源。

三、Spring 集成 OAuth2 演示代码

项目环境

  • Java 8 及以上
  • Spring Boot 2.x
  • Spring Security OAuth2

步骤 1:创建 Spring Boot 项目

可以使用 Spring Initializr(https://start.spring.io/)创建一个包含 Spring Web、Spring Security 和 Spring Security OAuth2 Client 的项目。

步骤 2:配置授权服务器

  1. import org.springframework.context.annotation.Bean;
  2. import org.springframework.context.annotation.Configuration;
  3. import org.springframework.security.config.annotation.web.builders.HttpSecurity;
  4. import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
  5. import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
  6. import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository;
  7. import org.springframework.security.oauth2.client.web.OAuth2AuthorizationRequestRedirectFilter;
  8. import org.springframework.security.oauth2.client.web.OAuth2LoginAuthenticationFilter;
  9. import org.springframework.security.web.SecurityFilterChain;
  10. @Configuration
  11. @EnableWebSecurity
  12. public class SecurityConfig {
  13. @Bean
  14. public SecurityFilterChain securityFilterChain(HttpSecurity http, ClientRegistrationRepository clientRegistrationRepository) throws Exception {
  15. http
  16. .authorizeRequests()
  17. .anyRequest().authenticated()
  18. .and()
  19. .oauth2Login();
  20. return http.build();
  21. }
  22. }

步骤 3:配置 application.properties

  1. spring.security.oauth2.client.registration.google.client-id=your-google-client-id
  2. spring.security.oauth2.client.registration.google.client-secret=your-google-client-secret
  3. spring.security.oauth2.client.registration.google.scope=openid,profile,email
  4. spring.security.oauth2.client.provider.google.authorization-uri=https://accounts.google.com/o/oauth2/v2/auth
  5. spring.security.oauth2.client.provider.google.token-uri=https://www.googleapis.com/oauth2/v4/token
  6. spring.security.oauth2.client.provider.google.user-info-uri=https://www.googleapis.com/oauth2/v3/userinfo
  7. spring.security.oauth2.client.provider.google.user-name-attribute=sub

步骤 4:创建控制器

  1. import org.springframework.web.bind.annotation.GetMapping;
  2. import org.springframework.web.bind.annotation.RestController;
  3. @RestController
  4. public class HomeController {
  5. @GetMapping("/")
  6. public String home() {
  7. return "Welcome to the protected resource!";
  8. }
  9. }

步骤 5:运行项目

启动 Spring Boot 项目,访问 http://localhost:8080,会自动重定向到 Google 的授权页面,用户登录并授权后,会返回到项目的首页。

四、总结

概念 描述
资源所有者 拥有资源的用户
客户端 请求访问资源的第三方应用
授权服务器 验证用户身份并颁发授权凭证
资源服务器 存储用户资源并验证访问令牌
授权码模式 最常用且最安全的授权流程

OAuth2 作为一种开放授权标准,为用户和第三方应用提供了安全、便捷的资源访问方式。通过 Spring 集成 OAuth2,我们可以轻松实现社交登录、API 访问授权等功能。在实际应用中,需要根据具体需求选择合适的授权流程,并注意保护用户的隐私和数据安全。

OAuth2 集成 - OAuth2 简介 - 开放授权标准-书闪专业知识库