Springboot集成微信、支付宝、QQ等第三方登录
首先,为了实现第三方登录,我们需要注册开发者账号并创建应用程序。对于微信、支付宝、QQ等第三方登录,我们需要分别在相应的开放平台上进行注册。
接下来,我们需要在Spring Boot中添加依赖项,以便我们能够使用第三方登录API。为此,我们需要添加以下依赖项:
<dependency>
<groupId>org.springframework.security.oauth.boot</groupId>
<artifactId>spring-security-oauth2-autoconfigure</artifactId>
<version>2.3.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security.oauth.boot</groupId>
<artifactId>spring-security-oauth2-client</artifactId>
<version>2.3.3.RELEASE</version>
</dependency>
接下来,我们需要配置Spring Security以使用第三方登录。在application.properties文件中添加以下配置:
# 微信登录
spring.security.oauth2.client.registration.weixin.client-id=YOUR_WEIXIN_APP_ID
spring.security.oauth2.client.registration.weixin.client-secret=YOUR_WEIXIN_APP_SECRET
spring.security.oauth2.client.registration.weixin.scope=snsapi_login
spring.security.oauth2.client.registration.weixin.client-name=weixin
spring.security.oauth2.client.registration.weixin.authorization-grant-type=authorization_code
spring.security.oauth2.client.registration.weixin.redirect-uri=http://localhost:8080/login/oauth2/code/weixin
# 支付宝登录
spring.security.oauth2.client.registration.alipay.client-id=YOUR_ALIPAY_APP_ID
spring.security.oauth2.client.registration.alipay.client-secret=YOUR_ALIPAY_APP_SECRET
spring.security.oauth2.client.registration.alipay.scope=auth_user
spring.security.oauth2.client.registration.alipay.client-name=alipay
spring.security.oauth2.client.registration.alipay.authorization-grant-type=authorization_code
spring.security.oauth2.client.registration.alipay.redirect-uri=http://localhost:8080/login/oauth2/code/alipay
# QQ登录
spring.security.oauth2.client.registration.qq.client-id=YOUR_QQ_APP_ID
spring.security.oauth2.client.registration.qq.client-secret=YOUR_QQ_APP_SECRET
spring.security.oauth2.client.registration.qq.scope=get_user_info
spring.security.oauth2.client.registration.qq.client-name=qq
spring.security.oauth2.client.registration.qq.authorization-grant-type=authorization_code
spring.security.oauth2.client.registration.qq.redirect-uri=http://localhost:8080/login/oauth2/code/qq
或
spring:
security:
oauth2:
client:
registration:
# 微信登录
weixin:
client-id: YOUR_WEIXIN_APP_ID
client-secret: YOUR_WEIXIN_APP_SECRET
scope: snsapi_login
client-name: weixin
authorization-grant-type: authorization_code
redirect-uri: http://localhost:8080/login/oauth2/code/weixin
# 支付宝登录
alipay:
client-id: YOUR_ALIPAY_APP_ID
client-secret: YOUR_ALIPAY_APP_SECRET
scope: auth_user
client-name: alipay
authorization-grant-type: authorization_code
redirect-uri: http://localhost:8080/login/oauth2/code/alipay
# QQ登录
qq:
client-id: YOUR_QQ_APP_ID
client-secret: YOUR_QQ_APP_SECRET
scope: get_user_info
client-name: qq
authorization-grant-type: authorization_code
redirect-uri: http://localhost:8080/login/oauth2/code/qq
接下来,我们需要创建一个WebSecurityConfigurerAdapter实例,并覆盖configure方法。在这个方法中,我们需要配置哪些URL需要被保护,哪些URL可以被所有人访问,以及如何处理登录和退出。下面是一个示例:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
// 所有人都可以访问根路径
.antMatchers("/").permitAll()
// 其他的URL需要登录后才能访问
.anyRequest().authenticated()
.and()
// 启用OAuth2登录支持
.oauth2Login()
.and()
// 配置退出功能
.logout()
.logoutSuccessUrl("/");
}
}
上面的代码中,我们通过 WebSecurityConfigurerAdapter 类来配置 Spring Security。在 configure(HttpSecurity http) 方法中,我们使用 authorizeRequests() 方法来指定哪些URL需要被保护,哪些URL可以被所有人访问。在这里,我们指定了根路径可以被所有人访问,其他的URL需要登录后才能访问。
接下来,我们启用了OAuth2登录支持,使用 .oauth2Login() 方法来完成。在这里,我们使用Spring Security提供的默认的OAuth2登录页面,用户可以选择使用微信、支付宝、QQ等第三方登录。
我们使用 .logout() 方法来配置退出功能,并使用 .logoutSuccessUrl(“/”) 方法来指定退出后跳转到根路径。
最后,我们需要创建一个控制器来处理第三方登录的回调。在这个控制器中,我们需要解析回调中的授权码,并使用它来获取访问令牌和用户信息。以下是一个示例控制器
@Controller
public class OAuth2LoginController {
@Autowired
private OAuth2AuthorizedClientService authorizedClientService;
@GetMapping("/login/oauth2/code/{client}")
public String loginSuccess(@PathVariable("client") String client,
OAuth2AuthenticationToken authentication,
HttpSession session) {
OAuth2AuthorizedClient clientDetails = authorizedClientService.loadAuthorizedClient(
authentication.getAuthorizedClientRegistrationId(),
authentication.getName());
String accessToken = clientDetails.getAccessToken().getTokenValue();
// 根据不同的第三方登录平台,使用不同的API获取用户信息
switch (client) {
case "weixin":
// 使用微信API获取用户信息
break;
case "alipay":
// 使用支付宝API获取用户信息
break
case "qq":
// 使用QQ API获取用户信息
break;
default:
// 不支持的第三方登录平台
throw new IllegalArgumentException("Unsupported client: " + client);
}
// 将用户信息存储到session中,以便在后续的操作中使用
session.setAttribute("accessToken", accessToken);
session.setAttribute("userInfo", userInfo);
return "redirect:/";
}
}
上面的代码是处理OAuth2登录成功后的回调函数。当用户成功登录后,Spring Security会将用户信息存储在会话中,并重定向到根路径。在回调函数中,我们首先使用 OAuth2AuthorizedClientService 对象来获取OAuth2的客户端信息,包括访问令牌等信息。然后根据不同的第三方登录平台,使用不同的API获取用户信息。最后,我们将用户信息存储到会话中,以便在后续的操作中使用。
总的来说,以上代码实现了一个简单的Spring Boot集成微信、支付宝、QQ等第三方登录的博客。当用户使用第三方账号登录后,我们将其访问令牌和用户信息存储在会话中,以便在后续的操作中使用。这样,我们可以在博客中使用第三方账号登录,避免了用户需要另外注册账号的麻烦。