diff --git a/README.md b/README.md
index c63840583035854b7a2a3633eae6f83bcd929e70..29c09e911d0ad41260a97ecbb66a2755ee63186e 100644
--- a/README.md
+++ b/README.md
@@ -27,6 +27,7 @@
![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/baidu.png) |
![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/csdn.png) |
![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/coding.png) |
+ ![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/tencent_cloud.png) |
![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/oschinas.png) |
![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/qq.png) |
![](https://gitee.com/yadong.zhang/static/raw/master/JustAuth/wechats.png) |
@@ -41,6 +42,7 @@
百度 |
CSDN |
Coding |
+ 腾讯云开发者平台 |
OSChina |
QQ |
微信 |
@@ -89,6 +91,7 @@ authRequest.login("code");
|
| [AuthBaiduRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthBaiduRequest.java) | 参考文档 |
|
| [AuthCsdnRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthCsdnRequest.java) | 待续 |
|
| [AuthCodingRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthCodingRequest.java) | 参考文档 |
+|
| [AuthTencentCloudRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthTencentCloudRequest.java) | 参考文档 |
|
| [AuthOschinaRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthOschinaRequest.java) | 参考文档 |
|
| AuthQqRequest | 参考文档 |
|
| AuthWechatRequest | 待续 |
@@ -123,6 +126,10 @@ authRequest.login("code");
待续
+#### 授权腾讯云开发者平台
+
+待续
+
#### 授权oschina
待续
diff --git a/src/main/java/me/zhyd/oauth/consts/ApiUrlConst.java b/src/main/java/me/zhyd/oauth/consts/ApiUrlConst.java
index 5baed22418ebde52359d3ec9a5dd36d663d02697..96d76ea619b387574a2d952c0e194a185cf6b9e9 100644
--- a/src/main/java/me/zhyd/oauth/consts/ApiUrlConst.java
+++ b/src/main/java/me/zhyd/oauth/consts/ApiUrlConst.java
@@ -116,6 +116,21 @@ public class ApiUrlConst {
*/
public static final String CODING_AUTHORIZE_URL = "https://coding.net/oauth_authorize.html";
+ /**
+ * 获取腾讯云开发者平台 access_token的地址(coding升级后就变成腾讯云开发者平台了)
+ */
+ public static final String TENCENT_ACCESS_TOKEN_URL = "https://dev.tencent.com/api/oauth/access_token";
+
+ /**
+ * 获取腾讯云开发者平台用户信息的地址(coding升级后就变成腾讯云开发者平台了)
+ */
+ public static final String TENCENT_USER_INFO_URL = "https://dev.tencent.com/api/account/current_user";
+
+ /**
+ * 获取腾讯云开发者平台授权地址(coding升级后就变成腾讯云开发者平台了)
+ */
+ public static final String TENCENT_AUTHORIZE_URL = "https://dev.tencent.com/oauth_authorize.html";
+
/**
* 获取oschina access_token的地址
*/
diff --git a/src/main/java/me/zhyd/oauth/model/AuthSource.java b/src/main/java/me/zhyd/oauth/model/AuthSource.java
index b501ebbc8e0465d1ca1e1cd15561254a2428c27f..ceee08b718ed740a4e80ed4777d45fddd422f453 100644
--- a/src/main/java/me/zhyd/oauth/model/AuthSource.java
+++ b/src/main/java/me/zhyd/oauth/model/AuthSource.java
@@ -16,6 +16,7 @@ public enum AuthSource {
CSDN,
CODING,
OSCHINA,
+ TENCEN_CLOUD,
QQ,
WECHAT,
diff --git a/src/main/java/me/zhyd/oauth/request/AuthCodingRequest.java b/src/main/java/me/zhyd/oauth/request/AuthCodingRequest.java
index 3fa1e7a735d1112d9a04684262d23f7e756c102d..1e4761e2efb01aab6470652211ec599fecd88a19 100644
--- a/src/main/java/me/zhyd/oauth/request/AuthCodingRequest.java
+++ b/src/main/java/me/zhyd/oauth/request/AuthCodingRequest.java
@@ -26,7 +26,7 @@ public class AuthCodingRequest extends BaseAuthRequest {
@Override
protected String getAccessToken(String code) {
String accessTokenUrl = UrlBuilder.getCodingAccessTokenUrl(config.getClientId(), config.getClientSecret(), code);
- HttpResponse response = HttpRequest.post(accessTokenUrl).execute();
+ HttpResponse response = HttpRequest.get(accessTokenUrl).execute();
JSONObject accessTokenObject = JSONObject.parseObject(response.body());
if (accessTokenObject.getIntValue("code") != 0) {
throw new AuthException("Unable to get token from coding using code [" + code + "]");
@@ -41,9 +41,10 @@ public class AuthCodingRequest extends BaseAuthRequest {
if (object.getIntValue("code") != 0) {
throw new AuthException(object.getString("msg"));
}
+ object = object.getJSONObject("data");
return AuthUser.builder()
.username(object.getString("name"))
- .avatar(object.getString("avatar"))
+ .avatar("https://coding.net/" + object.getString("avatar"))
.blog("https://coding.net/" + object.getString("path"))
.nickname(object.getString("name"))
.company(object.getString("company"))
diff --git a/src/main/java/me/zhyd/oauth/request/AuthTencentCloudRequest.java b/src/main/java/me/zhyd/oauth/request/AuthTencentCloudRequest.java
new file mode 100644
index 0000000000000000000000000000000000000000..32585d05acb749ada03708a0a441e6a94f16841c
--- /dev/null
+++ b/src/main/java/me/zhyd/oauth/request/AuthTencentCloudRequest.java
@@ -0,0 +1,59 @@
+package me.zhyd.oauth.request;
+
+import cn.hutool.http.HttpRequest;
+import cn.hutool.http.HttpResponse;
+import com.alibaba.fastjson.JSONObject;
+import me.zhyd.oauth.config.AuthConfig;
+import me.zhyd.oauth.exception.AuthException;
+import me.zhyd.oauth.model.AuthSource;
+import me.zhyd.oauth.model.AuthUser;
+import me.zhyd.oauth.model.AuthUserGender;
+import me.zhyd.oauth.utils.UrlBuilder;
+
+/**
+ * @author yadong.zhang (yadong.zhang0415(a)gmail.com)
+ * @version 1.0
+ * @website https://www.zhyd.me
+ * @date 2019/2/23 15:48
+ * @since 1.8
+ */
+public class AuthTencentCloudRequest extends BaseAuthRequest {
+
+ public AuthTencentCloudRequest(AuthConfig config) {
+ super(config, AuthSource.TENCEN_CLOUD);
+ }
+
+ @Override
+ protected String getAccessToken(String code) {
+ String accessTokenUrl = UrlBuilder.getTencentCloudAccessTokenUrl(config.getClientId(), config.getClientSecret(), code);
+ HttpResponse response = HttpRequest.get(accessTokenUrl).execute();
+ JSONObject object = JSONObject.parseObject(response.body());
+ if (object.getIntValue("code") != 0) {
+ throw new AuthException("Unable to get token from tencent cloud using code [" + code + "]: " + object.get("msg"));
+ }
+ return object.getString("access_token");
+ }
+
+ @Override
+ protected AuthUser getUserInfo(String accessToken) {
+ HttpResponse response = HttpRequest.get(UrlBuilder.getTencentCloudUserInfoUrl(accessToken)).execute();
+ JSONObject object = JSONObject.parseObject(response.body());
+ if (object.getIntValue("code") != 0) {
+ throw new AuthException(object.getString("msg"));
+ }
+ object = object.getJSONObject("data");
+ return AuthUser.builder()
+ .username(object.getString("name"))
+ .avatar("https://dev.tencent.com/" + object.getString("avatar"))
+ .blog("https://dev.tencent.com/" + object.getString("path"))
+ .nickname(object.getString("name"))
+ .company(object.getString("company"))
+ .location(object.getString("location"))
+ .gender(AuthUserGender.getRealGender(object.getString("sex")))
+ .email(object.getString("email"))
+ .remark(object.getString("slogan"))
+ .accessToken(accessToken)
+ .source(AuthSource.TENCEN_CLOUD)
+ .build();
+ }
+}
diff --git a/src/main/java/me/zhyd/oauth/request/BaseAuthRequest.java b/src/main/java/me/zhyd/oauth/request/BaseAuthRequest.java
index e7f6bf738a33f24569bf9d8e67d191ac6c6c235c..f8a3650bcbdd0b162edf7c2054fc5bd4b25373cd 100644
--- a/src/main/java/me/zhyd/oauth/request/BaseAuthRequest.java
+++ b/src/main/java/me/zhyd/oauth/request/BaseAuthRequest.java
@@ -73,6 +73,12 @@ public abstract class BaseAuthRequest implements AuthRequest {
case CODING:
authorizeUrl = UrlBuilder.getCodingAuthorizeUrl(config.getClientId(), config.getRedirectUri());
break;
+ case TENCEN_CLOUD:
+ authorizeUrl = UrlBuilder.getTencentCloudAuthorizeUrl(config.getClientId(), config.getRedirectUri());
+ break;
+ case OSCHINA:
+ authorizeUrl = UrlBuilder.getOschinaAuthorizeUrl(config.getClientId(), config.getRedirectUri());
+ break;
case QQ:
break;
case WECHAT:
diff --git a/src/main/java/me/zhyd/oauth/utils/UrlBuilder.java b/src/main/java/me/zhyd/oauth/utils/UrlBuilder.java
index 83a7f1dcfa598ff2324b0e3ea2aed6aad47a359a..a30981a7cf819dd8f4d29141b1a5d65f6a5bd37f 100644
--- a/src/main/java/me/zhyd/oauth/utils/UrlBuilder.java
+++ b/src/main/java/me/zhyd/oauth/utils/UrlBuilder.java
@@ -41,7 +41,11 @@ public class UrlBuilder {
private static final String CODING_ACCESS_TOKEN_PATTERN = "{0}?client_id={1}&client_secret={2}&grant_type=authorization_code&code={3}";
private static final String CODING_USER_INFO_PATTERN = "{0}?access_token={1}";
- private static final String CODING_AUTHORIZE_PATTERN = "{0}?client_id={1}&response_type=code&redirect_uri={2}";
+ private static final String CODING_AUTHORIZE_PATTERN = "{0}?client_id={1}&response_type=code&redirect_uri={2}&scope=user";
+
+ private static final String TENCENT_ACCESS_TOKEN_PATTERN = "{0}?client_id={1}&client_secret={2}&grant_type=authorization_code&code={3}";
+ private static final String TENCENT_USER_INFO_PATTERN = "{0}?access_token={1}";
+ private static final String TENCENT_AUTHORIZE_PATTERN = "{0}?client_id={1}&response_type=code&redirect_uri={2}&scope=user";
private static final String OSCHINA_ACCESS_TOKEN_PATTERN = "{0}?client_id={1}&client_secret={2}&grant_type=authorization_code&code={3}&redirect_uri={4}&dataType=json";
private static final String OSCHINA_USER_INFO_PATTERN = "{0}?access_token={1}&dataType=json";
@@ -283,6 +287,39 @@ public class UrlBuilder {
return MessageFormat.format(CODING_AUTHORIZE_PATTERN, ApiUrlConst.CODING_AUTHORIZE_URL, clientId, redirectUrl);
}
+ /**
+ * 获取腾讯云开发者平台 token的接口地址
+ *
+ * @param clientId coding应用的App Key
+ * @param clientSecret coding应用的App Secret
+ * @param code coding授权前的code,用来换token
+ * @return full url
+ */
+ public static String getTencentCloudAccessTokenUrl(String clientId, String clientSecret, String code) {
+ return MessageFormat.format(TENCENT_ACCESS_TOKEN_PATTERN, ApiUrlConst.TENCENT_ACCESS_TOKEN_URL, clientId, clientSecret, code);
+ }
+
+ /**
+ * 获取腾讯云开发者平台用户详情的接口地址
+ *
+ * @param token coding 应用的token
+ * @return full url
+ */
+ public static String getTencentCloudUserInfoUrl(String token) {
+ return MessageFormat.format(TENCENT_USER_INFO_PATTERN, ApiUrlConst.TENCENT_USER_INFO_URL, token);
+ }
+
+ /**
+ * 获取腾讯云开发者平台授权地址
+ *
+ * @param clientId coding 应用的Client ID
+ * @param redirectUrl coding 应用授权成功后的回调地址
+ * @return full url
+ */
+ public static String getTencentCloudAuthorizeUrl(String clientId, String redirectUrl) {
+ return MessageFormat.format(TENCENT_AUTHORIZE_PATTERN, ApiUrlConst.TENCENT_AUTHORIZE_URL, clientId, redirectUrl);
+ }
+
/**
* 获取oschina token的接口地址
*