Springboot整合第三方登錄功能的實現(xiàn)示例
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; /** * 授權(quán)完畢跳轉(zhuǎn) */ @ApiOperation(value = "授權(quán)完畢跳轉(zhuǎn)(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); } /** * 獲取認(rèn)證信息 */ @ApiOperation(value = "獲取認(rèn)證信息(RequestMapping)") @RequestMapping("/oauth/callback/{source}") public Object login(@PathVariable("source") String source, AuthCallback callback) { AuthRequest authRequest = SocialUtil.getAuthRequest(source, socialProperties); return authRequest.login(callback); } /** * 撤銷授權(quán) */ @ApiOperation(value = "撤銷授權(quán)(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()); } /** * 續(xù)期accessToken */ @ApiOperation(value = "續(xù)期令牌(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開放平臺創(chuàng)建應(yīng)用配置
請求地址
http://127.0.0.1/auth/oauth/render/gitee
跳轉(zhuǎn)gitee登錄
登錄后,自動回調(diào),獲取用戶信息
更多平臺的集成教程請看
到此這篇關(guān)于Springboot整合第三方登錄功能的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)Springboot 第三方登錄內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring?Boot?集成Elasticsearch模塊實現(xiàn)簡單查詢功能
本文講解了Spring?Boot集成Elasticsearch采用的是ES模板的方式實現(xiàn)基礎(chǔ)查詢,本文結(jié)合實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2022-06-06關(guān)于@EnableGlobalMethodSecurity注解的用法解讀
這篇文章主要介紹了關(guān)于@EnableGlobalMethodSecurity注解的用法解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03Java實現(xiàn)限定時間CountDownLatch并行場景
本文將結(jié)合實例代碼,介紹Java實現(xiàn)限定時間CountDownLatch并行場景,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-07-07Springboot項目啟動時如何用命令動態(tài)指定環(huán)境
這篇文章主要介紹了Springboot項目啟動時如何用命令動態(tài)指定環(huán)境的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06