mirror of
https://gitee.com/yadong.zhang/JustAuth.git
synced 2025-12-08 01:38:24 +08:00
👌 更新代码
This commit is contained in:
parent
e6e016b0dd
commit
ea1aa53ab0
@ -9,7 +9,7 @@ import me.zhyd.oauth.model.AuthDingTalkErrorCode;
|
|||||||
import me.zhyd.oauth.model.AuthResponse;
|
import me.zhyd.oauth.model.AuthResponse;
|
||||||
import me.zhyd.oauth.model.AuthSource;
|
import me.zhyd.oauth.model.AuthSource;
|
||||||
import me.zhyd.oauth.model.AuthUser;
|
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 me.zhyd.oauth.utils.UrlBuilder;
|
||||||
|
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
@ -31,7 +31,7 @@ public class AuthDingTalkRequest extends BaseAuthRequest {
|
|||||||
protected AuthUser getUserInfo(String code) {
|
protected AuthUser getUserInfo(String code) {
|
||||||
// 根据timestamp, appSecret计算签名值
|
// 根据timestamp, appSecret计算签名值
|
||||||
String stringToSign = System.currentTimeMillis() + "";
|
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()))
|
HttpResponse response = HttpRequest.post(UrlBuilder.getDingTalkUserInfoUrl(urlEncodeSignature, stringToSign, config.getClientId()))
|
||||||
.body(Objects.requireNonNull(new JSONObject().put("tmp_auth_code", code)))
|
.body(Objects.requireNonNull(new JSONObject().put("tmp_auth_code", code)))
|
||||||
.execute();
|
.execute();
|
||||||
|
|||||||
@ -4,10 +4,14 @@ import cn.hutool.http.HttpRequest;
|
|||||||
import cn.hutool.http.HttpResponse;
|
import cn.hutool.http.HttpResponse;
|
||||||
import com.alibaba.fastjson.JSONObject;
|
import com.alibaba.fastjson.JSONObject;
|
||||||
import me.zhyd.oauth.config.AuthConfig;
|
import me.zhyd.oauth.config.AuthConfig;
|
||||||
|
import me.zhyd.oauth.exception.AuthException;
|
||||||
import me.zhyd.oauth.model.AuthSource;
|
import me.zhyd.oauth.model.AuthSource;
|
||||||
import me.zhyd.oauth.model.AuthUser;
|
import me.zhyd.oauth.model.AuthUser;
|
||||||
|
import me.zhyd.oauth.utils.GlobalAuthUtil;
|
||||||
import me.zhyd.oauth.utils.UrlBuilder;
|
import me.zhyd.oauth.utils.UrlBuilder;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author yadong.zhang (yadong.zhang0415(a)gmail.com)
|
* @author yadong.zhang (yadong.zhang0415(a)gmail.com)
|
||||||
* @version 1.0
|
* @version 1.0
|
||||||
@ -25,8 +29,11 @@ public class AuthGithubRequest extends BaseAuthRequest {
|
|||||||
protected String getAccessToken(String code) {
|
protected String getAccessToken(String code) {
|
||||||
String accessTokenUrl = UrlBuilder.getGithubAccessTokenUrl(config.getClientId(), config.getClientSecret(), code, config.getRedirectUri());
|
String accessTokenUrl = UrlBuilder.getGithubAccessTokenUrl(config.getClientId(), config.getClientSecret(), code, config.getRedirectUri());
|
||||||
HttpResponse response = HttpRequest.post(accessTokenUrl).execute();
|
HttpResponse response = HttpRequest.post(accessTokenUrl).execute();
|
||||||
String accessTokenStr = response.body();
|
Map<String, String> res = GlobalAuthUtil.parseStringToMap(response.body());
|
||||||
return accessTokenStr.split("&")[0];
|
if (res.containsKey("error")) {
|
||||||
|
throw new AuthException(res.get("error") + ":" + res.get("error_description"));
|
||||||
|
}
|
||||||
|
return res.get("access_token");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@ -6,28 +6,27 @@ import me.zhyd.oauth.exception.AuthException;
|
|||||||
import javax.crypto.Mac;
|
import javax.crypto.Mac;
|
||||||
import javax.crypto.spec.SecretKeySpec;
|
import javax.crypto.spec.SecretKeySpec;
|
||||||
import java.io.UnsupportedEncodingException;
|
import java.io.UnsupportedEncodingException;
|
||||||
|
import java.net.URLDecoder;
|
||||||
import java.net.URLEncoder;
|
import java.net.URLEncoder;
|
||||||
import java.security.InvalidKeyException;
|
import java.security.InvalidKeyException;
|
||||||
import java.security.NoSuchAlgorithmException;
|
import java.security.NoSuchAlgorithmException;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
public class DingTalkSignatureUtil {
|
public class GlobalAuthUtil {
|
||||||
/* The default encoding. */
|
|
||||||
private static final String DEFAULT_ENCODING = "UTF-8";
|
private static final String DEFAULT_ENCODING = "UTF-8";
|
||||||
|
|
||||||
/* Signature method. */
|
|
||||||
private static final String ALGORITHM = "HmacSHA256";
|
private static final String ALGORITHM = "HmacSHA256";
|
||||||
|
|
||||||
public static String computeSignature(String canonicalString, String secret) {
|
public static String generateDingTalkSignature(String canonicalString, String secret) {
|
||||||
try {
|
try {
|
||||||
byte[] signData = sign(canonicalString.getBytes(DEFAULT_ENCODING), secret.getBytes(DEFAULT_ENCODING));
|
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) {
|
} catch (UnsupportedEncodingException ex) {
|
||||||
throw new AuthException("Unsupported algorithm: " + DEFAULT_ENCODING, ex);
|
throw new AuthException("Unsupported algorithm: " + DEFAULT_ENCODING, ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private static byte[] sign(byte[] key, byte[] data) {
|
private static byte[] sign(byte[] key, byte[] data) {
|
||||||
try {
|
try {
|
||||||
Mac mac = Mac.getInstance(ALGORITHM);
|
Mac mac = Mac.getInstance(ALGORITHM);
|
||||||
@ -40,20 +39,42 @@ public class DingTalkSignatureUtil {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
private static String urlEncode(String value) {
|
||||||
* Encode a URL segment with special chars replaced.
|
|
||||||
*/
|
|
||||||
private static String urlEncode(String value, String encoding) {
|
|
||||||
if (value == null) {
|
if (value == null) {
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
String encoded = URLEncoder.encode(value, encoding);
|
String encoded = URLEncoder.encode(value, GlobalAuthUtil.DEFAULT_ENCODING);
|
||||||
return encoded.replace("+", "%20").replace("*", "%2A")
|
return encoded.replace("+", "%20").replace("*", "%2A")
|
||||||
.replace("~", "%7E").replace("/", "%2F");
|
.replace("~", "%7E").replace("/", "%2F");
|
||||||
} catch (UnsupportedEncodingException e) {
|
} 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<String, String> parseStringToMap(String accessTokenStr) {
|
||||||
|
Map<String, String> 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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@ -16,7 +16,7 @@ import java.text.MessageFormat;
|
|||||||
public class UrlBuilder {
|
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_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 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}";
|
private static final String WEIBO_ACCESS_TOKEN_PATTERN = "{0}?client_id={1}&client_secret={2}&grant_type=authorization_code&code={3}&redirect_uri={4}";
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user