Springboot整合第三方登录功能的实现示例
springboot 项目的pom文件引入依赖
<dependency> <groupId>me.zhyd.oauth</groupId> <artifactId>JustAuth</artifactId> <version>{latest-version}</version> </dependency>
代码
登录端点(controller)
import com.tarzan.cms.common.properties.SocialProperties; import com.tarzan.cms.utils.SocialUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import me.zhyd.oauth.model.AuthCallback; import me.zhyd.oauth.model.AuthToken; import me.zhyd.oauth.request.AuthRequest; import me.zhyd.oauth.utils.AuthStateUtils; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * 第三方登陆端点 * * @author tarzan */ @Slf4j @RestController @AllArgsConstructor @RequestMapping("auth") @ConditionalOnProperty(value = "social.enabled", havingValue = "true") @Api(value = "第三方登陆", tags = "第三方登陆端点") public class BladeSocialEndpoint { private final SocialProperties socialProperties; /** * 授权完毕跳转 */ @ApiOperation(value = "授权完毕跳转(RequestMapping)") @RequestMapping("/oauth/render/{source}") public void renderAuth(@PathVariable("source") String source, HttpServletResponse response) throws IOException { AuthRequest authRequest = SocialUtil.getAuthRequest(source, socialProperties); String authorizeUrl = authRequest.authorize(AuthStateUtils.createState()); response.sendRedirect(authorizeUrl); } /** * 获取认证信息 */ @ApiOperation(value = "获取认证信息(RequestMapping)") @RequestMapping("/oauth/callback/{source}") public Object login(@PathVariable("source") String source, AuthCallback callback) { AuthRequest authRequest = SocialUtil.getAuthRequest(source, socialProperties); return authRequest.login(callback); } /** * 撤销授权 */ @ApiOperation(value = "撤销授权(RequestMapping)") @RequestMapping("/oauth/revoke/{source}/{token}") public Object revokeAuth(@PathVariable("source") String source, @PathVariable("token") String token) { AuthRequest authRequest = SocialUtil.getAuthRequest(source, socialProperties); return authRequest.revoke(AuthToken.builder().accessToken(token).build()); } /** * 续期accessToken */ @ApiOperation(value = "续期令牌(RequestMapping)") @RequestMapping("/oauth/refresh/{source}") public Object refreshAuth(@PathVariable("source") String source, String token) { AuthRequest authRequest = SocialUtil.getAuthRequest(source, socialProperties); return authRequest.refresh(AuthToken.builder().refreshToken(token).build()); } }
工具类代码
import com.tarzan.cms.common.properties.SocialProperties; import me.zhyd.oauth.config.AuthConfig; import me.zhyd.oauth.config.AuthDefaultSource; import me.zhyd.oauth.exception.AuthException; import me.zhyd.oauth.request.*; import java.util.Objects; public class SocialUtil { public SocialUtil() { } public static AuthRequest getAuthRequest(String source, SocialProperties socialProperties) { AuthDefaultSource authSource = (AuthDefaultSource)Objects.requireNonNull(AuthDefaultSource.valueOf(source.toUpperCase())); AuthConfig authConfig = (AuthConfig)socialProperties.getOauth().get(authSource); if (authConfig == null) { throw new AuthException("未获取到有效的Auth配置"); } else { AuthRequest authRequest = null; switch(authSource) { case GITHUB: authRequest = new AuthGithubRequest(authConfig); break; case GITEE: authRequest = new AuthGiteeRequest(authConfig); break; case OSCHINA: authRequest = new AuthOschinaRequest(authConfig); break; case QQ: authRequest = new AuthQqRequest(authConfig); break; case WECHAT_OPEN: authRequest = new AuthWeChatOpenRequest(authConfig); break; case WECHAT_ENTERPRISE: authRequest = new AuthWeChatEnterpriseRequest(authConfig); break; case WECHAT_MP: authRequest = new AuthWeChatMpRequest(authConfig); break; case DINGTALK: authRequest = new AuthDingTalkRequest(authConfig); break; case ALIPAY: authRequest = new AuthAlipayRequest(authConfig); break; case BAIDU: authRequest = new AuthBaiduRequest(authConfig); break; case WEIBO: authRequest = new AuthWeiboRequest(authConfig); break; case CODING: authRequest = new AuthCodingRequest(authConfig); break; case CSDN: authRequest = new AuthCsdnRequest(authConfig); break; case TAOBAO: authRequest = new AuthTaobaoRequest(authConfig); break; case GOOGLE: authRequest = new AuthGoogleRequest(authConfig); break; case FACEBOOK: authRequest = new AuthFacebookRequest(authConfig); break; case DOUYIN: authRequest = new AuthDouyinRequest(authConfig); break; case LINKEDIN: authRequest = new AuthLinkedinRequest(authConfig); break; case MICROSOFT: authRequest = new AuthMicrosoftRequest(authConfig); break; case MI: authRequest = new AuthMiRequest(authConfig); break; case TOUTIAO: authRequest = new AuthToutiaoRequest(authConfig); break; case TEAMBITION: authRequest = new AuthTeambitionRequest(authConfig); break; case PINTEREST: authRequest = new AuthPinterestRequest(authConfig); break; case RENREN: authRequest = new AuthRenrenRequest(authConfig); break; case STACK_OVERFLOW: authRequest = new AuthStackOverflowRequest(authConfig); break; case HUAWEI: authRequest = new AuthHuaweiRequest(authConfig); break; case KUJIALE: authRequest = new AuthKujialeRequest(authConfig); break; case GITLAB: authRequest = new AuthGitlabRequest(authConfig); break; case MEITUAN: authRequest = new AuthMeituanRequest(authConfig); break; case ELEME: authRequest = new AuthElemeRequest(authConfig); break; case TWITTER: authRequest = new AuthTwitterRequest(authConfig); } if (null == authRequest) { throw new AuthException("未获取到有效的Auth配置"); } else { return (AuthRequest)authRequest; } } } }
登录配置类
import com.google.common.collect.Maps; import lombok.Data; import me.zhyd.oauth.config.AuthConfig; import me.zhyd.oauth.config.AuthDefaultSource; import org.springframework.boot.context.properties.ConfigurationProperties; import java.util.Map; @Data @ConfigurationProperties(prefix = "social") public class SocialProperties { private Boolean enabled = false; private String domain; private Map<AuthDefaultSource, AuthConfig> oauth = Maps.newHashMap(); private Map<String, String> alias = Maps.newHashMap(); }
application.yml配置 以gitee为例
social: enabled: true domain: http://127.0.0.1 oauth: QQ: client-id: xxx client-secret: xxx redirect-uri: http://127.0.0.1:8443/oauth/gitee/callback WECHAT_OPEN: client-id: xxxxxx client-secret: xxxxxx redirect-uri: http://127.0.0.1:8443/oauth/baidu/callback GITEE: client-id: 5b693811f8229e38146f2c482e3f4e4dfbdf2b496d494698b6308d6f35dcb2e0 client-secret: 428ff220b5aa5704c55a8cf91f13aa4466258a6e7c357c7e30a5bca1d1cbe4e2 redirect-uri: http://127.0.0.1/auth/oauth/callback/GITEE
gitee开放平台创建应用配置
请求地址
http://127.0.0.1/auth/oauth/render/gitee
跳转gitee登录
登录后,自动回调,获取用户信息
更多平台的集成教程请看
到此这篇关于Springboot整合第三方登录功能的实现示例的文章就介绍到这了,更多相关Springboot 第三方登录内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
赞 (0)