Springboot整合第三方登录功能的实现示例

网友投稿 356 2022-09-01


Springboot整合第三方登录功能的实现示例

springboot 项目的pom文件引入依赖

me.zhyd.oauth

JustAuth

{latest-version}&lthttp://;/version>

代码

登录端点(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 BladeSoOEEFFxmgUocialEndpoint {

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) {

http:// 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 oauth = Maps.newHashMap();

private Map 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登录

登录后,自动回调,获取用户信息

更多平台的集成教程请看

QQ登录 | JustAuth


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Python爬虫技术--基础篇--Python开发环境安装(python爬虫教程(非常详细))
下一篇:Python爬虫技术--基础篇--错误,调试和测试(上)(python爬虫异常处理)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~