Springboot 第三方登录
洛阳泰山 人气:0springboot 项目的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登录
登录后,自动回调,获取用户信息
更多平台的集成教程请看
加载全部内容