From c94b123a4bbe336b2b21c0f87aa65772490a73df Mon Sep 17 00:00:00 2001 From: "yadong.zhang" Date: Tue, 3 Sep 2019 20:39:19 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20=E9=9B=86=E6=88=90Gitlab?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.en-US.md | 6 +- README.md | 58 +++++------ docs/README.md | 36 +++++-- docs/_sidebar.md | 2 +- docs/how-to-use.md | 6 +- docs/update.md | 4 + pom.xml | 2 +- .../java/me/zhyd/oauth/config/AuthSource.java | 23 +++++ .../zhyd/oauth/request/AuthGithubRequest.java | 18 ++-- .../zhyd/oauth/request/AuthGitlabRequest.java | 95 +++++++++++++++++++ 10 files changed, 201 insertions(+), 49 deletions(-) create mode 100644 src/main/java/me/zhyd/oauth/request/AuthGitlabRequest.java diff --git a/README.en-US.md b/README.en-US.md index 7617b23..ff09f99 100644 --- a/README.en-US.md +++ b/README.en-US.md @@ -65,6 +65,7 @@ + @@ -92,7 +93,7 @@ These artifacts are available from Maven Central: me.zhyd.oauth JustAuth - 1.11.0 + ${latest.version} ``` - Using JustAuth @@ -147,8 +148,9 @@ authRequest.login(callback); | | [AuthStackOverflowRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthStackOverflowRequest.java) | 参考文档 | | | [AuthHuaweiRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthHuaweiRequest.java) | 参考文档 | | | [AuthWeChatEnterpriseRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthWeChatEnterpriseRequest.java) | 参考文档 | -| | [AuthCsdnRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthCsdnRequest.java) | 无 | | | [AuthKujialeRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthKujialeRequest.java) | 参考文档 | +| | [AuthGitlabRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthGitlabRequest.java) | 参考文档 | +| | [AuthCsdnRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthCsdnRequest.java) | 无 | diff --git a/README.md b/README.md index 31823e2..ecb8e2d 100644 --- a/README.md +++ b/README.md @@ -34,37 +34,38 @@
- - - - - - - - - - - - - - - + + + + + + + + + + + + + + +
- - - - - - - - - - - - + + + + + + + + + + + + +
@@ -157,8 +158,9 @@ authRequest.login(callback); | | [AuthStackOverflowRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthStackOverflowRequest.java) | 参考文档 | | | [AuthHuaweiRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthHuaweiRequest.java) | 参考文档 | | | [AuthWeChatEnterpriseRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthWeChatEnterpriseRequest.java) | 参考文档 | -| | [AuthCsdnRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthCsdnRequest.java) | 无 | | | [AuthKujialeRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthKujialeRequest.java) | 参考文档 | +| | [AuthGitlabRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthGitlabRequest.java) | 参考文档 | +| | [AuthCsdnRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthCsdnRequest.java) | 无 | _请知悉:经咨询CSDN官方客服得知,CSDN的授权开放平台已经下线。如果以前申请过的应用,可以继续使用,但是不再支持申请新的应用。so, 本项目中的CSDN登录只能针对少部分用户使用了_ diff --git a/docs/README.md b/docs/README.md index 735a61a..c78def2 100644 --- a/docs/README.md +++ b/docs/README.md @@ -89,6 +89,7 @@ JustAuth,如你所见,它仅仅是一个**第三方授权登录**的**工具 | | [AuthWeChatEnterpriseRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthWeChatEnterpriseRequest.java) | 参考文档 | | | [AuthCsdnRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthCsdnRequest.java) | 无 | | | [AuthKujialeRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthKujialeRequest.java) | 参考文档 | +| | [AuthGitlabRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthGitlabRequest.java) | 参考文档 | ## 快速开始 @@ -98,7 +99,7 @@ JustAuth,如你所见,它仅仅是一个**第三方授权登录**的**工具 me.zhyd.oauth JustAuth - 1.11.0 + ${latest.version} ``` - 调用api @@ -116,18 +117,37 @@ authRequest.authorize("state"); authRequest.login(callback); ``` -## 贡献代码 +## 参与&贡献 + +JustAuth的发展离不开朋友们的支持,时至今日,JustAuth已渐趋完善,但仍有很大的改善空间。欢迎各位朋友为JustAuth贡献一份力量。 + +### 提供bug或建议 + +- [Gitee](https://gitee.com/yadong.zhang/JustAuth/issues) +- [Github](https://github.com/justauth/JustAuth/issues) + +如果你正在使用JustAuth,可以在这儿留下你的足迹,获得优先推送、曝光 + +- [Gitee](https://gitee.com/yadong.zhang/JustAuth/issues/IZ2T7) +- [Github](https://github.com/justauth/JustAuth/issues/17) + +### 贡献代码的步骤 1. fork本项目到自己的repo -2. 把fork过去的项目也就是你仓库中的项目clone到你的本地 -3. 修改代码 -4. commit后push到自己的库 +2. 把fork过去的项目也就是你仓库中的项目clone到你本地 +3. 修改代码(`dev`分支) +4. commit后push到自己的仓库 5. 发起PR(pull request) 请求,提交到`dev`分支 -6. 等待作者合并 +6. 等待合并 + +### 注意事项 -_注:JustAuth只接受集成oauth2.0的平台_ +1. JustAuth只接受集成**OAuth2.0**的平台 +2. 建议安装“**阿里编码规约**”插件,然后进行开发 +3. 提交PR前请格式化好自己的代码 +4. 注释规范,自定义的方法一定要加上:方法说明、参数说明、返回值说明等 -## 关于功能尝鲜 +## 功能尝鲜 JustAuth一共有两个主要分支: - 线上版分支(master):稳定版,发布版就是这个分支的代码 diff --git a/docs/_sidebar.md b/docs/_sidebar.md index ad462e1..03834fb 100644 --- a/docs/_sidebar.md +++ b/docs/_sidebar.md @@ -1,4 +1,4 @@ -- [概述](README.md) +- [入门和使用](README.md) - 快速开始 - [名词解释](explain.md) - [如何使用](how-to-use.md) diff --git a/docs/how-to-use.md b/docs/how-to-use.md index bc0e794..6d67086 100644 --- a/docs/how-to-use.md +++ b/docs/how-to-use.md @@ -2,10 +2,10 @@ 既然牛皮吹下了, 那么如何才能用JustAuth实现第三方登录呢? -使用JustAuth总共分三步(**这三步也适合于任何一个支持的平台**): +使用JustAuth总共分三步(**这三步也适合于JustAuth支持的任何一个平台**): 1. 申请注册第三方平台的开发者账号 -2. 创建第三方平台的应用,获取配置信息(id, secret, callbackUrl) +2. 创建第三方平台的应用,获取配置信息(`accessKey`, `secretKey`, `redirectUri`) 3. 使用该工具实现授权登陆 @@ -14,7 +14,7 @@ me.zhyd.oauth JustAuth - 1.11.0 + ${latest.version} ``` - 调用api diff --git a/docs/update.md b/docs/update.md index 2a4ace3..4bbdf7b 100644 --- a/docs/update.md +++ b/docs/update.md @@ -1,4 +1,8 @@ ## v1.11.0 +### 2019/09/03 + +- 集成“Gitlab”授权登录 + ### 2019/09/02 - 集成“酷家乐”授权登录 diff --git a/pom.xml b/pom.xml index b1b93f0..349b25a 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ https://gitee.com/yadong.zhang/JustAuth 史上最全的整合第三方登录的开源库。目前已支持Github、Gitee、微博、钉钉、百度、Coding、腾讯云开发者平台、OSChina、支付宝、 - QQ、微信、淘宝、Google、Facebook、抖音、领英、小米、微软、今日头条、Teambition、StackOverflow、Pinterest、人人、华为、企业微信和酷家乐等第三方平台的授权登录。 + QQ、微信、淘宝、Google、Facebook、抖音、领英、小米、微软、今日头条、Teambition、StackOverflow、Pinterest、人人、华为、企业微信、酷家乐和Gitlab等第三方平台的授权登录。 Login, so easy! diff --git a/src/main/java/me/zhyd/oauth/config/AuthSource.java b/src/main/java/me/zhyd/oauth/config/AuthSource.java index db64121..99d0ed4 100644 --- a/src/main/java/me/zhyd/oauth/config/AuthSource.java +++ b/src/main/java/me/zhyd/oauth/config/AuthSource.java @@ -568,6 +568,7 @@ public enum AuthSource { return "https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo"; } }, + /** * 酷家乐 * @@ -593,6 +594,28 @@ public enum AuthSource { public String refresh() { return "https://oauth.kujiale.com/oauth2/auth/token/refresh"; } + }, + + /** + * Gitlab + * + * @since 1.11.0 + */ + GITLAB { + @Override + public String authorize() { + return "https://gitlab.com/oauth/authorize"; + } + + @Override + public String accessToken() { + return "https://gitlab.com/oauth/token"; + } + + @Override + public String userInfo() { + return "https://gitlab.com/api/v4/user"; + } }; /** diff --git a/src/main/java/me/zhyd/oauth/request/AuthGithubRequest.java b/src/main/java/me/zhyd/oauth/request/AuthGithubRequest.java index ab46afd..60cb0a9 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthGithubRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthGithubRequest.java @@ -34,9 +34,9 @@ public class AuthGithubRequest extends AuthDefaultRequest { protected AuthToken getAccessToken(AuthCallback authCallback) { HttpResponse response = doPostAuthorizationCode(authCallback.getCode()); Map res = GlobalAuthUtil.parseStringToMap(response.body()); - if (res.containsKey("error")) { - throw new AuthException(res.get("error") + ":" + res.get("error_description")); - } + + this.checkResponse(res.containsKey("error"), res.get("error_description")); + return AuthToken.builder() .accessToken(res.get("access_token")) .scope(res.get("scope")) @@ -48,9 +48,9 @@ public class AuthGithubRequest extends AuthDefaultRequest { protected AuthUser getUserInfo(AuthToken authToken) { HttpResponse response = doGetUserInfo(authToken); JSONObject object = JSONObject.parseObject(response.body()); - if (object.containsKey("error")) { - throw new AuthException(object.getString("error_description")); - } + + this.checkResponse(object.containsKey("error"), object.getString("error_description")); + return AuthUser.builder() .uuid(object.getString("id")) .username(object.getString("login")) @@ -67,4 +67,10 @@ public class AuthGithubRequest extends AuthDefaultRequest { .build(); } + private void checkResponse(boolean error, String error_description) { + if (error) { + throw new AuthException(error_description); + } + } + } diff --git a/src/main/java/me/zhyd/oauth/request/AuthGitlabRequest.java b/src/main/java/me/zhyd/oauth/request/AuthGitlabRequest.java new file mode 100644 index 0000000..7e98635 --- /dev/null +++ b/src/main/java/me/zhyd/oauth/request/AuthGitlabRequest.java @@ -0,0 +1,95 @@ +package me.zhyd.oauth.request; + +import cn.hutool.http.HttpResponse; +import com.alibaba.fastjson.JSONObject; +import me.zhyd.oauth.cache.AuthStateCache; +import me.zhyd.oauth.config.AuthConfig; +import me.zhyd.oauth.config.AuthSource; +import me.zhyd.oauth.enums.AuthUserGender; +import me.zhyd.oauth.exception.AuthException; +import me.zhyd.oauth.model.AuthCallback; +import me.zhyd.oauth.model.AuthToken; +import me.zhyd.oauth.model.AuthUser; +import me.zhyd.oauth.utils.UrlBuilder; + +/** + * Gitlab登录 + * + * @author yadong.zhang (yadong.zhang0415(a)gmail.com) + * @since 1.11.0 + */ +public class AuthGitlabRequest extends AuthDefaultRequest { + + public AuthGitlabRequest(AuthConfig config) { + super(config, AuthSource.GITLAB); + } + + public AuthGitlabRequest(AuthConfig config, AuthStateCache authStateCache) { + super(config, AuthSource.GITLAB, authStateCache); + } + + @Override + protected AuthToken getAccessToken(AuthCallback authCallback) { + HttpResponse response = doPostAuthorizationCode(authCallback.getCode()); + JSONObject object = JSONObject.parseObject(response.body()); + + this.checkResponse(object); + + return AuthToken.builder() + .accessToken(object.getString("access_token")) + .refreshToken(object.getString("refresh_token")) + .idToken(object.getString("id_token")) + .tokenType(object.getString("token_type")) + .scope(object.getString("scope")) + .build(); + } + + @Override + protected AuthUser getUserInfo(AuthToken authToken) { + HttpResponse response = doGetUserInfo(authToken); + JSONObject object = JSONObject.parseObject(response.body()); + + this.checkResponse(object); + + return AuthUser.builder() + .uuid(object.getString("id")) + .username(object.getString("username")) + .nickname(object.getString("name")) + .avatar(object.getString("avatar_url")) + .blog(object.getString("web_url")) + .company(object.getString("organization")) + .location(object.getString("location")) + .email(object.getString("email")) + .remark(object.getString("bio")) + .gender(AuthUserGender.UNKNOWN) + .token(authToken) + .source(source) + .build(); + } + + private void checkResponse(JSONObject object) { + // oauth/token 验证异常 + if (object.containsKey("error")) { + throw new AuthException(object.getString("error_description")); + } + // user 验证异常 + if (object.containsKey("message")) { + throw new AuthException(object.getString("message")); + } + } + + /** + * 返回带{@code state}参数的授权url,授权回调时会带上这个{@code state} + * + * @param state state 验证授权流程的参数,可以防止csrf + * @return 返回授权地址 + * @since 1.11.0 + */ + @Override + public String authorize(String state) { + return UrlBuilder.fromBaseUrl(super.authorize(state)) + .queryParam("scope", "read_user+openid+profile+email") + .build(); + } + +} -- GitLab