diff --git a/src/main/java/me/zhyd/oauth/request/AuthDingTalkRequest.java b/src/main/java/me/zhyd/oauth/request/AuthDingTalkRequest.java index 8ba56c3f7fe68877c542fc512c5d1edf9a8ed18e..06c25e788e582d09d28afc5b29ec51c1ea7964f6 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthDingTalkRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthDingTalkRequest.java @@ -9,7 +9,7 @@ import me.zhyd.oauth.model.AuthDingTalkErrorCode; import me.zhyd.oauth.model.AuthResponse; import me.zhyd.oauth.model.AuthSource; import me.zhyd.oauth.model.AuthUser; -import me.zhyd.oauth.utils.DingTalkSignatureUtil; +import me.zhyd.oauth.utils.GlobalAuthUtil; import me.zhyd.oauth.utils.UrlBuilder; import java.util.Objects; @@ -31,7 +31,7 @@ public class AuthDingTalkRequest extends BaseAuthRequest { protected AuthUser getUserInfo(String code) { // 根据timestamp, appSecret计算签名值 String stringToSign = System.currentTimeMillis() + ""; - String urlEncodeSignature = DingTalkSignatureUtil.computeSignature(config.getClientSecret(), stringToSign); + String urlEncodeSignature = GlobalAuthUtil.generateDingTalkSignature(config.getClientSecret(), stringToSign); HttpResponse response = HttpRequest.post(UrlBuilder.getDingTalkUserInfoUrl(urlEncodeSignature, stringToSign, config.getClientId())) .body(Objects.requireNonNull(new JSONObject().put("tmp_auth_code", code))) .execute(); diff --git a/src/main/java/me/zhyd/oauth/request/AuthGithubRequest.java b/src/main/java/me/zhyd/oauth/request/AuthGithubRequest.java index 2c2f096841a2c9d1909a56e753ebefe98e5f4bbc..ac7fca719acffd82d7a5fa90a612f8d834f2b0bd 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthGithubRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthGithubRequest.java @@ -4,10 +4,14 @@ 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.utils.GlobalAuthUtil; import me.zhyd.oauth.utils.UrlBuilder; +import java.util.Map; + /** * @author yadong.zhang (yadong.zhang0415(a)gmail.com) * @version 1.0 @@ -25,8 +29,11 @@ public class AuthGithubRequest extends BaseAuthRequest { protected String getAccessToken(String code) { String accessTokenUrl = UrlBuilder.getGithubAccessTokenUrl(config.getClientId(), config.getClientSecret(), code, config.getRedirectUri()); HttpResponse response = HttpRequest.post(accessTokenUrl).execute(); - String accessTokenStr = response.body(); - return accessTokenStr.split("&")[0]; + Map res = GlobalAuthUtil.parseStringToMap(response.body()); + if (res.containsKey("error")) { + throw new AuthException(res.get("error") + ":" + res.get("error_description")); + } + return res.get("access_token"); } @Override diff --git a/src/main/java/me/zhyd/oauth/utils/DingTalkSignatureUtil.java b/src/main/java/me/zhyd/oauth/utils/GlobalAuthUtil.java similarity index 54% rename from src/main/java/me/zhyd/oauth/utils/DingTalkSignatureUtil.java rename to src/main/java/me/zhyd/oauth/utils/GlobalAuthUtil.java index 0ae35ebe58e8a803a9053d7c215aa7a37fe41fa7..dc12a657e2a63daba8bf44fcd38f1c47b00ac1fb 100644 --- a/src/main/java/me/zhyd/oauth/utils/DingTalkSignatureUtil.java +++ b/src/main/java/me/zhyd/oauth/utils/GlobalAuthUtil.java @@ -6,28 +6,27 @@ import me.zhyd.oauth.exception.AuthException; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; import java.net.URLEncoder; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; -public class DingTalkSignatureUtil { - /* The default encoding. */ +public class GlobalAuthUtil { private static final String DEFAULT_ENCODING = "UTF-8"; - - /* Signature method. */ private static final String ALGORITHM = "HmacSHA256"; - public static String computeSignature(String canonicalString, String secret) { + public static String generateDingTalkSignature(String canonicalString, String secret) { try { byte[] signData = sign(canonicalString.getBytes(DEFAULT_ENCODING), secret.getBytes(DEFAULT_ENCODING)); - return urlEncode(new String(Base64.encode(signData, false)), DEFAULT_ENCODING); + return urlEncode(new String(Base64.encode(signData, false))); } catch (UnsupportedEncodingException ex) { throw new AuthException("Unsupported algorithm: " + DEFAULT_ENCODING, ex); } } - private static byte[] sign(byte[] key, byte[] data) { try { Mac mac = Mac.getInstance(ALGORITHM); @@ -40,20 +39,42 @@ public class DingTalkSignatureUtil { } } - /** - * Encode a URL segment with special chars replaced. - */ - private static String urlEncode(String value, String encoding) { + private static String urlEncode(String value) { if (value == null) { return ""; } try { - String encoded = URLEncoder.encode(value, encoding); + String encoded = URLEncoder.encode(value, GlobalAuthUtil.DEFAULT_ENCODING); return encoded.replace("+", "%20").replace("*", "%2A") .replace("~", "%7E").replace("/", "%2F"); } catch (UnsupportedEncodingException e) { - throw new AuthException("FailedToEncodeUri", e); + throw new AuthException("Failed To Encode Uri", e); + } + } + + public static String urlDecode(String value) { + if (value == null) { + return ""; + } + try { + return URLDecoder.decode(value, GlobalAuthUtil.DEFAULT_ENCODING); + } catch (UnsupportedEncodingException e) { + throw new AuthException("Failed To Decode Uri", e); + } + } + + public static Map parseStringToMap(String accessTokenStr) { + Map res = new HashMap<>(); + if (accessTokenStr.contains("&")) { + String[] fields = accessTokenStr.split("&"); + for (String field : fields) { + if (field.contains("=")) { + String[] keyValue = field.split("="); + res.put(GlobalAuthUtil.urlDecode(keyValue[0]), keyValue.length == 2 ? GlobalAuthUtil.urlDecode(keyValue[1]) : null); + } + } } + return res; } } diff --git a/src/main/java/me/zhyd/oauth/utils/UrlBuilder.java b/src/main/java/me/zhyd/oauth/utils/UrlBuilder.java index fbae8c3000b3f01e2b7ad121f33b4d0c88befdfe..dea7f4ff52c637ef8260b4659f9a90c55372e69b 100644 --- a/src/main/java/me/zhyd/oauth/utils/UrlBuilder.java +++ b/src/main/java/me/zhyd/oauth/utils/UrlBuilder.java @@ -16,7 +16,7 @@ import java.text.MessageFormat; public class UrlBuilder { private static final String GITHUB_ACCESS_TOKEN_PATTERN = "{0}?client_id={1}&client_secret={2}&code={3}&redirect_uri={4}"; - private static final String GITHUB_USER_INFO_PATTERN = "{0}?{1}"; + private static final String GITHUB_USER_INFO_PATTERN = "{0}?access_token={1}"; private static final String GITHUB_AUTHORIZE_PATTERN = "{0}?client_id={1}&state=1&redirect_uri={2}"; private static final String WEIBO_ACCESS_TOKEN_PATTERN = "{0}?client_id={1}&client_secret={2}&grant_type=authorization_code&code={3}&redirect_uri={4}";