diff --git a/README.en-US.md b/README.en-US.md index 7617b2396801c27ce3cf6b1f518a395713790972..ff09f991fb35f218e61fe4121c56c37d6b657dc3 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 31823e2a5d1e8adc4f6423ca555ff4f92eec84d3..ecb8e2d1ff4ef6f6a12816d42e40f79e2e3e6058 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 735a61a095cff20d1a2fb9b42dd0bd56c3c02cbe..c78def2b94a3485412f62c8e41d0c17cf892ae73 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 ad462e1494903b6e5fb577d60d433a570ecedcfa..03834fb65aad7711ab6c8629ab9203dbc9902494 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 bc0e7947c94e403b313cea769bf4112f828d731c..6d6708675f66a5c7b4c40f7d7273adb02e4937fb 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 2a4ace318adf2b3fe4f6db0aaf50ab6d9310c960..4bbdf7b5be0fca14dcd8137bb34bc59c34060050 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 b1b93f0e16467e69dc228f0b3e0ac2d9d23aebc2..349b25a2bfb48954226f7614e69c870edd9c1666 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 db64121d0030395b97908a193553c3f36a9d00a3..99d0ed4d33a5984e4e6c94e38b15863619abf4f0 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 ab46afdf4cfd5e92b0e6ecc4d5f89f8fb7b69fc3..60cb0a9ccfa49574600a7bebd251602c47281e67 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 0000000000000000000000000000000000000000..7e9863514cb199e7c6c59796865f26e7011608c5 --- /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(); + } + +}