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 @@
![微信企业版](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/wechat.png) |
![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/csdn.png) |
![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/kujiale.png) |
+ ![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/gitlab.png) |
@@ -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 @@
- ![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/gitee.png) |
- ![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/github.png) |
- ![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/weibo.png) |
- ![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/dingtalk.png) |
- ![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/baidu.png) |
- ![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/coding.png) |
- ![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/tencentCloud.png) |
- ![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/oschina.png) |
- ![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/alipay.png) |
- ![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/qq.png) |
- ![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/wechat.png) |
- ![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/taobao.png) |
- ![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/google.png) |
- ![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/facebook.png) |
- ![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/douyin.png) |
+ ![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/gitee.png) |
+ ![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/github.png) |
+ ![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/weibo.png) |
+ ![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/dingtalk.png) |
+ ![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/baidu.png) |
+ ![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/coding.png) |
+ ![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/tencentCloud.png) |
+ ![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/oschina.png) |
+ ![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/alipay.png) |
+ ![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/qq.png) |
+ ![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/wechat.png) |
+ ![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/taobao.png) |
+ ![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/google.png) |
+ ![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/facebook.png) |
+ ![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/douyin.png) |
- ![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/linkedin.png) |
- ![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/microsoft.png) |
- ![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/mi.png) |
- ![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/toutiao.png) |
- ![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/teambition.png) |
- ![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/renren.png) |
- ![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/pinterest.png) |
- ![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/stackoverflow.png) |
- ![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/huawei.png) |
- ![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/wechat.png) |
- ![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/csdn.png) |
- ![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/kujiale.png) |
+ ![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/linkedin.png) |
+ ![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/microsoft.png) |
+ ![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/mi.png) |
+ ![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/toutiao.png) |
+ ![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/teambition.png) |
+ ![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/renren.png) |
+ ![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/pinterest.png) |
+ ![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/stackoverflow.png) |
+ ![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/huawei.png) |
+ ![微信企业版](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/wechat.png) |
+ ![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/csdn.png) |
+ ![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/kujiale.png) |
+ ![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/gitlab.png) |
@@ -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();
+ }
+
+}