diff --git a/README.md b/README.md index c63840583035854b7a2a3633eae6f83bcd929e70..29c09e911d0ad41260a97ecbb66a2755ee63186e 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,7 @@ + @@ -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的接口地址 *