From 65bb99401281db2be713c6bc28a490d9f4d9b8dd Mon Sep 17 00:00:00 2001 From: handy Date: Thu, 4 Jan 2024 12:51:50 +0800 Subject: [PATCH 01/23] =?UTF-8?q?AuthRequest=20=E5=93=8D=E5=BA=94=E6=90=BA?= =?UTF-8?q?=E5=B8=A6=E6=B3=9B=E5=9E=8B=EF=BC=8C=E9=81=BF=E5=85=8D=E4=BA=8C?= =?UTF-8?q?=E6=AC=A1=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../zhyd/oauth/request/AbstractAuthMicrosoftRequest.java | 4 ++-- .../java/me/zhyd/oauth/request/AuthAlipayRequest.java | 4 ++-- .../java/me/zhyd/oauth/request/AuthAmazonRequest.java | 4 ++-- src/main/java/me/zhyd/oauth/request/AuthBaiduRequest.java | 4 ++-- .../java/me/zhyd/oauth/request/AuthDefaultRequest.java | 8 ++++---- .../java/me/zhyd/oauth/request/AuthDouyinRequest.java | 4 ++-- src/main/java/me/zhyd/oauth/request/AuthElemeRequest.java | 4 ++-- .../java/me/zhyd/oauth/request/AuthFeishuRequest.java | 4 ++-- .../java/me/zhyd/oauth/request/AuthHuaweiRequest.java | 4 ++-- src/main/java/me/zhyd/oauth/request/AuthJdRequest.java | 4 ++-- .../java/me/zhyd/oauth/request/AuthKujialeRequest.java | 4 ++-- src/main/java/me/zhyd/oauth/request/AuthLineRequest.java | 4 ++-- .../java/me/zhyd/oauth/request/AuthMeituanRequest.java | 4 ++-- src/main/java/me/zhyd/oauth/request/AuthMiRequest.java | 4 ++-- src/main/java/me/zhyd/oauth/request/AuthOktaRequest.java | 6 +++--- src/main/java/me/zhyd/oauth/request/AuthQqRequest.java | 4 ++-- .../java/me/zhyd/oauth/request/AuthRenrenRequest.java | 4 ++-- src/main/java/me/zhyd/oauth/request/AuthRequest.java | 5 +++-- .../java/me/zhyd/oauth/request/AuthTaobaoRequest.java | 4 ++-- .../java/me/zhyd/oauth/request/AuthTeambitionRequest.java | 4 ++-- .../request/AuthWeChatEnterpriseThirdQrcodeRequest.java | 4 ++-- .../java/me/zhyd/oauth/request/AuthWeChatMpRequest.java | 4 ++-- .../java/me/zhyd/oauth/request/AuthWeChatOpenRequest.java | 4 ++-- .../java/me/zhyd/oauth/request/AuthExtendRequest.java | 4 ++-- 25 files changed, 53 insertions(+), 52 deletions(-) diff --git a/pom.xml b/pom.xml index 44029f5..b03ed40 100644 --- a/pom.xml +++ b/pom.xml @@ -58,7 +58,7 @@ 1.6 false 1.0.5 - 1.18.20 + 1.18.30 4.13.2 1.2.83 4.17.5.ALL diff --git a/src/main/java/me/zhyd/oauth/request/AbstractAuthMicrosoftRequest.java b/src/main/java/me/zhyd/oauth/request/AbstractAuthMicrosoftRequest.java index cfd25b1..d8f0200 100644 --- a/src/main/java/me/zhyd/oauth/request/AbstractAuthMicrosoftRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AbstractAuthMicrosoftRequest.java @@ -111,8 +111,8 @@ public abstract class AbstractAuthMicrosoftRequest extends AuthDefaultRequest { * @return AuthResponse */ @Override - public AuthResponse refresh(AuthToken authToken) { - return AuthResponse.builder() + public AuthResponse refresh(AuthToken authToken) { + return AuthResponse.builder() .code(AuthResponseStatus.SUCCESS.getCode()) .data(getToken(refreshTokenUrl(authToken.getRefreshToken()))) .build(); diff --git a/src/main/java/me/zhyd/oauth/request/AuthAlipayRequest.java b/src/main/java/me/zhyd/oauth/request/AuthAlipayRequest.java index 98acc0e..04aa0bc 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthAlipayRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthAlipayRequest.java @@ -175,7 +175,7 @@ public class AuthAlipayRequest extends AuthDefaultRequest { * @return AuthResponse */ @Override - public AuthResponse refresh(AuthToken authToken) { + public AuthResponse refresh(AuthToken authToken) { AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest(); request.setGrantType("refresh_token"); request.setRefreshToken(authToken.getRefreshToken()); @@ -188,7 +188,7 @@ public class AuthAlipayRequest extends AuthDefaultRequest { if (!response.isSuccess()) { throw new AuthException(response.getSubMsg()); } - return AuthResponse.builder() + return AuthResponse.builder() .code(AuthResponseStatus.SUCCESS.getCode()) .data(AuthToken.builder() .accessToken(response.getAccessToken()) diff --git a/src/main/java/me/zhyd/oauth/request/AuthAmazonRequest.java b/src/main/java/me/zhyd/oauth/request/AuthAmazonRequest.java index 99652cb..78a6004 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthAmazonRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthAmazonRequest.java @@ -94,13 +94,13 @@ public class AuthAmazonRequest extends AuthDefaultRequest { } @Override - public AuthResponse refresh(AuthToken authToken) { + public AuthResponse refresh(AuthToken authToken) { Map form = new HashMap<>(7); form.put("grant_type", "refresh_token"); form.put("refresh_token", authToken.getRefreshToken()); form.put("client_id", config.getClientId()); form.put("client_secret", config.getClientSecret()); - return AuthResponse.builder() + return AuthResponse.builder() .code(AuthResponseStatus.SUCCESS.getCode()) .data(getToken(form, this.source.refresh())) .build(); diff --git a/src/main/java/me/zhyd/oauth/request/AuthBaiduRequest.java b/src/main/java/me/zhyd/oauth/request/AuthBaiduRequest.java index 99be903..6f9851c 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthBaiduRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthBaiduRequest.java @@ -81,7 +81,7 @@ public class AuthBaiduRequest extends AuthDefaultRequest { } @Override - public AuthResponse refresh(AuthToken authToken) { + public AuthResponse refresh(AuthToken authToken) { String refreshUrl = UrlBuilder.fromBaseUrl(this.source.refresh()) .queryParam("grant_type", "refresh_token") .queryParam("refresh_token", authToken.getRefreshToken()) @@ -89,7 +89,7 @@ public class AuthBaiduRequest extends AuthDefaultRequest { .queryParam("client_secret", this.config.getClientSecret()) .build(); String response = new HttpUtils(config.getHttpConfig()).get(refreshUrl).getBody(); - return AuthResponse.builder() + return AuthResponse.builder() .code(AuthResponseStatus.SUCCESS.getCode()) .data(this.getAuthToken(response)) .build(); diff --git a/src/main/java/me/zhyd/oauth/request/AuthDefaultRequest.java b/src/main/java/me/zhyd/oauth/request/AuthDefaultRequest.java index 0e2e8a4..6bc75e4 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthDefaultRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthDefaultRequest.java @@ -70,7 +70,7 @@ public abstract class AuthDefaultRequest implements AuthRequest { * @return AuthResponse */ @Override - public AuthResponse login(AuthCallback authCallback) { + public AuthResponse login(AuthCallback authCallback) { try { checkCode(authCallback); if (!config.isIgnoreCheckState()) { @@ -79,7 +79,7 @@ public abstract class AuthDefaultRequest implements AuthRequest { AuthToken authToken = this.getAccessToken(authCallback); AuthUser user = this.getUserInfo(authToken); - return AuthResponse.builder().code(AuthResponseStatus.SUCCESS.getCode()).data(user).build(); + return AuthResponse.builder().code(AuthResponseStatus.SUCCESS.getCode()).data(user).build(); } catch (Exception e) { Log.error("Failed to login with oauth authorization.", e); return this.responseError(e); @@ -96,7 +96,7 @@ public abstract class AuthDefaultRequest implements AuthRequest { * @param e 具体的异常 * @return AuthResponse */ - AuthResponse responseError(Exception e) { + AuthResponse responseError(Exception e) { int errorCode = AuthResponseStatus.FAILURE.getCode(); String errorMsg = e.getMessage(); if (e instanceof AuthException) { @@ -106,7 +106,7 @@ public abstract class AuthDefaultRequest implements AuthRequest { errorMsg = authException.getErrorMsg(); } } - return AuthResponse.builder().code(errorCode).msg(errorMsg).build(); + return AuthResponse.builder().code(errorCode).msg(errorMsg).build(); } /** diff --git a/src/main/java/me/zhyd/oauth/request/AuthDouyinRequest.java b/src/main/java/me/zhyd/oauth/request/AuthDouyinRequest.java index fcd7485..c157150 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthDouyinRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthDouyinRequest.java @@ -59,8 +59,8 @@ public class AuthDouyinRequest extends AuthDefaultRequest { } @Override - public AuthResponse refresh(AuthToken oldToken) { - return AuthResponse.builder() + public AuthResponse refresh(AuthToken oldToken) { + return AuthResponse.builder() .code(AuthResponseStatus.SUCCESS.getCode()) .data(getToken(refreshTokenUrl(oldToken.getRefreshToken()))) .build(); diff --git a/src/main/java/me/zhyd/oauth/request/AuthElemeRequest.java b/src/main/java/me/zhyd/oauth/request/AuthElemeRequest.java index 7011011..3c87fd9 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthElemeRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthElemeRequest.java @@ -117,7 +117,7 @@ public class AuthElemeRequest extends AuthDefaultRequest { } @Override - public AuthResponse refresh(AuthToken oldToken) { + public AuthResponse refresh(AuthToken oldToken) { Map form = new HashMap<>(4); form.put("refresh_token", oldToken.getRefreshToken()); form.put("grant_type", "refresh_token"); @@ -129,7 +129,7 @@ public class AuthElemeRequest extends AuthDefaultRequest { this.checkResponse(object); - return AuthResponse.builder() + return AuthResponse.builder() .code(AuthResponseStatus.SUCCESS.getCode()) .data(AuthToken.builder() .accessToken(object.getString("access_token")) diff --git a/src/main/java/me/zhyd/oauth/request/AuthFeishuRequest.java b/src/main/java/me/zhyd/oauth/request/AuthFeishuRequest.java index 88f5b50..31b6283 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthFeishuRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthFeishuRequest.java @@ -98,12 +98,12 @@ public class AuthFeishuRequest extends AuthDefaultRequest { } @Override - public AuthResponse refresh(AuthToken authToken) { + public AuthResponse refresh(AuthToken authToken) { JSONObject requestObject = new JSONObject(); requestObject.put("app_access_token", this.getAppAccessToken()); requestObject.put("grant_type", "refresh_token"); requestObject.put("refresh_token", authToken.getRefreshToken()); - return AuthResponse.builder() + return AuthResponse.builder() .code(AuthResponseStatus.SUCCESS.getCode()) .data(getToken(requestObject, this.source.refresh())) .build(); diff --git a/src/main/java/me/zhyd/oauth/request/AuthHuaweiRequest.java b/src/main/java/me/zhyd/oauth/request/AuthHuaweiRequest.java index e2e9067..7c41407 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthHuaweiRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthHuaweiRequest.java @@ -99,7 +99,7 @@ public class AuthHuaweiRequest extends AuthDefaultRequest { * @return AuthResponse */ @Override - public AuthResponse refresh(AuthToken authToken) { + public AuthResponse refresh(AuthToken authToken) { Map form = new HashMap<>(7); form.put("client_id", config.getClientId()); form.put("client_secret", config.getClientSecret()); @@ -107,7 +107,7 @@ public class AuthHuaweiRequest extends AuthDefaultRequest { form.put("grant_type", "refresh_token"); String response = new HttpUtils(config.getHttpConfig()).post(source.refresh(), form, false).getBody(); - return AuthResponse.builder().code(SUCCESS.getCode()).data(getAuthToken(response)).build(); + return AuthResponse.builder().code(SUCCESS.getCode()).data(getAuthToken(response)).build(); } private AuthToken getAuthToken(String response) { diff --git a/src/main/java/me/zhyd/oauth/request/AuthJdRequest.java b/src/main/java/me/zhyd/oauth/request/AuthJdRequest.java index bb54375..4769ea8 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthJdRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthJdRequest.java @@ -103,7 +103,7 @@ public class AuthJdRequest extends AuthDefaultRequest { } @Override - public AuthResponse refresh(AuthToken oldToken) { + public AuthResponse refresh(AuthToken oldToken) { Map params = new HashMap<>(7); params.put("app_key", config.getClientId()); params.put("app_secret", config.getClientSecret()); @@ -114,7 +114,7 @@ public class AuthJdRequest extends AuthDefaultRequest { this.checkResponse(object); - return AuthResponse.builder() + return AuthResponse.builder() .code(AuthResponseStatus.SUCCESS.getCode()) .data(AuthToken.builder() .accessToken(object.getString("access_token")) diff --git a/src/main/java/me/zhyd/oauth/request/AuthKujialeRequest.java b/src/main/java/me/zhyd/oauth/request/AuthKujialeRequest.java index aac5ec1..44a8f09 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthKujialeRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthKujialeRequest.java @@ -109,8 +109,8 @@ public class AuthKujialeRequest extends AuthDefaultRequest { } @Override - public AuthResponse refresh(AuthToken authToken) { + public AuthResponse refresh(AuthToken authToken) { String response = new HttpUtils(config.getHttpConfig()).post(refreshTokenUrl(authToken.getRefreshToken())).getBody(); - return AuthResponse.builder().code(AuthResponseStatus.SUCCESS.getCode()).data(getAuthToken(response)).build(); + return AuthResponse.builder().code(AuthResponseStatus.SUCCESS.getCode()).data(getAuthToken(response)).build(); } } diff --git a/src/main/java/me/zhyd/oauth/request/AuthLineRequest.java b/src/main/java/me/zhyd/oauth/request/AuthLineRequest.java index 18db7a8..13d2fe3 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthLineRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthLineRequest.java @@ -88,7 +88,7 @@ public class AuthLineRequest extends AuthDefaultRequest { } @Override - public AuthResponse refresh(AuthToken oldToken) { + public AuthResponse refresh(AuthToken oldToken) { Map params = new HashMap<>(); params.put("grant_type", "refresh_token"); params.put("refresh_token", oldToken.getRefreshToken()); @@ -96,7 +96,7 @@ public class AuthLineRequest extends AuthDefaultRequest { params.put("client_secret", config.getClientSecret()); String response = new HttpUtils(config.getHttpConfig()).post(source.accessToken(), params, false).getBody(); JSONObject accessTokenObject = JSONObject.parseObject(response); - return AuthResponse.builder() + return AuthResponse.builder() .code(AuthResponseStatus.SUCCESS.getCode()) .data(AuthToken.builder() .accessToken(accessTokenObject.getString("access_token")) diff --git a/src/main/java/me/zhyd/oauth/request/AuthMeituanRequest.java b/src/main/java/me/zhyd/oauth/request/AuthMeituanRequest.java index 63b64b4..5a12936 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthMeituanRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthMeituanRequest.java @@ -78,7 +78,7 @@ public class AuthMeituanRequest extends AuthDefaultRequest { } @Override - public AuthResponse refresh(AuthToken oldToken) { + public AuthResponse refresh(AuthToken oldToken) { Map form = new HashMap<>(7); form.put("app_id", config.getClientId()); form.put("secret", config.getClientSecret()); @@ -90,7 +90,7 @@ public class AuthMeituanRequest extends AuthDefaultRequest { this.checkResponse(object); - return AuthResponse.builder() + return AuthResponse.builder() .code(AuthResponseStatus.SUCCESS.getCode()) .data(AuthToken.builder() .accessToken(object.getString("access_token")) diff --git a/src/main/java/me/zhyd/oauth/request/AuthMiRequest.java b/src/main/java/me/zhyd/oauth/request/AuthMiRequest.java index 7d473ca..380816e 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthMiRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthMiRequest.java @@ -110,8 +110,8 @@ public class AuthMiRequest extends AuthDefaultRequest { * @return AuthResponse */ @Override - public AuthResponse refresh(AuthToken authToken) { - return AuthResponse.builder() + public AuthResponse refresh(AuthToken authToken) { + return AuthResponse.builder() .code(AuthResponseStatus.SUCCESS.getCode()) .data(getToken(refreshTokenUrl(authToken.getRefreshToken()))) .build(); diff --git a/src/main/java/me/zhyd/oauth/request/AuthOktaRequest.java b/src/main/java/me/zhyd/oauth/request/AuthOktaRequest.java index 5f35430..5fa7b45 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthOktaRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthOktaRequest.java @@ -64,15 +64,15 @@ public class AuthOktaRequest extends AuthDefaultRequest { } @Override - public AuthResponse refresh(AuthToken authToken) { + public AuthResponse refresh(AuthToken authToken) { if (null == authToken.getRefreshToken()) { - return AuthResponse.builder() + return AuthResponse.builder() .code(AuthResponseStatus.ILLEGAL_TOKEN.getCode()) .msg(AuthResponseStatus.ILLEGAL_TOKEN.getMsg()) .build(); } String refreshUrl = refreshTokenUrl(authToken.getRefreshToken()); - return AuthResponse.builder() + return AuthResponse.builder() .code(AuthResponseStatus.SUCCESS.getCode()) .data(this.getAuthToken(refreshUrl)) .build(); diff --git a/src/main/java/me/zhyd/oauth/request/AuthQqRequest.java b/src/main/java/me/zhyd/oauth/request/AuthQqRequest.java index c750695..c6db06d 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthQqRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthQqRequest.java @@ -39,9 +39,9 @@ public class AuthQqRequest extends AuthDefaultRequest { } @Override - public AuthResponse refresh(AuthToken authToken) { + public AuthResponse refresh(AuthToken authToken) { String response = new HttpUtils(config.getHttpConfig()).get(refreshTokenUrl(authToken.getRefreshToken())).getBody(); - return AuthResponse.builder().code(AuthResponseStatus.SUCCESS.getCode()).data(getAuthToken(response)).build(); + return AuthResponse.builder().code(AuthResponseStatus.SUCCESS.getCode()).data(getAuthToken(response)).build(); } @Override diff --git a/src/main/java/me/zhyd/oauth/request/AuthRenrenRequest.java b/src/main/java/me/zhyd/oauth/request/AuthRenrenRequest.java index 2de6cc5..ada0e75 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthRenrenRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthRenrenRequest.java @@ -60,8 +60,8 @@ public class AuthRenrenRequest extends AuthDefaultRequest { } @Override - public AuthResponse refresh(AuthToken authToken) { - return AuthResponse.builder() + public AuthResponse refresh(AuthToken authToken) { + return AuthResponse.builder() .code(SUCCESS.getCode()) .data(getToken(this.refreshTokenUrl(authToken.getRefreshToken()))) .build(); diff --git a/src/main/java/me/zhyd/oauth/request/AuthRequest.java b/src/main/java/me/zhyd/oauth/request/AuthRequest.java index e4bd718..bbe4937 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthRequest.java @@ -5,6 +5,7 @@ import me.zhyd.oauth.exception.AuthException; import me.zhyd.oauth.model.AuthCallback; import me.zhyd.oauth.model.AuthResponse; import me.zhyd.oauth.model.AuthToken; +import me.zhyd.oauth.model.AuthUser; /** * JustAuth {@code Request}公共接口,所有平台的{@code Request}都需要实现该接口 @@ -49,7 +50,7 @@ public interface AuthRequest { * @param authCallback 用于接收回调参数的实体 * @return 返回登录成功后的用户信息 */ - default AuthResponse login(AuthCallback authCallback) { + default AuthResponse login(AuthCallback authCallback) { throw new AuthException(AuthResponseStatus.NOT_IMPLEMENTED); } @@ -69,7 +70,7 @@ public interface AuthRequest { * @param authToken 登录成功后返回的Token信息 * @return AuthResponse */ - default AuthResponse refresh(AuthToken authToken) { + default AuthResponse refresh(AuthToken authToken) { throw new AuthException(AuthResponseStatus.NOT_IMPLEMENTED); } } diff --git a/src/main/java/me/zhyd/oauth/request/AuthTaobaoRequest.java b/src/main/java/me/zhyd/oauth/request/AuthTaobaoRequest.java index f1df52b..eea7b15 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthTaobaoRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthTaobaoRequest.java @@ -79,11 +79,11 @@ public class AuthTaobaoRequest extends AuthDefaultRequest { } @Override - public AuthResponse refresh(AuthToken oldToken) { + public AuthResponse refresh(AuthToken oldToken) { String tokenUrl = refreshTokenUrl(oldToken.getRefreshToken()); String response = new HttpUtils(config.getHttpConfig()).post(tokenUrl).getBody(); JSONObject accessTokenObject = JSONObject.parseObject(response); - return AuthResponse.builder() + return AuthResponse.builder() .code(AuthResponseStatus.SUCCESS.getCode()) .data(this.getAuthToken(accessTokenObject)) .build(); diff --git a/src/main/java/me/zhyd/oauth/request/AuthTeambitionRequest.java b/src/main/java/me/zhyd/oauth/request/AuthTeambitionRequest.java index d529379..308a178 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthTeambitionRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthTeambitionRequest.java @@ -87,7 +87,7 @@ public class AuthTeambitionRequest extends AuthDefaultRequest { } @Override - public AuthResponse refresh(AuthToken oldToken) { + public AuthResponse refresh(AuthToken oldToken) { String uid = oldToken.getUid(); String refreshToken = oldToken.getRefreshToken(); @@ -99,7 +99,7 @@ public class AuthTeambitionRequest extends AuthDefaultRequest { this.checkResponse(refreshTokenObject); - return AuthResponse.builder() + return AuthResponse.builder() .code(AuthResponseStatus.SUCCESS.getCode()) .data(AuthToken.builder() .accessToken(refreshTokenObject.getString("access_token")) diff --git a/src/main/java/me/zhyd/oauth/request/AuthWeChatEnterpriseThirdQrcodeRequest.java b/src/main/java/me/zhyd/oauth/request/AuthWeChatEnterpriseThirdQrcodeRequest.java index ed25196..08b9f9a 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthWeChatEnterpriseThirdQrcodeRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthWeChatEnterpriseThirdQrcodeRequest.java @@ -41,14 +41,14 @@ public class AuthWeChatEnterpriseThirdQrcodeRequest extends AbstractAuthWeChatEn } @Override - public AuthResponse login(AuthCallback authCallback) { + public AuthResponse login(AuthCallback authCallback) { try { if (!config.isIgnoreCheckState()) { AuthChecker.checkState(authCallback.getState(), source, authStateCache); } AuthToken authToken = this.getAccessToken(authCallback); AuthUser user = this.getUserInfo(authToken); - return AuthResponse.builder().code(AuthResponseStatus.SUCCESS.getCode()).data(user).build(); + return AuthResponse.builder().code(AuthResponseStatus.SUCCESS.getCode()).data(user).build(); } catch (Exception e) { Log.error("Failed to login with oauth authorization.", e); return this.responseError(e); diff --git a/src/main/java/me/zhyd/oauth/request/AuthWeChatMpRequest.java b/src/main/java/me/zhyd/oauth/request/AuthWeChatMpRequest.java index 8ade04c..0502f28 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthWeChatMpRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthWeChatMpRequest.java @@ -79,8 +79,8 @@ public class AuthWeChatMpRequest extends AuthDefaultRequest { } @Override - public AuthResponse refresh(AuthToken oldToken) { - return AuthResponse.builder() + public AuthResponse refresh(AuthToken oldToken) { + return AuthResponse.builder() .code(AuthResponseStatus.SUCCESS.getCode()) .data(this.getToken(refreshTokenUrl(oldToken.getRefreshToken()))) .build(); diff --git a/src/main/java/me/zhyd/oauth/request/AuthWeChatOpenRequest.java b/src/main/java/me/zhyd/oauth/request/AuthWeChatOpenRequest.java index 7198887..44f724f 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthWeChatOpenRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthWeChatOpenRequest.java @@ -69,8 +69,8 @@ public class AuthWeChatOpenRequest extends AuthDefaultRequest { } @Override - public AuthResponse refresh(AuthToken oldToken) { - return AuthResponse.builder() + public AuthResponse refresh(AuthToken oldToken) { + return AuthResponse.builder() .code(AuthResponseStatus.SUCCESS.getCode()) .data(this.getToken(refreshTokenUrl(oldToken.getRefreshToken()))) .build(); diff --git a/src/test/java/me/zhyd/oauth/request/AuthExtendRequest.java b/src/test/java/me/zhyd/oauth/request/AuthExtendRequest.java index 7eb0184..6030f2c 100644 --- a/src/test/java/me/zhyd/oauth/request/AuthExtendRequest.java +++ b/src/test/java/me/zhyd/oauth/request/AuthExtendRequest.java @@ -87,8 +87,8 @@ public class AuthExtendRequest extends AuthDefaultRequest { * @return AuthResponse */ @Override - public AuthResponse refresh(AuthToken authToken) { - return AuthResponse.builder() + public AuthResponse refresh(AuthToken authToken) { + return AuthResponse.builder() .code(AuthResponseStatus.SUCCESS.getCode()) .data(AuthToken.builder() .openId("openId") From 431adb447faa3a20bd8035c80b13d6950d3f8457 Mon Sep 17 00:00:00 2001 From: handy Date: Fri, 2 Feb 2024 10:12:21 +0800 Subject: [PATCH 02/23] =?UTF-8?q?=E8=A1=A5=E5=85=85=E5=8D=95=E4=BE=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/me/zhyd/oauth/request/AuthExtendRequestTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/java/me/zhyd/oauth/request/AuthExtendRequestTest.java b/src/test/java/me/zhyd/oauth/request/AuthExtendRequestTest.java index 765881d..c961cf1 100644 --- a/src/test/java/me/zhyd/oauth/request/AuthExtendRequestTest.java +++ b/src/test/java/me/zhyd/oauth/request/AuthExtendRequestTest.java @@ -45,10 +45,10 @@ public class AuthExtendRequestTest { .code("code") .state(state) .build(); - AuthResponse response = request.login(callback); + AuthResponse response = request.login(callback); Assert.assertNotNull(response); - AuthUser user = (AuthUser) response.getData(); + AuthUser user = response.getData(); Assert.assertNotNull(user); System.out.println(JSON.toJSONString(user)); } @@ -74,7 +74,7 @@ public class AuthExtendRequestTest { .redirectUri("http://redirectUri") .build()); - AuthResponse response = request.refresh(AuthToken.builder().build()); + AuthResponse response = request.refresh(AuthToken.builder().build()); Assert.assertNotNull(response); System.out.println(JSON.toJSONString(response.getData())); From d62bb6eecfa19f1c02b5c633e3416c652e14c99a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Czhaolei=E2=80=9D?= <“zhaolei@lzzg365.com”> Date: Thu, 14 Mar 2024 16:53:02 +0800 Subject: [PATCH 03/23] change:[google oauth] api addr --- src/main/java/me/zhyd/oauth/config/AuthDefaultSource.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/me/zhyd/oauth/config/AuthDefaultSource.java b/src/main/java/me/zhyd/oauth/config/AuthDefaultSource.java index 35b835a..9cbb437 100644 --- a/src/main/java/me/zhyd/oauth/config/AuthDefaultSource.java +++ b/src/main/java/me/zhyd/oauth/config/AuthDefaultSource.java @@ -382,6 +382,7 @@ public enum AuthDefaultSource implements AuthSource { }, /** * Google + * 端点地址:https://accounts.google.com/.well-known/openid-configuration */ GOOGLE { @Override @@ -391,12 +392,12 @@ public enum AuthDefaultSource implements AuthSource { @Override public String accessToken() { - return "https://www.googleapis.com/oauth2/v4/token"; + return "https://oauth2.googleapis.com/token"; } @Override public String userInfo() { - return "https://www.googleapis.com/oauth2/v3/userinfo"; + return "https://openidconnect.googleapis.com/v1/userinfo"; } @Override From eaafd498901c27fb512581754082329139afa825 Mon Sep 17 00:00:00 2001 From: xiangqian Date: Mon, 22 Jul 2024 21:40:07 +0800 Subject: [PATCH 04/23] =?UTF-8?q?feat:=20=E9=9B=86=E6=88=90figma=E5=B9=B3?= =?UTF-8?q?=E5=8F=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../zhyd/oauth/config/AuthDefaultSource.java | 28 ++++- .../oauth/enums/scope/AuthFigmaScope.java | 29 +++++ .../zhyd/oauth/request/AuthFigmaRequest.java | 118 ++++++++++++++++++ 3 files changed, 174 insertions(+), 1 deletion(-) create mode 100644 src/main/java/me/zhyd/oauth/enums/scope/AuthFigmaScope.java create mode 100644 src/main/java/me/zhyd/oauth/request/AuthFigmaRequest.java diff --git a/src/main/java/me/zhyd/oauth/config/AuthDefaultSource.java b/src/main/java/me/zhyd/oauth/config/AuthDefaultSource.java index 35b835a..5800d3b 100644 --- a/src/main/java/me/zhyd/oauth/config/AuthDefaultSource.java +++ b/src/main/java/me/zhyd/oauth/config/AuthDefaultSource.java @@ -1296,6 +1296,32 @@ public enum AuthDefaultSource implements AuthSource { public Class getTargetClass() { return AuthProginnRequest.class; } - } + }, + FIGMA{ + @Override + public String authorize() { + return "https://www.figma.com/oauth"; + } + + @Override + public String accessToken() { + return "https://www.figma.com/api/oauth/token"; + } + + @Override + public String userInfo() { + return "https://api.figma.com/v1/me"; + } + + @Override + public String refresh() { + return "https://www.figma.com/api/oauth/refresh"; + } + + @Override + public Class getTargetClass() { + return null; + } + } } diff --git a/src/main/java/me/zhyd/oauth/enums/scope/AuthFigmaScope.java b/src/main/java/me/zhyd/oauth/enums/scope/AuthFigmaScope.java new file mode 100644 index 0000000..462a9a1 --- /dev/null +++ b/src/main/java/me/zhyd/oauth/enums/scope/AuthFigmaScope.java @@ -0,0 +1,29 @@ +package me.zhyd.oauth.enums.scope; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * Figma OAuth 授权范围 + * ... + * + * @author xiangqian + * @since 1.16.6 + */ +@Getter +@AllArgsConstructor +public enum AuthFigmaScope implements AuthScope { + + FILE_CONTENT("files:read", "Read files, projects, users, versions, comments, components & styles, and webhooks", true), + VARIABLES("file_variables:read,file_variables:write", "Read and write to variables in Figma file. Note: this is only available to members in Enterprise organizations", false), + COMMENTS("file_comments:write", "Post and delete comments and comment reactions in files", false), + DEV_RESOURCES("file_dev_resources:read,file_dev_resources:write", "Read and write to dev resources in files", false), + LIBRARY_ANALYTICS("library_analytics:read", "Read your design system analytics", false), + WEBHOOKS("webhooks:write", "Create and manage webhooks", false); + + private final String scope; + private final String description; + private final boolean isDefault; + + +} diff --git a/src/main/java/me/zhyd/oauth/request/AuthFigmaRequest.java b/src/main/java/me/zhyd/oauth/request/AuthFigmaRequest.java new file mode 100644 index 0000000..c5f0efa --- /dev/null +++ b/src/main/java/me/zhyd/oauth/request/AuthFigmaRequest.java @@ -0,0 +1,118 @@ +package me.zhyd.oauth.request; + +import com.alibaba.fastjson.JSONObject; +import com.xkcoding.http.support.HttpHeader; +import me.zhyd.oauth.cache.AuthStateCache; +import me.zhyd.oauth.config.AuthConfig; +import me.zhyd.oauth.config.AuthDefaultSource; +import me.zhyd.oauth.enums.AuthResponseStatus; +import me.zhyd.oauth.enums.scope.AuthFigmaScope; +import me.zhyd.oauth.exception.AuthException; +import me.zhyd.oauth.model.AuthCallback; +import me.zhyd.oauth.model.AuthResponse; +import me.zhyd.oauth.model.AuthToken; +import me.zhyd.oauth.model.AuthUser; +import me.zhyd.oauth.utils.*; + +/** + * Figma登录 + * @author xiangqian + * @since 1.16.6 + */ +public class AuthFigmaRequest extends AuthDefaultRequest { + public AuthFigmaRequest(AuthConfig config) { + super(config, AuthDefaultSource.FIGMA); + } + + public AuthFigmaRequest(AuthConfig config, AuthStateCache authStateCache) { + super(config, AuthDefaultSource.FIGMA, authStateCache); + } + + @Override + public String authorize(String state) { + return UrlBuilder.fromBaseUrl(super.authorize(state)) + .queryParam("scope", this.getScopes(",", true, AuthScopeUtils.getDefaultScopes(AuthFigmaScope.values()))) + .build(); + } + + @Override + protected AuthToken getAccessToken(AuthCallback authCallback) { + HttpHeader header = new HttpHeader() + .add("content-type", "application/x-www-form-urlencoded") + .add("Authorization", "Basic " + Base64Utils.encode(config.getClientId().concat(":").concat(config.getClientSecret()))); + + String response = new HttpUtils(config.getHttpConfig()).post(super.accessTokenUrl(authCallback.getCode()), null, header, true).getBody(); + JSONObject accessTokenObject = JSONObject.parseObject(response); + + this.checkResponse(accessTokenObject); + + return AuthToken.builder() + .accessToken(accessTokenObject.getString("access_token")) + .refreshToken(accessTokenObject.getString("refresh_token")) + .scope(accessTokenObject.getString("scope")) + .userId(accessTokenObject.getString("user_id")) + .expireIn(accessTokenObject.getIntValue("expires_in")) + .build(); + } + + @Override + public AuthResponse refresh(AuthToken authToken) { + HttpHeader header = new HttpHeader().add("content-type", "application/x-www-form-urlencoded"); + String response = new HttpUtils(config.getHttpConfig()).post(this.refreshTokenUrl(authToken.getRefreshToken()), null, header, false).getBody(); + JSONObject dataObj = JSONObject.parseObject(response); + + this.checkResponse(dataObj); + + return AuthResponse.builder() + .code(AuthResponseStatus.SUCCESS.getCode()) + .data(AuthToken.builder() + .accessToken(dataObj.getString("access_token")) + .openId(dataObj.getString("open_id")) + .expireIn(dataObj.getIntValue("expires_in")) + .refreshToken(dataObj.getString("refresh_token")) + .scope(dataObj.getString("scope")) + .build()) + .build(); + + } + + @Override + protected String refreshTokenUrl(String refreshToken) { + return UrlBuilder.fromBaseUrl(source.refresh()) + .queryParam("client_id", config.getClientId()) + .queryParam("client_secret", config.getClientSecret()) + .queryParam("refresh_token", refreshToken) + .build(); + } + + @Override + protected AuthUser getUserInfo(AuthToken authToken) { + HttpHeader header = new HttpHeader().add("Authorization", "Bearer " + authToken.getAccessToken()); + String response = new HttpUtils(config.getHttpConfig()).get(super.userInfoUrl(authToken), null, header, false).getBody(); + JSONObject dataObj = JSONObject.parseObject(response); + + this.checkResponse(dataObj); + + return AuthUser.builder() + .rawUserInfo(dataObj) + .uuid(dataObj.getString("id")) + .username(dataObj.getString("handle")) + .avatar(dataObj.getString("img_url")) + .email(dataObj.getString("email")) + .token(authToken) + .source(source.toString()) + .build(); + } + + + /** + * 校验响应结果 + * + * @param object 接口返回的结果 + */ + private void checkResponse(JSONObject object) { + if (object.containsKey("error")) { + throw new AuthException(object.getString("error") + ":" + object.getString("message")); + } + } +} From 15b1a974f3348332fe05a38da85ef88dc539b217 Mon Sep 17 00:00:00 2001 From: "yadong.zhang" Date: Sat, 3 Aug 2024 17:57:41 +0800 Subject: [PATCH 05/23] =?UTF-8?q?:hankey:=20=E8=A1=A5=E5=85=A8=E6=8A=96?= =?UTF-8?q?=E9=9F=B3=E5=B9=B3=E5=8F=B0=E7=BC=BA=E5=A4=B1=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E8=A1=A5=E5=85=A8=E3=80=82Github#188?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/me/zhyd/oauth/request/AuthDouyinRequest.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/me/zhyd/oauth/request/AuthDouyinRequest.java b/src/main/java/me/zhyd/oauth/request/AuthDouyinRequest.java index c157150..df5accb 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthDouyinRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthDouyinRequest.java @@ -44,6 +44,7 @@ public class AuthDouyinRequest extends AuthDefaultRequest { JSONObject userInfoObject = JSONObject.parseObject(response); this.checkResponse(userInfoObject); JSONObject object = userInfoObject.getJSONObject("data"); + authToken.setUnionId(object.getString("union_id")); return AuthUser.builder() .rawUserInfo(object) .uuid(object.getString("union_id")) @@ -96,6 +97,7 @@ public class AuthDouyinRequest extends AuthDefaultRequest { .openId(dataObj.getString("open_id")) .expireIn(dataObj.getIntValue("expires_in")) .refreshToken(dataObj.getString("refresh_token")) + .refreshTokenExpireIn(dataObj.getIntValue("refresh_expires_in")) .scope(dataObj.getString("scope")) .build(); } From 6d8b3b5f1df78a39c659918544dc42cd0e3f6171 Mon Sep 17 00:00:00 2001 From: "yadong.zhang" Date: Sat, 3 Aug 2024 18:27:36 +0800 Subject: [PATCH 06/23] =?UTF-8?q?:hankey:=20`getAccessToken`=E5=92=8C`getU?= =?UTF-8?q?serInfo`=E4=B8=A4=E4=B8=AA=E6=96=B9=E6=B3=95=E4=BB=8E`AuthDefau?= =?UTF-8?q?ltRequest`=E6=8F=90=E5=8D=87=E8=87=B3`AuthRequest`=E4=B8=AD?= =?UTF-8?q?=EF=BC=8C=E6=96=B9=E4=BE=BF=E7=9B=B4=E6=8E=A5=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E3=80=82[Github=20Issue#194](https://github.com/justauth/JustA?= =?UTF-8?q?uth/issues/194)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../request/AbstractAuthDingtalkRequest.java | 4 ++-- .../request/AbstractAuthMicrosoftRequest.java | 4 ++-- .../AbstractAuthWeChatEnterpriseRequest.java | 4 ++-- .../zhyd/oauth/request/AuthAfDianRequest.java | 4 ++-- .../zhyd/oauth/request/AuthAlipayRequest.java | 4 ++-- .../zhyd/oauth/request/AuthAliyunRequest.java | 4 ++-- .../zhyd/oauth/request/AuthAmazonRequest.java | 4 ++-- .../zhyd/oauth/request/AuthAppleRequest.java | 4 ++-- .../zhyd/oauth/request/AuthBaiduRequest.java | 4 ++-- .../zhyd/oauth/request/AuthCodingRequest.java | 4 ++-- .../zhyd/oauth/request/AuthCsdnRequest.java | 4 ++-- .../oauth/request/AuthDefaultRequest.java | 19 ------------------- .../zhyd/oauth/request/AuthDouyinRequest.java | 4 ++-- .../zhyd/oauth/request/AuthElemeRequest.java | 4 ++-- .../oauth/request/AuthFacebookRequest.java | 4 ++-- .../zhyd/oauth/request/AuthFeishuRequest.java | 4 ++-- .../zhyd/oauth/request/AuthFigmaRequest.java | 4 ++-- .../zhyd/oauth/request/AuthGiteeRequest.java | 4 ++-- .../zhyd/oauth/request/AuthGithubRequest.java | 4 ++-- .../zhyd/oauth/request/AuthGitlabRequest.java | 4 ++-- .../zhyd/oauth/request/AuthGoogleRequest.java | 4 ++-- .../zhyd/oauth/request/AuthHuaweiRequest.java | 4 ++-- .../me/zhyd/oauth/request/AuthJdRequest.java | 4 ++-- .../zhyd/oauth/request/AuthLineRequest.java | 4 ++-- .../oauth/request/AuthLinkedinRequest.java | 4 ++-- .../oauth/request/AuthMeituanRequest.java | 4 ++-- .../me/zhyd/oauth/request/AuthMiRequest.java | 4 ++-- .../zhyd/oauth/request/AuthOktaRequest.java | 4 ++-- .../oauth/request/AuthOschinaRequest.java | 4 ++-- .../oauth/request/AuthPinterestRequest.java | 4 ++-- .../oauth/request/AuthProginnRequest.java | 4 ++-- .../me/zhyd/oauth/request/AuthQqRequest.java | 4 ++-- .../zhyd/oauth/request/AuthRenrenRequest.java | 4 ++-- .../me/zhyd/oauth/request/AuthRequest.java | 19 +++++++++++++++++++ .../zhyd/oauth/request/AuthSlackRequest.java | 4 ++-- .../request/AuthStackOverflowRequest.java | 4 ++-- .../zhyd/oauth/request/AuthTaobaoRequest.java | 4 ++-- .../oauth/request/AuthTeambitionRequest.java | 4 ++-- .../oauth/request/AuthToutiaoRequest.java | 4 ++-- .../oauth/request/AuthTwitterRequest.java | 4 ++-- ...uthWeChatEnterpriseThirdQrcodeRequest.java | 4 ++-- .../oauth/request/AuthWeChatMpRequest.java | 4 ++-- .../oauth/request/AuthWeChatOpenRequest.java | 4 ++-- .../zhyd/oauth/request/AuthWeiboRequest.java | 4 ++-- .../zhyd/oauth/request/AuthXmlyRequest.java | 2 +- .../zhyd/oauth/request/AuthExtendRequest.java | 4 ++-- 46 files changed, 106 insertions(+), 106 deletions(-) diff --git a/src/main/java/me/zhyd/oauth/request/AbstractAuthDingtalkRequest.java b/src/main/java/me/zhyd/oauth/request/AbstractAuthDingtalkRequest.java index b331e78..541e202 100644 --- a/src/main/java/me/zhyd/oauth/request/AbstractAuthDingtalkRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AbstractAuthDingtalkRequest.java @@ -34,12 +34,12 @@ public abstract class AbstractAuthDingtalkRequest extends AuthDefaultRequest { } @Override - protected AuthToken getAccessToken(AuthCallback authCallback) { + public AuthToken getAccessToken(AuthCallback authCallback) { return AuthToken.builder().accessCode(authCallback.getCode()).build(); } @Override - protected AuthUser getUserInfo(AuthToken authToken) { + public AuthUser getUserInfo(AuthToken authToken) { String code = authToken.getAccessCode(); JSONObject param = new JSONObject(); param.put("tmp_auth_code", code); diff --git a/src/main/java/me/zhyd/oauth/request/AbstractAuthMicrosoftRequest.java b/src/main/java/me/zhyd/oauth/request/AbstractAuthMicrosoftRequest.java index d8f0200..c1d98de 100644 --- a/src/main/java/me/zhyd/oauth/request/AbstractAuthMicrosoftRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AbstractAuthMicrosoftRequest.java @@ -39,7 +39,7 @@ public abstract class AbstractAuthMicrosoftRequest extends AuthDefaultRequest { } @Override - protected AuthToken getAccessToken(AuthCallback authCallback) { + public AuthToken getAccessToken(AuthCallback authCallback) { return getToken(accessTokenUrl(authCallback.getCode())); } @@ -80,7 +80,7 @@ public abstract class AbstractAuthMicrosoftRequest extends AuthDefaultRequest { } @Override - protected AuthUser getUserInfo(AuthToken authToken) { + public AuthUser getUserInfo(AuthToken authToken) { String token = authToken.getAccessToken(); String tokenType = authToken.getTokenType(); String jwt = tokenType + " " + token; diff --git a/src/main/java/me/zhyd/oauth/request/AbstractAuthWeChatEnterpriseRequest.java b/src/main/java/me/zhyd/oauth/request/AbstractAuthWeChatEnterpriseRequest.java index a2105cf..9fd8067 100644 --- a/src/main/java/me/zhyd/oauth/request/AbstractAuthWeChatEnterpriseRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AbstractAuthWeChatEnterpriseRequest.java @@ -34,7 +34,7 @@ public abstract class AbstractAuthWeChatEnterpriseRequest extends AuthDefaultReq } @Override - protected AuthToken getAccessToken(AuthCallback authCallback) { + public AuthToken getAccessToken(AuthCallback authCallback) { String response = doGetAuthorizationCode(accessTokenUrl(null)); JSONObject object = this.checkResponse(response); @@ -47,7 +47,7 @@ public abstract class AbstractAuthWeChatEnterpriseRequest extends AuthDefaultReq } @Override - protected AuthUser getUserInfo(AuthToken authToken) { + public AuthUser getUserInfo(AuthToken authToken) { String response = doGetUserInfo(authToken); JSONObject object = this.checkResponse(response); diff --git a/src/main/java/me/zhyd/oauth/request/AuthAfDianRequest.java b/src/main/java/me/zhyd/oauth/request/AuthAfDianRequest.java index b30385e..6578077 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthAfDianRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthAfDianRequest.java @@ -30,7 +30,7 @@ public class AuthAfDianRequest extends AuthDefaultRequest { } @Override - protected AuthToken getAccessToken(AuthCallback authCallback) { + public AuthToken getAccessToken(AuthCallback authCallback) { Map params = new HashMap<>(); params.put("grant_type", "authorization_code"); params.put("client_id", config.getClientId()); @@ -44,7 +44,7 @@ public class AuthAfDianRequest extends AuthDefaultRequest { } @Override - protected AuthUser getUserInfo(AuthToken authToken) { + public AuthUser getUserInfo(AuthToken authToken) { return AuthUser.builder() .uuid(authToken.getUserId()) .gender(AuthUserGender.UNKNOWN) diff --git a/src/main/java/me/zhyd/oauth/request/AuthAlipayRequest.java b/src/main/java/me/zhyd/oauth/request/AuthAlipayRequest.java index 04aa0bc..b832346 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthAlipayRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthAlipayRequest.java @@ -147,7 +147,7 @@ public class AuthAlipayRequest extends AuthDefaultRequest { } @Override - protected AuthToken getAccessToken(AuthCallback authCallback) { + public AuthToken getAccessToken(AuthCallback authCallback) { AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest(); request.setGrantType("authorization_code"); request.setCode(authCallback.getAuth_code()); @@ -200,7 +200,7 @@ public class AuthAlipayRequest extends AuthDefaultRequest { } @Override - protected AuthUser getUserInfo(AuthToken authToken) { + public AuthUser getUserInfo(AuthToken authToken) { String accessToken = authToken.getAccessToken(); AlipayUserInfoShareRequest request = new AlipayUserInfoShareRequest(); AlipayUserInfoShareResponse response = null; diff --git a/src/main/java/me/zhyd/oauth/request/AuthAliyunRequest.java b/src/main/java/me/zhyd/oauth/request/AuthAliyunRequest.java index 9d4f98f..2651612 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthAliyunRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthAliyunRequest.java @@ -26,7 +26,7 @@ public class AuthAliyunRequest extends AuthDefaultRequest { } @Override - protected AuthToken getAccessToken(AuthCallback authCallback) { + public AuthToken getAccessToken(AuthCallback authCallback) { String response = doPostAuthorizationCode(authCallback.getCode()); JSONObject accessTokenObject = JSONObject.parseObject(response); return AuthToken.builder() @@ -39,7 +39,7 @@ public class AuthAliyunRequest extends AuthDefaultRequest { } @Override - protected AuthUser getUserInfo(AuthToken authToken) { + public AuthUser getUserInfo(AuthToken authToken) { String userInfo = doGetUserInfo(authToken); JSONObject object = JSONObject.parseObject(userInfo); return AuthUser.builder() diff --git a/src/main/java/me/zhyd/oauth/request/AuthAmazonRequest.java b/src/main/java/me/zhyd/oauth/request/AuthAmazonRequest.java index 78a6004..b4c70bc 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthAmazonRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthAmazonRequest.java @@ -77,7 +77,7 @@ public class AuthAmazonRequest extends AuthDefaultRequest { * @return access token */ @Override - protected AuthToken getAccessToken(AuthCallback authCallback) { + public AuthToken getAccessToken(AuthCallback authCallback) { Map form = new HashMap<>(9); form.put("grant_type", "authorization_code"); form.put("code", authCallback.getCode()); @@ -140,7 +140,7 @@ public class AuthAmazonRequest extends AuthDefaultRequest { * @return AuthUser */ @Override - protected AuthUser getUserInfo(AuthToken authToken) { + public AuthUser getUserInfo(AuthToken authToken) { String accessToken = authToken.getAccessToken(); this.checkToken(accessToken); diff --git a/src/main/java/me/zhyd/oauth/request/AuthAppleRequest.java b/src/main/java/me/zhyd/oauth/request/AuthAppleRequest.java index 20b41da..9c1b17b 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthAppleRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthAppleRequest.java @@ -50,7 +50,7 @@ public class AuthAppleRequest extends AuthDefaultRequest { } @Override - protected AuthToken getAccessToken(AuthCallback authCallback) { + public AuthToken getAccessToken(AuthCallback authCallback) { if (!StringUtils.isEmpty(authCallback.getError())) { throw new AuthException(authCallback.getError()); } @@ -76,7 +76,7 @@ public class AuthAppleRequest extends AuthDefaultRequest { } @Override - protected AuthUser getUserInfo(AuthToken authToken) { + public AuthUser getUserInfo(AuthToken authToken) { Base64.Decoder urlDecoder = Base64.getUrlDecoder(); String[] idToken = authToken.getIdToken().split("\\."); String payload = new String(urlDecoder.decode(idToken[1])); diff --git a/src/main/java/me/zhyd/oauth/request/AuthBaiduRequest.java b/src/main/java/me/zhyd/oauth/request/AuthBaiduRequest.java index 6f9851c..c75c15b 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthBaiduRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthBaiduRequest.java @@ -34,7 +34,7 @@ public class AuthBaiduRequest extends AuthDefaultRequest { } @Override - protected AuthToken getAccessToken(AuthCallback authCallback) { + public AuthToken getAccessToken(AuthCallback authCallback) { String response = doPostAuthorizationCode(authCallback.getCode()); return getAuthToken(response); } @@ -48,7 +48,7 @@ public class AuthBaiduRequest extends AuthDefaultRequest { * @return AuthUser */ @Override - protected AuthUser getUserInfo(AuthToken authToken) { + public AuthUser getUserInfo(AuthToken authToken) { String userInfo = doGetUserInfo(authToken); JSONObject object = JSONObject.parseObject(userInfo); this.checkResponse(object); diff --git a/src/main/java/me/zhyd/oauth/request/AuthCodingRequest.java b/src/main/java/me/zhyd/oauth/request/AuthCodingRequest.java index 6adc72b..6885ec8 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthCodingRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthCodingRequest.java @@ -30,7 +30,7 @@ public class AuthCodingRequest extends AuthDefaultRequest { } @Override - protected AuthToken getAccessToken(AuthCallback authCallback) { + public AuthToken getAccessToken(AuthCallback authCallback) { String response = doGetAuthorizationCode(authCallback.getCode()); JSONObject accessTokenObject = JSONObject.parseObject(response); this.checkResponse(accessTokenObject); @@ -42,7 +42,7 @@ public class AuthCodingRequest extends AuthDefaultRequest { } @Override - protected AuthUser getUserInfo(AuthToken authToken) { + public AuthUser getUserInfo(AuthToken authToken) { String response = doGetUserInfo(authToken); JSONObject object = JSONObject.parseObject(response); this.checkResponse(object); diff --git a/src/main/java/me/zhyd/oauth/request/AuthCsdnRequest.java b/src/main/java/me/zhyd/oauth/request/AuthCsdnRequest.java index 074a38d..e657131 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthCsdnRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthCsdnRequest.java @@ -28,7 +28,7 @@ public class AuthCsdnRequest extends AuthDefaultRequest { } @Override - protected AuthToken getAccessToken(AuthCallback authCallback) { + public AuthToken getAccessToken(AuthCallback authCallback) { String response = doPostAuthorizationCode(authCallback.getCode()); JSONObject accessTokenObject = JSONObject.parseObject(response); this.checkResponse(accessTokenObject); @@ -36,7 +36,7 @@ public class AuthCsdnRequest extends AuthDefaultRequest { } @Override - protected AuthUser getUserInfo(AuthToken authToken) { + public AuthUser getUserInfo(AuthToken authToken) { String response = doGetUserInfo(authToken); JSONObject object = JSONObject.parseObject(response); this.checkResponse(object); diff --git a/src/main/java/me/zhyd/oauth/request/AuthDefaultRequest.java b/src/main/java/me/zhyd/oauth/request/AuthDefaultRequest.java index 10168aa..0211406 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthDefaultRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthDefaultRequest.java @@ -43,25 +43,6 @@ public abstract class AuthDefaultRequest implements AuthRequest { this.checkConfig(config); } - /** - * 获取access token - * - * @param authCallback 授权成功后的回调参数 - * @return token - * @see AuthDefaultRequest#authorize() - * @see AuthDefaultRequest#authorize(String) - */ - protected abstract AuthToken getAccessToken(AuthCallback authCallback); - - /** - * 使用token换取用户信息 - * - * @param authToken token信息 - * @return 用户信息 - * @see AuthDefaultRequest#getAccessToken(AuthCallback) - */ - protected abstract AuthUser getUserInfo(AuthToken authToken); - /** * 统一的登录入口。当通过{@link AuthDefaultRequest#authorize(String)}授权成功后,会跳转到调用方的相关回调方法中 * 方法的入参可以使用{@code AuthCallback},{@code AuthCallback}类中封装好了OAuth2授权回调所需要的参数 diff --git a/src/main/java/me/zhyd/oauth/request/AuthDouyinRequest.java b/src/main/java/me/zhyd/oauth/request/AuthDouyinRequest.java index df5accb..0536f23 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthDouyinRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthDouyinRequest.java @@ -34,12 +34,12 @@ public class AuthDouyinRequest extends AuthDefaultRequest { } @Override - protected AuthToken getAccessToken(AuthCallback authCallback) { + public AuthToken getAccessToken(AuthCallback authCallback) { return this.getToken(accessTokenUrl(authCallback.getCode())); } @Override - protected AuthUser getUserInfo(AuthToken authToken) { + public AuthUser getUserInfo(AuthToken authToken) { String response = doGetUserInfo(authToken); JSONObject userInfoObject = JSONObject.parseObject(response); this.checkResponse(userInfoObject); diff --git a/src/main/java/me/zhyd/oauth/request/AuthElemeRequest.java b/src/main/java/me/zhyd/oauth/request/AuthElemeRequest.java index 3c87fd9..93f8643 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthElemeRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthElemeRequest.java @@ -44,7 +44,7 @@ public class AuthElemeRequest extends AuthDefaultRequest { } @Override - protected AuthToken getAccessToken(AuthCallback authCallback) { + public AuthToken getAccessToken(AuthCallback authCallback) { Map form = new HashMap<>(7); form.put("client_id", config.getClientId()); form.put("redirect_uri", config.getRedirectUri()); @@ -66,7 +66,7 @@ public class AuthElemeRequest extends AuthDefaultRequest { } @Override - protected AuthUser getUserInfo(AuthToken authToken) { + public AuthUser getUserInfo(AuthToken authToken) { Map parameters = new HashMap<>(4); // 获取商户账号信息的API接口名称 String action = "eleme.user.getUser"; diff --git a/src/main/java/me/zhyd/oauth/request/AuthFacebookRequest.java b/src/main/java/me/zhyd/oauth/request/AuthFacebookRequest.java index 597acdb..b50244a 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthFacebookRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthFacebookRequest.java @@ -32,7 +32,7 @@ public class AuthFacebookRequest extends AuthDefaultRequest { } @Override - protected AuthToken getAccessToken(AuthCallback authCallback) { + public AuthToken getAccessToken(AuthCallback authCallback) { String response = doPostAuthorizationCode(authCallback.getCode()); JSONObject accessTokenObject = JSONObject.parseObject(response); this.checkResponse(accessTokenObject); @@ -44,7 +44,7 @@ public class AuthFacebookRequest extends AuthDefaultRequest { } @Override - protected AuthUser getUserInfo(AuthToken authToken) { + public AuthUser getUserInfo(AuthToken authToken) { String userInfo = doGetUserInfo(authToken); JSONObject object = JSONObject.parseObject(userInfo); this.checkResponse(object); diff --git a/src/main/java/me/zhyd/oauth/request/AuthFeishuRequest.java b/src/main/java/me/zhyd/oauth/request/AuthFeishuRequest.java index 31b6283..f976a76 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthFeishuRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthFeishuRequest.java @@ -66,7 +66,7 @@ public class AuthFeishuRequest extends AuthDefaultRequest { } @Override - protected AuthToken getAccessToken(AuthCallback authCallback) { + public AuthToken getAccessToken(AuthCallback authCallback) { JSONObject requestObject = new JSONObject(); requestObject.put("app_access_token", this.getAppAccessToken()); requestObject.put("grant_type", "authorization_code"); @@ -76,7 +76,7 @@ public class AuthFeishuRequest extends AuthDefaultRequest { } @Override - protected AuthUser getUserInfo(AuthToken authToken) { + public AuthUser getUserInfo(AuthToken authToken) { String accessToken = authToken.getAccessToken(); String response = new HttpUtils(config.getHttpConfig()).get(source.userInfo(), null, new HttpHeader() .add("Content-Type", "application/json") diff --git a/src/main/java/me/zhyd/oauth/request/AuthFigmaRequest.java b/src/main/java/me/zhyd/oauth/request/AuthFigmaRequest.java index c5f0efa..4f874cc 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthFigmaRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthFigmaRequest.java @@ -36,7 +36,7 @@ public class AuthFigmaRequest extends AuthDefaultRequest { } @Override - protected AuthToken getAccessToken(AuthCallback authCallback) { + public AuthToken getAccessToken(AuthCallback authCallback) { HttpHeader header = new HttpHeader() .add("content-type", "application/x-www-form-urlencoded") .add("Authorization", "Basic " + Base64Utils.encode(config.getClientId().concat(":").concat(config.getClientSecret()))); @@ -86,7 +86,7 @@ public class AuthFigmaRequest extends AuthDefaultRequest { } @Override - protected AuthUser getUserInfo(AuthToken authToken) { + public AuthUser getUserInfo(AuthToken authToken) { HttpHeader header = new HttpHeader().add("Authorization", "Bearer " + authToken.getAccessToken()); String response = new HttpUtils(config.getHttpConfig()).get(super.userInfoUrl(authToken), null, header, false).getBody(); JSONObject dataObj = JSONObject.parseObject(response); diff --git a/src/main/java/me/zhyd/oauth/request/AuthGiteeRequest.java b/src/main/java/me/zhyd/oauth/request/AuthGiteeRequest.java index 735701c..2755d04 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthGiteeRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthGiteeRequest.java @@ -30,7 +30,7 @@ public class AuthGiteeRequest extends AuthDefaultRequest { } @Override - protected AuthToken getAccessToken(AuthCallback authCallback) { + public AuthToken getAccessToken(AuthCallback authCallback) { String response = doPostAuthorizationCode(authCallback.getCode()); JSONObject accessTokenObject = JSONObject.parseObject(response); this.checkResponse(accessTokenObject); @@ -44,7 +44,7 @@ public class AuthGiteeRequest extends AuthDefaultRequest { } @Override - protected AuthUser getUserInfo(AuthToken authToken) { + public AuthUser getUserInfo(AuthToken authToken) { String userInfo = doGetUserInfo(authToken); JSONObject object = JSONObject.parseObject(userInfo); this.checkResponse(object); diff --git a/src/main/java/me/zhyd/oauth/request/AuthGithubRequest.java b/src/main/java/me/zhyd/oauth/request/AuthGithubRequest.java index 2023162..360151a 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthGithubRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthGithubRequest.java @@ -35,7 +35,7 @@ public class AuthGithubRequest extends AuthDefaultRequest { } @Override - protected AuthToken getAccessToken(AuthCallback authCallback) { + public AuthToken getAccessToken(AuthCallback authCallback) { String response = doPostAuthorizationCode(authCallback.getCode()); Map res = GlobalAuthUtils.parseStringToMap(response); @@ -49,7 +49,7 @@ public class AuthGithubRequest extends AuthDefaultRequest { } @Override - protected AuthUser getUserInfo(AuthToken authToken) { + public AuthUser getUserInfo(AuthToken authToken) { HttpHeader header = new HttpHeader(); header.add("Authorization", "token " + authToken.getAccessToken()); String response = new HttpUtils(config.getHttpConfig()).get(UrlBuilder.fromBaseUrl(source.userInfo()).build(), null, header, false).getBody(); diff --git a/src/main/java/me/zhyd/oauth/request/AuthGitlabRequest.java b/src/main/java/me/zhyd/oauth/request/AuthGitlabRequest.java index a56a69d..91455f7 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthGitlabRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthGitlabRequest.java @@ -30,7 +30,7 @@ public class AuthGitlabRequest extends AuthDefaultRequest { } @Override - protected AuthToken getAccessToken(AuthCallback authCallback) { + public AuthToken getAccessToken(AuthCallback authCallback) { String response = doPostAuthorizationCode(authCallback.getCode()); JSONObject object = JSONObject.parseObject(response); @@ -46,7 +46,7 @@ public class AuthGitlabRequest extends AuthDefaultRequest { } @Override - protected AuthUser getUserInfo(AuthToken authToken) { + public AuthUser getUserInfo(AuthToken authToken) { String response = doGetUserInfo(authToken); JSONObject object = JSONObject.parseObject(response); diff --git a/src/main/java/me/zhyd/oauth/request/AuthGoogleRequest.java b/src/main/java/me/zhyd/oauth/request/AuthGoogleRequest.java index 04d7493..988e5d8 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthGoogleRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthGoogleRequest.java @@ -33,7 +33,7 @@ public class AuthGoogleRequest extends AuthDefaultRequest { } @Override - protected AuthToken getAccessToken(AuthCallback authCallback) { + public AuthToken getAccessToken(AuthCallback authCallback) { String response = doPostAuthorizationCode(authCallback.getCode()); JSONObject accessTokenObject = JSONObject.parseObject(response); this.checkResponse(accessTokenObject); @@ -47,7 +47,7 @@ public class AuthGoogleRequest extends AuthDefaultRequest { } @Override - protected AuthUser getUserInfo(AuthToken authToken) { + public AuthUser getUserInfo(AuthToken authToken) { HttpHeader httpHeader = new HttpHeader(); httpHeader.add("Authorization", "Bearer " + authToken.getAccessToken()); String userInfo = new HttpUtils(config.getHttpConfig()).post(userInfoUrl(authToken), null, httpHeader).getBody(); diff --git a/src/main/java/me/zhyd/oauth/request/AuthHuaweiRequest.java b/src/main/java/me/zhyd/oauth/request/AuthHuaweiRequest.java index 7c41407..22a12d6 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthHuaweiRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthHuaweiRequest.java @@ -46,7 +46,7 @@ public class AuthHuaweiRequest extends AuthDefaultRequest { * @see AuthDefaultRequest#authorize(String) */ @Override - protected AuthToken getAccessToken(AuthCallback authCallback) { + public AuthToken getAccessToken(AuthCallback authCallback) { Map form = new HashMap<>(8); form.put("grant_type", "authorization_code"); form.put("code", authCallback.getAuthorization_code()); @@ -66,7 +66,7 @@ public class AuthHuaweiRequest extends AuthDefaultRequest { * @see AuthDefaultRequest#getAccessToken(AuthCallback) */ @Override - protected AuthUser getUserInfo(AuthToken authToken) { + public AuthUser getUserInfo(AuthToken authToken) { Map form = new HashMap<>(7); form.put("nsp_ts", System.currentTimeMillis() + ""); form.put("access_token", authToken.getAccessToken()); diff --git a/src/main/java/me/zhyd/oauth/request/AuthJdRequest.java b/src/main/java/me/zhyd/oauth/request/AuthJdRequest.java index 4769ea8..4159b9f 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthJdRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthJdRequest.java @@ -39,7 +39,7 @@ public class AuthJdRequest extends AuthDefaultRequest { } @Override - protected AuthToken getAccessToken(AuthCallback authCallback) { + public AuthToken getAccessToken(AuthCallback authCallback) { Map params = new HashMap<>(7); params.put("app_key", config.getClientId()); @@ -61,7 +61,7 @@ public class AuthJdRequest extends AuthDefaultRequest { } @Override - protected AuthUser getUserInfo(AuthToken authToken) { + public AuthUser getUserInfo(AuthToken authToken) { UrlBuilder urlBuilder = UrlBuilder.fromBaseUrl(source.userInfo()) .queryParam("access_token", authToken.getAccessToken()) .queryParam("app_key", config.getClientId()) diff --git a/src/main/java/me/zhyd/oauth/request/AuthLineRequest.java b/src/main/java/me/zhyd/oauth/request/AuthLineRequest.java index 13d2fe3..722d201 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthLineRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthLineRequest.java @@ -36,7 +36,7 @@ public class AuthLineRequest extends AuthDefaultRequest { } @Override - protected AuthToken getAccessToken(AuthCallback authCallback) { + public AuthToken getAccessToken(AuthCallback authCallback) { Map params = new HashMap<>(); params.put("grant_type", "authorization_code"); params.put("code", authCallback.getCode()); @@ -56,7 +56,7 @@ public class AuthLineRequest extends AuthDefaultRequest { } @Override - protected AuthUser getUserInfo(AuthToken authToken) { + public AuthUser getUserInfo(AuthToken authToken) { String userInfo = new HttpUtils(config.getHttpConfig()).get(source.userInfo(), null, new HttpHeader() .add("Content-Type", "application/x-www-form-urlencoded") .add("Authorization", "Bearer ".concat(authToken.getAccessToken())), false).getBody(); diff --git a/src/main/java/me/zhyd/oauth/request/AuthLinkedinRequest.java b/src/main/java/me/zhyd/oauth/request/AuthLinkedinRequest.java index 40598c8..f59ad23 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthLinkedinRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthLinkedinRequest.java @@ -36,12 +36,12 @@ public class AuthLinkedinRequest extends AuthDefaultRequest { } @Override - protected AuthToken getAccessToken(AuthCallback authCallback) { + public AuthToken getAccessToken(AuthCallback authCallback) { return this.getToken(accessTokenUrl(authCallback.getCode())); } @Override - protected AuthUser getUserInfo(AuthToken authToken) { + public AuthUser getUserInfo(AuthToken authToken) { String accessToken = authToken.getAccessToken(); HttpHeader httpHeader = new HttpHeader(); httpHeader.add("Host", "api.linkedin.com"); diff --git a/src/main/java/me/zhyd/oauth/request/AuthMeituanRequest.java b/src/main/java/me/zhyd/oauth/request/AuthMeituanRequest.java index 5a12936..b1c5b17 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthMeituanRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthMeituanRequest.java @@ -34,7 +34,7 @@ public class AuthMeituanRequest extends AuthDefaultRequest { } @Override - protected AuthToken getAccessToken(AuthCallback authCallback) { + public AuthToken getAccessToken(AuthCallback authCallback) { Map form = new HashMap<>(7); form.put("app_id", config.getClientId()); form.put("secret", config.getClientSecret()); @@ -54,7 +54,7 @@ public class AuthMeituanRequest extends AuthDefaultRequest { } @Override - protected AuthUser getUserInfo(AuthToken authToken) { + public AuthUser getUserInfo(AuthToken authToken) { Map form = new HashMap<>(5); form.put("app_id", config.getClientId()); form.put("secret", config.getClientSecret()); diff --git a/src/main/java/me/zhyd/oauth/request/AuthMiRequest.java b/src/main/java/me/zhyd/oauth/request/AuthMiRequest.java index 380816e..cba8a99 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthMiRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthMiRequest.java @@ -38,7 +38,7 @@ public class AuthMiRequest extends AuthDefaultRequest { } @Override - protected AuthToken getAccessToken(AuthCallback authCallback) { + public AuthToken getAccessToken(AuthCallback authCallback) { return getToken(accessTokenUrl(authCallback.getCode())); } @@ -64,7 +64,7 @@ public class AuthMiRequest extends AuthDefaultRequest { } @Override - protected AuthUser getUserInfo(AuthToken authToken) { + public AuthUser getUserInfo(AuthToken authToken) { // 获取用户信息 String userResponse = doGetUserInfo(authToken); diff --git a/src/main/java/me/zhyd/oauth/request/AuthOktaRequest.java b/src/main/java/me/zhyd/oauth/request/AuthOktaRequest.java index 5fa7b45..150ed60 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthOktaRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthOktaRequest.java @@ -40,7 +40,7 @@ public class AuthOktaRequest extends AuthDefaultRequest { } @Override - protected AuthToken getAccessToken(AuthCallback authCallback) { + public AuthToken getAccessToken(AuthCallback authCallback) { String tokenUrl = accessTokenUrl(authCallback.getCode()); return getAuthToken(tokenUrl); } @@ -79,7 +79,7 @@ public class AuthOktaRequest extends AuthDefaultRequest { } @Override - protected AuthUser getUserInfo(AuthToken authToken) { + public AuthUser getUserInfo(AuthToken authToken) { HttpHeader header = new HttpHeader() .add("Authorization", "Bearer " + authToken.getAccessToken()); String response = new HttpUtils(config.getHttpConfig()).post(userInfoUrl(authToken), null, header, false).getBody(); diff --git a/src/main/java/me/zhyd/oauth/request/AuthOschinaRequest.java b/src/main/java/me/zhyd/oauth/request/AuthOschinaRequest.java index af5eb4e..32ed2a9 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthOschinaRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthOschinaRequest.java @@ -28,7 +28,7 @@ public class AuthOschinaRequest extends AuthDefaultRequest { } @Override - protected AuthToken getAccessToken(AuthCallback authCallback) { + public AuthToken getAccessToken(AuthCallback authCallback) { String response = doPostAuthorizationCode(authCallback.getCode()); JSONObject accessTokenObject = JSONObject.parseObject(response); this.checkResponse(accessTokenObject); @@ -41,7 +41,7 @@ public class AuthOschinaRequest extends AuthDefaultRequest { } @Override - protected AuthUser getUserInfo(AuthToken authToken) { + public AuthUser getUserInfo(AuthToken authToken) { String response = doGetUserInfo(authToken); JSONObject object = JSONObject.parseObject(response); this.checkResponse(object); diff --git a/src/main/java/me/zhyd/oauth/request/AuthPinterestRequest.java b/src/main/java/me/zhyd/oauth/request/AuthPinterestRequest.java index 9895876..e6fff1a 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthPinterestRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthPinterestRequest.java @@ -36,7 +36,7 @@ public class AuthPinterestRequest extends AuthDefaultRequest { } @Override - protected AuthToken getAccessToken(AuthCallback authCallback) { + public AuthToken getAccessToken(AuthCallback authCallback) { String response = doPostAuthorizationCode(authCallback.getCode()); JSONObject accessTokenObject = JSONObject.parseObject(response); this.checkResponse(accessTokenObject); @@ -47,7 +47,7 @@ public class AuthPinterestRequest extends AuthDefaultRequest { } @Override - protected AuthUser getUserInfo(AuthToken authToken) { + public AuthUser getUserInfo(AuthToken authToken) { String userinfoUrl = userInfoUrl(authToken); // TODO: 是否需要 .setFollowRedirects(true) String response = new HttpUtils(config.getHttpConfig()).get(userinfoUrl).getBody(); diff --git a/src/main/java/me/zhyd/oauth/request/AuthProginnRequest.java b/src/main/java/me/zhyd/oauth/request/AuthProginnRequest.java index 03a56be..9dc330b 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthProginnRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthProginnRequest.java @@ -34,7 +34,7 @@ public class AuthProginnRequest extends AuthDefaultRequest { } @Override - protected AuthToken getAccessToken(AuthCallback authCallback) { + public AuthToken getAccessToken(AuthCallback authCallback) { Map params = new HashMap<>(); params.put("code", authCallback.getCode()); params.put("client_id", config.getClientId()); @@ -54,7 +54,7 @@ public class AuthProginnRequest extends AuthDefaultRequest { } @Override - protected AuthUser getUserInfo(AuthToken authToken) { + public AuthUser getUserInfo(AuthToken authToken) { String userInfo = doGetUserInfo(authToken); JSONObject object = JSONObject.parseObject(userInfo); this.checkResponse(object); diff --git a/src/main/java/me/zhyd/oauth/request/AuthQqRequest.java b/src/main/java/me/zhyd/oauth/request/AuthQqRequest.java index c6db06d..c278d6d 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthQqRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthQqRequest.java @@ -33,7 +33,7 @@ public class AuthQqRequest extends AuthDefaultRequest { } @Override - protected AuthToken getAccessToken(AuthCallback authCallback) { + public AuthToken getAccessToken(AuthCallback authCallback) { String response = doGetAuthorizationCode(authCallback.getCode()); return getAuthToken(response); } @@ -45,7 +45,7 @@ public class AuthQqRequest extends AuthDefaultRequest { } @Override - protected AuthUser getUserInfo(AuthToken authToken) { + public AuthUser getUserInfo(AuthToken authToken) { String openId = this.getOpenId(authToken); String response = doGetUserInfo(authToken); JSONObject object = JSONObject.parseObject(response); diff --git a/src/main/java/me/zhyd/oauth/request/AuthRenrenRequest.java b/src/main/java/me/zhyd/oauth/request/AuthRenrenRequest.java index ada0e75..7e17e3a 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthRenrenRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthRenrenRequest.java @@ -38,12 +38,12 @@ public class AuthRenrenRequest extends AuthDefaultRequest { } @Override - protected AuthToken getAccessToken(AuthCallback authCallback) { + public AuthToken getAccessToken(AuthCallback authCallback) { return this.getToken(accessTokenUrl(authCallback.getCode())); } @Override - protected AuthUser getUserInfo(AuthToken authToken) { + public AuthUser getUserInfo(AuthToken authToken) { String response = doGetUserInfo(authToken); JSONObject userObj = JSONObject.parseObject(response).getJSONObject("response"); diff --git a/src/main/java/me/zhyd/oauth/request/AuthRequest.java b/src/main/java/me/zhyd/oauth/request/AuthRequest.java index bbe4937..e849bbb 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthRequest.java @@ -44,6 +44,25 @@ public interface AuthRequest { throw new AuthException(AuthResponseStatus.NOT_IMPLEMENTED); } + /** + * 获取access token + * + * @param authCallback 授权成功后的回调参数 + * @return token + * @see AuthDefaultRequest#authorize() + * @see AuthDefaultRequest#authorize(String) + */ + AuthToken getAccessToken(AuthCallback authCallback); + + /** + * 使用token换取用户信息 + * + * @param authToken token信息 + * @return 用户信息 + * @see AuthDefaultRequest#getAccessToken(AuthCallback) + */ + AuthUser getUserInfo(AuthToken authToken); + /** * 第三方登录 * diff --git a/src/main/java/me/zhyd/oauth/request/AuthSlackRequest.java b/src/main/java/me/zhyd/oauth/request/AuthSlackRequest.java index b1e1e30..95c4649 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthSlackRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthSlackRequest.java @@ -35,7 +35,7 @@ public class AuthSlackRequest extends AuthDefaultRequest { } @Override - protected AuthToken getAccessToken(AuthCallback authCallback) { + public AuthToken getAccessToken(AuthCallback authCallback) { HttpHeader header = new HttpHeader() .add("Content-Type", "application/x-www-form-urlencoded"); String response = new HttpUtils(config.getHttpConfig()) @@ -51,7 +51,7 @@ public class AuthSlackRequest extends AuthDefaultRequest { } @Override - protected AuthUser getUserInfo(AuthToken authToken) { + public AuthUser getUserInfo(AuthToken authToken) { HttpHeader header = new HttpHeader() .add("Content-Type", "application/x-www-form-urlencoded") .add("Authorization", "Bearer ".concat(authToken.getAccessToken())); diff --git a/src/main/java/me/zhyd/oauth/request/AuthStackOverflowRequest.java b/src/main/java/me/zhyd/oauth/request/AuthStackOverflowRequest.java index 969b456..f35d89c 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthStackOverflowRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthStackOverflowRequest.java @@ -37,7 +37,7 @@ public class AuthStackOverflowRequest extends AuthDefaultRequest { } @Override - protected AuthToken getAccessToken(AuthCallback authCallback) { + public AuthToken getAccessToken(AuthCallback authCallback) { String accessTokenUrl = accessTokenUrl(authCallback.getCode()); Map form = MapUtil.parseStringToMap(accessTokenUrl, false); HttpHeader httpHeader = new HttpHeader(); @@ -54,7 +54,7 @@ public class AuthStackOverflowRequest extends AuthDefaultRequest { } @Override - protected AuthUser getUserInfo(AuthToken authToken) { + public AuthUser getUserInfo(AuthToken authToken) { String userInfoUrl = UrlBuilder.fromBaseUrl(this.source.userInfo()) .queryParam("access_token", authToken.getAccessToken()) .queryParam("site", "stackoverflow") diff --git a/src/main/java/me/zhyd/oauth/request/AuthTaobaoRequest.java b/src/main/java/me/zhyd/oauth/request/AuthTaobaoRequest.java index eea7b15..d37e398 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthTaobaoRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthTaobaoRequest.java @@ -33,7 +33,7 @@ public class AuthTaobaoRequest extends AuthDefaultRequest { } @Override - protected AuthToken getAccessToken(AuthCallback authCallback) { + public AuthToken getAccessToken(AuthCallback authCallback) { return AuthToken.builder().accessCode(authCallback.getCode()).build(); } @@ -58,7 +58,7 @@ public class AuthTaobaoRequest extends AuthDefaultRequest { } @Override - protected AuthUser getUserInfo(AuthToken authToken) { + public AuthUser getUserInfo(AuthToken authToken) { String response = doPostAuthorizationCode(authToken.getAccessCode()); JSONObject accessTokenObject = JSONObject.parseObject(response); if (accessTokenObject.containsKey("error")) { diff --git a/src/main/java/me/zhyd/oauth/request/AuthTeambitionRequest.java b/src/main/java/me/zhyd/oauth/request/AuthTeambitionRequest.java index 308a178..d39fdf5 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthTeambitionRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthTeambitionRequest.java @@ -38,7 +38,7 @@ public class AuthTeambitionRequest extends AuthDefaultRequest { * @return 所有信息 */ @Override - protected AuthToken getAccessToken(AuthCallback authCallback) { + public AuthToken getAccessToken(AuthCallback authCallback) { Map form = new HashMap<>(7); form.put("client_id", config.getClientId()); form.put("client_secret", config.getClientSecret()); @@ -57,7 +57,7 @@ public class AuthTeambitionRequest extends AuthDefaultRequest { } @Override - protected AuthUser getUserInfo(AuthToken authToken) { + public AuthUser getUserInfo(AuthToken authToken) { String accessToken = authToken.getAccessToken(); HttpHeader httpHeader = new HttpHeader(); diff --git a/src/main/java/me/zhyd/oauth/request/AuthToutiaoRequest.java b/src/main/java/me/zhyd/oauth/request/AuthToutiaoRequest.java index ef6a84b..f361e31 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthToutiaoRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthToutiaoRequest.java @@ -29,7 +29,7 @@ public class AuthToutiaoRequest extends AuthDefaultRequest { } @Override - protected AuthToken getAccessToken(AuthCallback authCallback) { + public AuthToken getAccessToken(AuthCallback authCallback) { String response = doGetAuthorizationCode(authCallback.getCode()); JSONObject accessTokenObject = JSONObject.parseObject(response); @@ -43,7 +43,7 @@ public class AuthToutiaoRequest extends AuthDefaultRequest { } @Override - protected AuthUser getUserInfo(AuthToken authToken) { + public AuthUser getUserInfo(AuthToken authToken) { String userResponse = doGetUserInfo(authToken); JSONObject userProfile = JSONObject.parseObject(userResponse); diff --git a/src/main/java/me/zhyd/oauth/request/AuthTwitterRequest.java b/src/main/java/me/zhyd/oauth/request/AuthTwitterRequest.java index b4c0d66..9f1bb30 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthTwitterRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthTwitterRequest.java @@ -88,7 +88,7 @@ public class AuthTwitterRequest extends AuthDefaultRequest { * @return access token */ @Override - protected AuthToken getAccessToken(AuthCallback authCallback) { + public AuthToken getAccessToken(AuthCallback authCallback) { Map oauthParams = buildOauthParams(); oauthParams.put("oauth_token", authCallback.getOauth_token()); oauthParams.put("oauth_verifier", authCallback.getOauth_verifier()); @@ -115,7 +115,7 @@ public class AuthTwitterRequest extends AuthDefaultRequest { } @Override - protected AuthUser getUserInfo(AuthToken authToken) { + public AuthUser getUserInfo(AuthToken authToken) { Map queryParams = new HashMap<>(5); queryParams.put("include_entities", Boolean.toString(true)); queryParams.put("include_email", Boolean.toString(true)); diff --git a/src/main/java/me/zhyd/oauth/request/AuthWeChatEnterpriseThirdQrcodeRequest.java b/src/main/java/me/zhyd/oauth/request/AuthWeChatEnterpriseThirdQrcodeRequest.java index 79d0e18..6b1c25a 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthWeChatEnterpriseThirdQrcodeRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthWeChatEnterpriseThirdQrcodeRequest.java @@ -56,7 +56,7 @@ public class AuthWeChatEnterpriseThirdQrcodeRequest extends AbstractAuthWeChatEn } @Override - protected AuthToken getAccessToken(AuthCallback authCallback) { + public AuthToken getAccessToken(AuthCallback authCallback) { try { String response = doGetAuthorizationCode(accessTokenUrl()); JSONObject object = this.checkResponse(response); @@ -89,7 +89,7 @@ public class AuthWeChatEnterpriseThirdQrcodeRequest extends AbstractAuthWeChatEn } @Override - protected AuthUser getUserInfo(AuthToken authToken) { + public AuthUser getUserInfo(AuthToken authToken) { JSONObject response = this.checkResponse(doGetUserInfo(authToken)); return AuthUser.builder() .rawUserInfo(response) diff --git a/src/main/java/me/zhyd/oauth/request/AuthWeChatMpRequest.java b/src/main/java/me/zhyd/oauth/request/AuthWeChatMpRequest.java index 0502f28..be139cc 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthWeChatMpRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthWeChatMpRequest.java @@ -36,12 +36,12 @@ public class AuthWeChatMpRequest extends AuthDefaultRequest { * @return 所有信息 */ @Override - protected AuthToken getAccessToken(AuthCallback authCallback) { + public AuthToken getAccessToken(AuthCallback authCallback) { return this.getToken(accessTokenUrl(authCallback.getCode())); } @Override - protected AuthUser getUserInfo(AuthToken authToken) { + public AuthUser getUserInfo(AuthToken authToken) { String openId = authToken.getOpenId(); String scope = authToken.getScope(); diff --git a/src/main/java/me/zhyd/oauth/request/AuthWeChatOpenRequest.java b/src/main/java/me/zhyd/oauth/request/AuthWeChatOpenRequest.java index 44f724f..08cfc55 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthWeChatOpenRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthWeChatOpenRequest.java @@ -36,12 +36,12 @@ public class AuthWeChatOpenRequest extends AuthDefaultRequest { * @return 所有信息 */ @Override - protected AuthToken getAccessToken(AuthCallback authCallback) { + public AuthToken getAccessToken(AuthCallback authCallback) { return this.getToken(accessTokenUrl(authCallback.getCode())); } @Override - protected AuthUser getUserInfo(AuthToken authToken) { + public AuthUser getUserInfo(AuthToken authToken) { String openId = authToken.getOpenId(); String response = doGetUserInfo(authToken); diff --git a/src/main/java/me/zhyd/oauth/request/AuthWeiboRequest.java b/src/main/java/me/zhyd/oauth/request/AuthWeiboRequest.java index 5f6024a..509e1aa 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthWeiboRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthWeiboRequest.java @@ -33,7 +33,7 @@ public class AuthWeiboRequest extends AuthDefaultRequest { } @Override - protected AuthToken getAccessToken(AuthCallback authCallback) { + public AuthToken getAccessToken(AuthCallback authCallback) { String response = doPostAuthorizationCode(authCallback.getCode()); JSONObject accessTokenObject = JSONObject.parseObject(response); if (accessTokenObject.containsKey("error")) { @@ -48,7 +48,7 @@ public class AuthWeiboRequest extends AuthDefaultRequest { } @Override - protected AuthUser getUserInfo(AuthToken authToken) { + public AuthUser getUserInfo(AuthToken authToken) { String accessToken = authToken.getAccessToken(); String uid = authToken.getUid(); String oauthParam = String.format("uid=%s&access_token=%s", uid, accessToken); diff --git a/src/main/java/me/zhyd/oauth/request/AuthXmlyRequest.java b/src/main/java/me/zhyd/oauth/request/AuthXmlyRequest.java index 2430aa2..93c89c5 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthXmlyRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthXmlyRequest.java @@ -42,7 +42,7 @@ public class AuthXmlyRequest extends AuthDefaultRequest { * @see AuthDefaultRequest#authorize(String) */ @Override - protected AuthToken getAccessToken(AuthCallback authCallback) { + public AuthToken getAccessToken(AuthCallback authCallback) { Map map = new HashMap<>(9); map.put("code", authCallback.getCode()); map.put("client_id", config.getClientId()); diff --git a/src/test/java/me/zhyd/oauth/request/AuthExtendRequest.java b/src/test/java/me/zhyd/oauth/request/AuthExtendRequest.java index 6030f2c..6bccad7 100644 --- a/src/test/java/me/zhyd/oauth/request/AuthExtendRequest.java +++ b/src/test/java/me/zhyd/oauth/request/AuthExtendRequest.java @@ -36,7 +36,7 @@ public class AuthExtendRequest extends AuthDefaultRequest { * @see AuthDefaultRequest#authorize(String) */ @Override - protected AuthToken getAccessToken(AuthCallback authCallback) { + public AuthToken getAccessToken(AuthCallback authCallback) { return AuthToken.builder() .openId("openId") .expireIn(1000) @@ -56,7 +56,7 @@ public class AuthExtendRequest extends AuthDefaultRequest { * @see AuthDefaultRequest#getAccessToken(AuthCallback) */ @Override - protected AuthUser getUserInfo(AuthToken authToken) { + public AuthUser getUserInfo(AuthToken authToken) { return AuthUser.builder() .username("test") .nickname("test") From 0eafb96a434d5bad276c318ef705985c6c99f1f3 Mon Sep 17 00:00:00 2001 From: "yadong.zhang" Date: Sun, 4 Aug 2024 14:45:30 +0800 Subject: [PATCH 07/23] =?UTF-8?q?:hankey:=20improve:=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=20AuthCallback=20=E8=8E=B7=E5=8F=96=20code=20=E7=9A=84?= =?UTF-8?q?=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/me/zhyd/oauth/model/AuthCallback.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/me/zhyd/oauth/model/AuthCallback.java b/src/main/java/me/zhyd/oauth/model/AuthCallback.java index bce57c8..b6558e2 100644 --- a/src/main/java/me/zhyd/oauth/model/AuthCallback.java +++ b/src/main/java/me/zhyd/oauth/model/AuthCallback.java @@ -5,6 +5,7 @@ import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import me.zhyd.oauth.utils.StringUtils; import java.io.Serializable; @@ -68,4 +69,8 @@ public class AuthCallback implements Serializable { * @see error response */ private String error; + + public String getCode() { + return StringUtils.isEmpty(code) ? auth_code : code; + } } From 5d521e3ea4527f704941acef9c2164ab0d9ccb1b Mon Sep 17 00:00:00 2001 From: "yadong.zhang" Date: Sun, 4 Aug 2024 15:33:37 +0800 Subject: [PATCH 08/23] =?UTF-8?q?:hankey:=20=E6=B7=BB=E5=8A=A0=E6=96=B0?= =?UTF-8?q?=E7=89=88`=E4=BC=81=E4=B8=9A=E5=BE=AE=E4=BF=A1=E6=89=AB?= =?UTF-8?q?=E7=A0=81`=E7=99=BB=E5=BD=95=E8=83=BD=E5=8A=9B=EF=BC=88PS.=20?= =?UTF-8?q?=E6=96=B0=E7=89=88=E4=BC=81=E4=B8=9A=E5=BE=AE=E4=BF=A1=E7=99=BB?= =?UTF-8?q?=E5=BD=95=EF=BC=8C=E9=99=A4=E4=BA=86=E6=94=AF=E6=8C=81=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E7=A7=BB=E5=8A=A8=E7=AB=AF=E4=BC=81=E4=B8=9A=E5=BE=AE?= =?UTF-8?q?=E4=BF=A1=E6=89=AB=E7=A0=81=E7=99=BB=E5=BD=95=E4=B9=8B=E5=A4=96?= =?UTF-8?q?=EF=BC=8C=E8=BF=98=E6=94=AF=E6=8C=81=E9=80=9A=E8=BF=87=E4=BC=81?= =?UTF-8?q?=E4=B8=9A=E5=BE=AE=E4=BF=A1=E6=A1=8C=E9=9D=A2=E7=AB=AF=E8=BF=9B?= =?UTF-8?q?=E8=A1=8C=E5=BF=AB=E9=80=9F=E7=99=BB=E5=BD=95=E3=80=82=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/me/zhyd/oauth/config/AuthConfig.java | 16 ++++++++++++ .../zhyd/oauth/config/AuthDefaultSource.java | 26 +++++++++++++++++++ .../zhyd/oauth/enums/AuthResponseStatus.java | 1 + .../AuthWeChatEnterpriseQrcodeRequest.java | 1 + 4 files changed, 44 insertions(+) diff --git a/src/main/java/me/zhyd/oauth/config/AuthConfig.java b/src/main/java/me/zhyd/oauth/config/AuthConfig.java index fb3b4bd..6dbb4b0 100644 --- a/src/main/java/me/zhyd/oauth/config/AuthConfig.java +++ b/src/main/java/me/zhyd/oauth/config/AuthConfig.java @@ -198,4 +198,20 @@ public class AuthConfig { * @see team id */ private String teamId; + + /** + * 新版企业微信 Web 登录时的参数, + * + * 登录类型。ServiceApp:服务商登录;CorpApp:企业自建/代开发应用登录。 + * @see https://developer.work.weixin.qq.com/document/path/98152 + * @since 1.16.7 + */ + private String loginType = "CorpApp"; + + /** + * 语言编码 + * + * @since 1.16.7 + */ + private String lang = "zh"; } diff --git a/src/main/java/me/zhyd/oauth/config/AuthDefaultSource.java b/src/main/java/me/zhyd/oauth/config/AuthDefaultSource.java index 6ff75d9..b1bf595 100644 --- a/src/main/java/me/zhyd/oauth/config/AuthDefaultSource.java +++ b/src/main/java/me/zhyd/oauth/config/AuthDefaultSource.java @@ -764,6 +764,32 @@ public enum AuthDefaultSource implements AuthSource { return AuthWeChatEnterpriseQrcodeRequest.class; } }, + /** + * 新版企业微信 Web 登录(扫码),参考 https://developer.work.weixin.qq.com/document/path/98152 + * + * @since 1.16.7 + */ + WECHAT_ENTERPRISE_V2 { + @Override + public String authorize() { + return "https://login.work.weixin.qq.com/wwlogin/sso/login"; + } + + @Override + public String accessToken() { + return "https://qyapi.weixin.qq.com/cgi-bin/gettoken"; + } + + @Override + public String userInfo() { + return "https://qyapi.weixin.qq.com/cgi-bin/auth/getuserinfo"; + } + + @Override + public Class getTargetClass() { + return AuthWeChatEnterpriseQrcodeV2Request.class; + } + }, /** * 企业微信二维码第三方登录 */ diff --git a/src/main/java/me/zhyd/oauth/enums/AuthResponseStatus.java b/src/main/java/me/zhyd/oauth/enums/AuthResponseStatus.java index 5cd6c2b..4a9b30a 100644 --- a/src/main/java/me/zhyd/oauth/enums/AuthResponseStatus.java +++ b/src/main/java/me/zhyd/oauth/enums/AuthResponseStatus.java @@ -33,6 +33,7 @@ public enum AuthResponseStatus { ILLEGAL_TEAM_ID(5013, "Invalid team id"), ILLEGAL_CLIENT_ID(5014, "Invalid client id"), ILLEGAL_CLIENT_SECRET(5015, "Invalid client secret"), + ILLEGAL_WECHAT_AGENT_ID(5016, "Illegal wechat agent id"), ; private final int code; diff --git a/src/main/java/me/zhyd/oauth/request/AuthWeChatEnterpriseQrcodeRequest.java b/src/main/java/me/zhyd/oauth/request/AuthWeChatEnterpriseQrcodeRequest.java index 127ee5f..2e1ae55 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthWeChatEnterpriseQrcodeRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthWeChatEnterpriseQrcodeRequest.java @@ -31,6 +31,7 @@ public class AuthWeChatEnterpriseQrcodeRequest extends AbstractAuthWeChatEnterpr .queryParam("agentid", config.getAgentId()) .queryParam("redirect_uri", config.getRedirectUri()) .queryParam("state", getRealState(state)) + .queryParam("lang", config.getLang()) .build(); } } From 415c7035394ae1f1f7391c77ecd386860bbbd488 Mon Sep 17 00:00:00 2001 From: "yadong.zhang" Date: Sun, 4 Aug 2024 15:33:49 +0800 Subject: [PATCH 09/23] =?UTF-8?q?:hankey:=20=E4=BF=AE=E5=A4=8D=20twitter?= =?UTF-8?q?=20=E5=B9=B3=E5=8F=B0=E5=9C=A8=20Java11=20=E7=8E=AF=E5=A2=83?= =?UTF-8?q?=E4=B8=8B=E7=99=BB=E5=BD=95=E5=A4=B1=E8=B4=A5=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E3=80=82[#174](https://github.com/justauth/JustAuth/i?= =?UTF-8?q?ssues/174)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AuthWeChatEnterpriseQrcodeV2Request.java | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 src/main/java/me/zhyd/oauth/request/AuthWeChatEnterpriseQrcodeV2Request.java diff --git a/src/main/java/me/zhyd/oauth/request/AuthWeChatEnterpriseQrcodeV2Request.java b/src/main/java/me/zhyd/oauth/request/AuthWeChatEnterpriseQrcodeV2Request.java new file mode 100644 index 0000000..3bbbd8c --- /dev/null +++ b/src/main/java/me/zhyd/oauth/request/AuthWeChatEnterpriseQrcodeV2Request.java @@ -0,0 +1,51 @@ +package me.zhyd.oauth.request; + +import me.zhyd.oauth.cache.AuthStateCache; +import me.zhyd.oauth.config.AuthConfig; +import me.zhyd.oauth.config.AuthDefaultSource; +import me.zhyd.oauth.enums.AuthResponseStatus; +import me.zhyd.oauth.exception.AuthException; +import me.zhyd.oauth.utils.GlobalAuthUtils; +import me.zhyd.oauth.utils.StringUtils; +import me.zhyd.oauth.utils.UrlBuilder; + +/** + *

+ * 新版企业微信 Web 登录,参考 https://developer.work.weixin.qq.com/document/path/98152 + *

+ * + * @author yadong.zhang (yadong.zhang0415(a)gmail.com) + * @since 1.16.7 + */ +public class AuthWeChatEnterpriseQrcodeV2Request extends AbstractAuthWeChatEnterpriseRequest { + public AuthWeChatEnterpriseQrcodeV2Request(AuthConfig config) { + super(config, AuthDefaultSource.WECHAT_ENTERPRISE_V2); + } + + public AuthWeChatEnterpriseQrcodeV2Request(AuthConfig config, AuthStateCache authStateCache) { + super(config, AuthDefaultSource.WECHAT_ENTERPRISE_V2, authStateCache); + } + + @Override + public String authorize(String state) { + return UrlBuilder.fromBaseUrl(source.authorize()) + .queryParam("login_type", config.getLoginType()) + // 登录类型为企业自建应用/服务商代开发应用时填企业 CorpID,第三方登录时填登录授权 SuiteID + .queryParam("appid", config.getClientId()) + // 企业自建应用/服务商代开发应用 AgentID,当login_type=CorpApp时填写 + .queryParam("agentid", config.getAgentId()) + .queryParam("redirect_uri", GlobalAuthUtils.urlEncode(config.getRedirectUri())) + .queryParam("state", getRealState(state)) + .queryParam("lang", config.getLang()) + .build() + .concat("#wechat_redirect"); + } + + @Override + protected void checkConfig(AuthConfig config) { + super.checkConfig(config); + if ("CorpApp".equals(config.getLoginType()) && StringUtils.isEmpty(config.getAgentId())) { + throw new AuthException(AuthResponseStatus.ILLEGAL_WECHAT_AGENT_ID, source); + } + } +} From 5eb8160a423197f4efcda1ac8ffae673fb482b51 Mon Sep 17 00:00:00 2001 From: "yadong.zhang" Date: Sun, 4 Aug 2024 15:38:40 +0800 Subject: [PATCH 10/23] =?UTF-8?q?:hankey:=20=E6=B7=BB=E5=8A=A0=E6=96=B0?= =?UTF-8?q?=E7=89=88`=E4=BC=81=E4=B8=9A=E5=BE=AE=E4=BF=A1=E6=89=AB?= =?UTF-8?q?=E7=A0=81`=E7=99=BB=E5=BD=95=E8=83=BD=E5=8A=9B=EF=BC=88PS.=20?= =?UTF-8?q?=E6=96=B0=E7=89=88=E4=BC=81=E4=B8=9A=E5=BE=AE=E4=BF=A1=E7=99=BB?= =?UTF-8?q?=E5=BD=95=EF=BC=8C=E9=99=A4=E4=BA=86=E6=94=AF=E6=8C=81=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E7=A7=BB=E5=8A=A8=E7=AB=AF=E4=BC=81=E4=B8=9A=E5=BE=AE?= =?UTF-8?q?=E4=BF=A1=E6=89=AB=E7=A0=81=E7=99=BB=E5=BD=95=E4=B9=8B=E5=A4=96?= =?UTF-8?q?=EF=BC=8C=E8=BF=98=E6=94=AF=E6=8C=81=E9=80=9A=E8=BF=87=E4=BC=81?= =?UTF-8?q?=E4=B8=9A=E5=BE=AE=E4=BF=A1=E6=A1=8C=E9=9D=A2=E7=AB=AF=E8=BF=9B?= =?UTF-8?q?=E8=A1=8C=E5=BF=AB=E9=80=9F=E7=99=BB=E5=BD=95=E3=80=82=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AuthWeChatEnterpriseQrcodeV2Request.java | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 src/main/java/me/zhyd/oauth/request/AuthWeChatEnterpriseQrcodeV2Request.java diff --git a/src/main/java/me/zhyd/oauth/request/AuthWeChatEnterpriseQrcodeV2Request.java b/src/main/java/me/zhyd/oauth/request/AuthWeChatEnterpriseQrcodeV2Request.java new file mode 100644 index 0000000..3bbbd8c --- /dev/null +++ b/src/main/java/me/zhyd/oauth/request/AuthWeChatEnterpriseQrcodeV2Request.java @@ -0,0 +1,51 @@ +package me.zhyd.oauth.request; + +import me.zhyd.oauth.cache.AuthStateCache; +import me.zhyd.oauth.config.AuthConfig; +import me.zhyd.oauth.config.AuthDefaultSource; +import me.zhyd.oauth.enums.AuthResponseStatus; +import me.zhyd.oauth.exception.AuthException; +import me.zhyd.oauth.utils.GlobalAuthUtils; +import me.zhyd.oauth.utils.StringUtils; +import me.zhyd.oauth.utils.UrlBuilder; + +/** + *

+ * 新版企业微信 Web 登录,参考 https://developer.work.weixin.qq.com/document/path/98152 + *

+ * + * @author yadong.zhang (yadong.zhang0415(a)gmail.com) + * @since 1.16.7 + */ +public class AuthWeChatEnterpriseQrcodeV2Request extends AbstractAuthWeChatEnterpriseRequest { + public AuthWeChatEnterpriseQrcodeV2Request(AuthConfig config) { + super(config, AuthDefaultSource.WECHAT_ENTERPRISE_V2); + } + + public AuthWeChatEnterpriseQrcodeV2Request(AuthConfig config, AuthStateCache authStateCache) { + super(config, AuthDefaultSource.WECHAT_ENTERPRISE_V2, authStateCache); + } + + @Override + public String authorize(String state) { + return UrlBuilder.fromBaseUrl(source.authorize()) + .queryParam("login_type", config.getLoginType()) + // 登录类型为企业自建应用/服务商代开发应用时填企业 CorpID,第三方登录时填登录授权 SuiteID + .queryParam("appid", config.getClientId()) + // 企业自建应用/服务商代开发应用 AgentID,当login_type=CorpApp时填写 + .queryParam("agentid", config.getAgentId()) + .queryParam("redirect_uri", GlobalAuthUtils.urlEncode(config.getRedirectUri())) + .queryParam("state", getRealState(state)) + .queryParam("lang", config.getLang()) + .build() + .concat("#wechat_redirect"); + } + + @Override + protected void checkConfig(AuthConfig config) { + super.checkConfig(config); + if ("CorpApp".equals(config.getLoginType()) && StringUtils.isEmpty(config.getAgentId())) { + throw new AuthException(AuthResponseStatus.ILLEGAL_WECHAT_AGENT_ID, source); + } + } +} From b01704ff78041be17cb2a154c7c2357d41674515 Mon Sep 17 00:00:00 2001 From: "yadong.zhang" Date: Sun, 4 Aug 2024 15:51:38 +0800 Subject: [PATCH 11/23] =?UTF-8?q?:hankey:=20=E8=A7=A3=E5=86=B3=E5=8D=95?= =?UTF-8?q?=E6=B5=8B=E5=A4=B1=E8=B4=A5=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/me/zhyd/oauth/config/AuthDefaultSource.java | 2 +- src/test/java/me/zhyd/oauth/AuthRequestBuilderTest.java | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/me/zhyd/oauth/config/AuthDefaultSource.java b/src/main/java/me/zhyd/oauth/config/AuthDefaultSource.java index b1bf595..5e67cee 100644 --- a/src/main/java/me/zhyd/oauth/config/AuthDefaultSource.java +++ b/src/main/java/me/zhyd/oauth/config/AuthDefaultSource.java @@ -1373,7 +1373,7 @@ public enum AuthDefaultSource implements AuthSource { @Override public Class getTargetClass() { - return null; + return AuthFigmaRequest.class; } } diff --git a/src/test/java/me/zhyd/oauth/AuthRequestBuilderTest.java b/src/test/java/me/zhyd/oauth/AuthRequestBuilderTest.java index 127e665..54c9eb8 100644 --- a/src/test/java/me/zhyd/oauth/AuthRequestBuilderTest.java +++ b/src/test/java/me/zhyd/oauth/AuthRequestBuilderTest.java @@ -82,6 +82,8 @@ public class AuthRequestBuilderTest { .stackOverflowKey("asd") .deviceId("asd") .clientOsType(3) + .kid("kid") + .teamId("teamid") .build(); for (AuthDefaultSource value : AuthDefaultSource.values()) { From 6859b8a9493c33592e9ef42990bae308bb551309 Mon Sep 17 00:00:00 2001 From: "yadong.zhang" Date: Sun, 4 Aug 2024 23:28:55 +0800 Subject: [PATCH 12/23] =?UTF-8?q?:fire:=20Amazon=20PKCE=20=E4=B8=AD?= =?UTF-8?q?=E7=9A=84=20code=5Fverifier=20=E5=9F=BA=E4=BA=8E=20state=20?= =?UTF-8?q?=E7=BC=93=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/me/zhyd/oauth/request/AuthAmazonRequest.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/me/zhyd/oauth/request/AuthAmazonRequest.java b/src/main/java/me/zhyd/oauth/request/AuthAmazonRequest.java index b4c70bc..85e1a58 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthAmazonRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthAmazonRequest.java @@ -50,15 +50,16 @@ public class AuthAmazonRequest extends AuthDefaultRequest { */ @Override public String authorize(String state) { + String realState = getRealState(state); UrlBuilder builder = UrlBuilder.fromBaseUrl(source.authorize()) .queryParam("client_id", config.getClientId()) .queryParam("scope", this.getScopes(" ", true, AuthScopeUtils.getDefaultScopes(AuthAmazonScope.values()))) .queryParam("redirect_uri", config.getRedirectUri()) .queryParam("response_type", "code") - .queryParam("state", getRealState(state)); + .queryParam("state", realState); if (config.isPkce()) { - String cacheKey = this.source.getName().concat(":code_verifier:").concat(config.getClientId()); + String cacheKey = this.source.getName().concat(":code_verifier:").concat(realState); String codeVerifier = PkceUtil.generateCodeVerifier(); String codeChallengeMethod = "S256"; String codeChallenge = PkceUtil.generateCodeChallenge(codeChallengeMethod, codeVerifier); @@ -86,7 +87,7 @@ public class AuthAmazonRequest extends AuthDefaultRequest { form.put("client_secret", config.getClientSecret()); if (config.isPkce()) { - String cacheKey = this.source.getName().concat(":code_verifier:").concat(config.getClientId()); + String cacheKey = this.source.getName().concat(":code_verifier:").concat(authCallback.getState()); String codeVerifier = this.authStateCache.get(cacheKey); form.put("code_verifier", codeVerifier); } From 8f376129d4d2a88feffd1b9d069cdc0319b0124d Mon Sep 17 00:00:00 2001 From: "yadong.zhang" Date: Sat, 17 Aug 2024 20:11:51 +0800 Subject: [PATCH 13/23] =?UTF-8?q?:fire:=20=E6=94=AF=E6=8C=81=E5=BE=AE?= =?UTF-8?q?=E4=BF=A1=E5=B0=8F=E7=A8=8B=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOGS.md | 17 ++- .../zhyd/oauth/config/AuthDefaultSource.java | 30 ++++++ .../request/AuthWechatMiniProgramRequest.java | 100 ++++++++++++++++++ 3 files changed, 143 insertions(+), 4 deletions(-) create mode 100644 src/main/java/me/zhyd/oauth/request/AuthWechatMiniProgramRequest.java diff --git a/CHANGELOGS.md b/CHANGELOGS.md index 4287a48..6e399cb 100644 --- a/CHANGELOGS.md +++ b/CHANGELOGS.md @@ -1,11 +1,20 @@ -## 1.16.6 +## 1.16.7 ### 2024/08/03 - +: - 新增 - - 添加 appleid 社交登录能力。 [Github #192](https://github.com/justauth/JustAuth/pull/192) -- Fixed + - 添加`appleid`社交登录能力。 [Github#192](https://github.com/justauth/JustAuth/pull/192) + - 添加`figma`社交登录能力。 [Gitee#41](https://gitee.com/yadong.zhang/JustAuth/pulls/41) + - 添加新版`企业微信扫码`登录能力。 [Github Issue#165](https://github.com/justauth/JustAuth/issues/165) + - 新增微信小程序授权登录 - 优化 + - 更新 Google 端点地址。[Github #198](https://github.com/justauth/JustAuth/pull/198) + - Amazon PKCE 中的 `code_verifier` 基于 `state` 缓存 + - `AuthRequest`响应时携带泛型,避免二次解析。[Gitee#38](https://gitee.com/yadong.zhang/JustAuth/pulls/38) + - 优化业务调用方式:`getAccessToken`和`getUserInfo`两个方法从`AuthDefaultRequest`提升至`AuthRequest`中,部分场景下可以减少一次网络请求。[Github Issue#194](https://github.com/justauth/JustAuth/issues/194) + - ***注意:如果有基于 JustAuth 规范自定义实现的三方平台 Request([自定义第三方平台的OAuth](https://justauth.cn/features/customize-the-oauth/)),需要注意`getAccessToken`和`getUserInfo`接口的访问级别是否正确!!!*** +- 其他 + - 补充单侧,[Gitee#39](https://gitee.com/yadong.zhang/JustAuth/pulls/39) ## 1.16.6 diff --git a/src/main/java/me/zhyd/oauth/config/AuthDefaultSource.java b/src/main/java/me/zhyd/oauth/config/AuthDefaultSource.java index 5e67cee..dd704c3 100644 --- a/src/main/java/me/zhyd/oauth/config/AuthDefaultSource.java +++ b/src/main/java/me/zhyd/oauth/config/AuthDefaultSource.java @@ -1375,6 +1375,36 @@ public enum AuthDefaultSource implements AuthSource { public Class getTargetClass() { return AuthFigmaRequest.class; } + }, + /** + * 微信小程序授权登录 + * @since yudaocode + */ + WECHAT_MINI_PROGRAM { + + @Override + public String authorize() { + // 参见 https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html 文档 + throw new UnsupportedOperationException("不支持获取授权 url,请使用小程序内置函数 wx.login() 登录获取 code"); + } + + @Override + public String accessToken() { + // 参见 https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html 文档 + // 获取 openid, unionId , session_key 等字段 + return "https://api.weixin.qq.com/sns/jscode2session"; + } + + @Override + public String userInfo() { + // 参见 https://developers.weixin.qq.com/miniprogram/dev/api/open-api/user-info/wx.getUserProfile.html 文档 + throw new UnsupportedOperationException("不支持获取用户信息 url,请使用小程序内置函数 wx.getUserProfile() 获取用户信息"); + } + + @Override + public Class getTargetClass() { + return AuthWechatMiniProgramRequest.class; + } } } diff --git a/src/main/java/me/zhyd/oauth/request/AuthWechatMiniProgramRequest.java b/src/main/java/me/zhyd/oauth/request/AuthWechatMiniProgramRequest.java new file mode 100644 index 0000000..7d630d6 --- /dev/null +++ b/src/main/java/me/zhyd/oauth/request/AuthWechatMiniProgramRequest.java @@ -0,0 +1,100 @@ +package me.zhyd.oauth.request; + +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; +import me.zhyd.oauth.cache.AuthStateCache; +import me.zhyd.oauth.config.AuthConfig; +import me.zhyd.oauth.config.AuthDefaultSource; +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.HttpUtils; +import me.zhyd.oauth.utils.UrlBuilder; + +/** + * 微信小程序授权登录 + * + * @author yadong.zhang (yadong.zhang0415(a)gmail.com) + * @author yudaocode + * @version 1.0.0 + * @since 1.0.0 + */ +public class AuthWechatMiniProgramRequest extends AuthDefaultRequest { + public AuthWechatMiniProgramRequest(AuthConfig config) { + super(config, AuthDefaultSource.WECHAT_MINI_PROGRAM); + } + + public AuthWechatMiniProgramRequest(AuthConfig config, AuthStateCache authStateCache) { + super(config, AuthDefaultSource.WECHAT_MINI_PROGRAM, authStateCache); + } + + @Override + public AuthToken getAccessToken(AuthCallback authCallback) { + // 参见 https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html 文档 + // 使用 code 获取对应的 openId、unionId 等字段 + String response = new HttpUtils(config.getHttpConfig()).get(accessTokenUrl(authCallback.getCode())).getBody(); + JSCode2SessionResponse accessTokenObject = JSONObject.parseObject(response, JSCode2SessionResponse.class); + assert accessTokenObject != null; + checkResponse(accessTokenObject); + // 拼装结果 + return AuthToken.builder() + .openId(accessTokenObject.getOpenid()) + .unionId(accessTokenObject.getUnionId()) + .accessToken(accessTokenObject.getSessionKey()) + .build(); + } + + @Override + public AuthUser getUserInfo(AuthToken authToken) { + // 参见 https://developers.weixin.qq.com/miniprogram/dev/api/open-api/user-info/wx.getUserProfile.html 文档 + // 如果需要用户信息,需要在小程序调用函数后传给后端 + return AuthUser.builder() + .username("") + .nickname("") + .avatar("") + .uuid(authToken.getOpenId()) + .token(authToken) + .source(source.toString()) + .build(); + } + + /** + * 检查响应内容是否正确 + * + * @param response 请求响应内容 + */ + private void checkResponse(JSCode2SessionResponse response) { + if (response.getErrorCode() != 0) { + throw new AuthException(response.getErrorCode(), response.getErrorMsg()); + } + } + + @Override + protected String accessTokenUrl(String code) { + return UrlBuilder.fromBaseUrl(source.accessToken()) + .queryParam("appid", config.getClientId()) + .queryParam("secret", config.getClientSecret()) + .queryParam("js_code", code) + .queryParam("grant_type", "authorization_code") + .build(); + } + + @Data + @SuppressWarnings("SpellCheckingInspection") + private static class JSCode2SessionResponse { + + @JSONField(name = "errcode") + private int errorCode; + @JSONField(name = "errmsg") + private String errorMsg; + @JSONField(name = "session_key") + private String sessionKey; + private String openid; + @JSONField(name = "unionid") + private String unionId; + + } + +} From 91167bcbf72ced3e777ffd032e599f66c2946615 Mon Sep 17 00:00:00 2001 From: "yadong.zhang" Date: Sat, 17 Aug 2024 20:16:14 +0800 Subject: [PATCH 14/23] =?UTF-8?q?:fire:=20=E6=94=AF=E6=8C=81=E5=BE=AE?= =?UTF-8?q?=E4=BF=A1=E5=B0=8F=E7=A8=8B=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/me/zhyd/oauth/AuthRequestBuilderTest.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/test/java/me/zhyd/oauth/AuthRequestBuilderTest.java b/src/test/java/me/zhyd/oauth/AuthRequestBuilderTest.java index 54c9eb8..5de9dcc 100644 --- a/src/test/java/me/zhyd/oauth/AuthRequestBuilderTest.java +++ b/src/test/java/me/zhyd/oauth/AuthRequestBuilderTest.java @@ -84,6 +84,8 @@ public class AuthRequestBuilderTest { .clientOsType(3) .kid("kid") .teamId("teamid") + .ignoreCheckState(true) + .ignoreCheckRedirectUri(true) .build(); for (AuthDefaultSource value : AuthDefaultSource.values()) { @@ -99,6 +101,12 @@ public class AuthRequestBuilderTest { System.out.println(authRequest.authorize(AuthStateUtils.createState())); continue; } + case WECHAT_MINI_PROGRAM: { + // 小程序不支持获取调用 authorize + AuthRequest authRequest = new AuthWechatMiniProgramRequest(config); + System.out.println(value.getTargetClass()); + continue; + } default: AuthRequest authRequest = AuthRequestBuilder.builder() .source(value.getName()) From 602a48b3ce982c928bbe05417d9009e88485e5b0 Mon Sep 17 00:00:00 2001 From: handy Date: Tue, 27 Aug 2024 10:51:00 +0800 Subject: [PATCH 15/23] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=88=B1=E5=8F=91?= =?UTF-8?q?=E7=94=B5=E5=B9=B3=E5=8F=B0=E7=9A=84=E5=9F=9F=E5=90=8D=E4=B8=BA?= =?UTF-8?q?https://afdian.com?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/me/zhyd/oauth/config/AuthDefaultSource.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/me/zhyd/oauth/config/AuthDefaultSource.java b/src/main/java/me/zhyd/oauth/config/AuthDefaultSource.java index dd704c3..edb6dfd 100644 --- a/src/main/java/me/zhyd/oauth/config/AuthDefaultSource.java +++ b/src/main/java/me/zhyd/oauth/config/AuthDefaultSource.java @@ -1301,17 +1301,17 @@ public enum AuthDefaultSource implements AuthSource { } }, /** - * 爱发电 爱发电 + * 爱发电 爱发电 */ AFDIAN { @Override public String authorize() { - return "https://afdian.net/oauth2/authorize"; + return "https://afdian.com/oauth2/authorize"; } @Override public String accessToken() { - return "https://afdian.net/api/oauth2/access_token"; + return "https://afdian.com/api/oauth2/access_token"; } @Override From 20731ea77e8ea81324ba541425415e020edfbf82 Mon Sep 17 00:00:00 2001 From: "yadong.zhang" Date: Sun, 1 Sep 2024 18:15:18 +0800 Subject: [PATCH 16/23] =?UTF-8?q?:hankey:=20=E6=B7=BB=E5=8A=A0=E6=96=B0?= =?UTF-8?q?=E7=89=88`=E5=8D=8E=E4=B8=BA`=E7=99=BB=E5=BD=95=E8=83=BD?= =?UTF-8?q?=E5=8A=9B=EF=BC=8C=E5=8E=9F`AuthHuaweiRequest`=E4=BC=9A?= =?UTF-8?q?=E5=9C=A8=E5=90=8E=E9=9D=A2=E7=89=88=E6=9C=AC=E8=A2=AB=E5=BC=83?= =?UTF-8?q?=E7=94=A8=EF=BC=8C=E5=A6=82=E6=9C=89=E4=BD=BF=E7=94=A8=EF=BC=8C?= =?UTF-8?q?=E8=AF=B7=E5=88=87=E6=8D=A2=E5=88=B0`AuthHuaweiV3Request`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOGS.md | 1 + .../zhyd/oauth/config/AuthDefaultSource.java | 35 ++++ .../oauth/enums/scope/AuthHuaweiScope.java | 3 + .../oauth/enums/scope/AuthHuaweiV3Scope.java | 51 +++++ .../zhyd/oauth/request/AuthHuaweiRequest.java | 7 +- .../oauth/request/AuthHuaweiV3Request.java | 196 ++++++++++++++++++ .../java/me/zhyd/oauth/utils/AuthChecker.java | 2 +- 7 files changed, 293 insertions(+), 2 deletions(-) create mode 100644 src/main/java/me/zhyd/oauth/enums/scope/AuthHuaweiV3Scope.java create mode 100644 src/main/java/me/zhyd/oauth/request/AuthHuaweiV3Request.java diff --git a/CHANGELOGS.md b/CHANGELOGS.md index 6e399cb..40a76ba 100644 --- a/CHANGELOGS.md +++ b/CHANGELOGS.md @@ -6,6 +6,7 @@ - 添加`appleid`社交登录能力。 [Github#192](https://github.com/justauth/JustAuth/pull/192) - 添加`figma`社交登录能力。 [Gitee#41](https://gitee.com/yadong.zhang/JustAuth/pulls/41) - 添加新版`企业微信扫码`登录能力。 [Github Issue#165](https://github.com/justauth/JustAuth/issues/165) + - 添加新版`华为`登录能力,原`AuthHuaweiRequest`会在后面版本被弃用,如有使用,请切换到`AuthHuaweiV3Request` - 新增微信小程序授权登录 - 优化 - 更新 Google 端点地址。[Github #198](https://github.com/justauth/JustAuth/pull/198) diff --git a/src/main/java/me/zhyd/oauth/config/AuthDefaultSource.java b/src/main/java/me/zhyd/oauth/config/AuthDefaultSource.java index dd704c3..4b583a5 100644 --- a/src/main/java/me/zhyd/oauth/config/AuthDefaultSource.java +++ b/src/main/java/me/zhyd/oauth/config/AuthDefaultSource.java @@ -709,8 +709,11 @@ public enum AuthDefaultSource implements AuthSource { /** * 华为 * + * 当前方式未来可能被废弃,建议使用 {@link this#HUAWEI_V3} + * * @since 1.10.0 */ + @Deprecated HUAWEI { @Override public String authorize() { @@ -738,6 +741,38 @@ public enum AuthDefaultSource implements AuthSource { } }, + /** + * 华为最新版本的 API + * + * @since 1.16.7 + */ + HUAWEI_V3 { + @Override + public String authorize() { + return "https://oauth-login.cloud.huawei.com/oauth2/v3/authorize"; + } + + @Override + public String accessToken() { + return "https://oauth-login.cloud.huawei.com/oauth2/v3/token"; + } + + @Override + public String userInfo() { + return "https://account.cloud.huawei.com/rest.php"; + } + + @Override + public String refresh() { + return "https://oauth-login.cloud.huawei.com/oauth2/v3/token"; + } + + @Override + public Class getTargetClass() { + return AuthHuaweiV3Request.class; + } + }, + /** * 企业微信二维码登录 * diff --git a/src/main/java/me/zhyd/oauth/enums/scope/AuthHuaweiScope.java b/src/main/java/me/zhyd/oauth/enums/scope/AuthHuaweiScope.java index 4e450f9..05d0873 100644 --- a/src/main/java/me/zhyd/oauth/enums/scope/AuthHuaweiScope.java +++ b/src/main/java/me/zhyd/oauth/enums/scope/AuthHuaweiScope.java @@ -6,12 +6,15 @@ import lombok.Getter; /** * 华为平台 OAuth 授权范围 * + * 当前方式未来可能被废弃,建议使用 {@link AuthHuaweiV3Scope} + * * @author yadong.zhang (yadong.zhang0415(a)gmail.com) * @version 1.0.0 * @since 1.0.0 */ @Getter @AllArgsConstructor +@Deprecated public enum AuthHuaweiScope implements AuthScope { /** diff --git a/src/main/java/me/zhyd/oauth/enums/scope/AuthHuaweiV3Scope.java b/src/main/java/me/zhyd/oauth/enums/scope/AuthHuaweiV3Scope.java new file mode 100644 index 0000000..f2d04a4 --- /dev/null +++ b/src/main/java/me/zhyd/oauth/enums/scope/AuthHuaweiV3Scope.java @@ -0,0 +1,51 @@ +package me.zhyd.oauth.enums.scope; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 华为平台 V3 版本 OAuth 授权范围 + * + * @author yadong.zhang (yadong.zhang0415(a)gmail.com) + * @version 1.0.0 + * @since 1.16.7 + */ +@Getter +@AllArgsConstructor +public enum AuthHuaweiV3Scope implements AuthScope { + + /** + * {@code scope} 含义,以{@code description} 为准 + */ + OPENID("openid", "基础scope,v3必选", true), + /** + * {@code scope} 含义,以{@code description} 为准 + */ + BASE_PROFILE("https://www.huawei.com/auth/account/base.profile", "获取用户的基本信息", true), + MOBILE_NUMBER("https://www.huawei.com/auth/account/mobile.number", "获取用户的手机号", false), + ACCOUNTLIST("https://www.huawei.com/auth/account/accountlist", "获取用户的账单列表", false), + + /** + * 以下两个 scope 不需要经过华为评估和验证 + */ + SCOPE_DRIVE_FILE("https://www.huawei.com/auth/drive.file", "只允许访问由应用程序创建或打开的文件", false), + SCOPE_DRIVE_APPDATA("https://www.huawei.com/auth/drive.appdata", "只允许访问由应用程序创建或打开的文件", false), + /** + * 以下四个 scope 使用前需要向drivekit@huawei.com提交申请 + *

+ * 参考:https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides-V5/server-dev-0000001050039664-V5#ZH-CN_TOPIC_0000001050039664__section1618418855716 + */ + SCOPE_DRIVE("https://www.huawei.com/auth/drive", "只允许访问由应用程序创建或打开的文件", false), + SCOPE_DRIVE_READONLY("https://www.huawei.com/auth/drive.readonly", "只允许访问由应用程序创建或打开的文件", false), + SCOPE_DRIVE_METADATA("https://www.huawei.com/auth/drive.metadata", "只允许访问由应用程序创建或打开的文件", false), + SCOPE_DRIVE_METADATA_READONLY("https://www.huawei.com/auth/drive.metadata.readonly", "只允许访问由应用程序创建或打开的文件", false), + + + ; + ; + + private final String scope; + private final String description; + private final boolean isDefault; + +} diff --git a/src/main/java/me/zhyd/oauth/request/AuthHuaweiRequest.java b/src/main/java/me/zhyd/oauth/request/AuthHuaweiRequest.java index 22a12d6..2249c7a 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthHuaweiRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthHuaweiRequest.java @@ -23,10 +23,13 @@ import static me.zhyd.oauth.enums.AuthResponseStatus.SUCCESS; /** * 华为授权登录 * + * 当前方式未来可能被废弃,建议使用 {@link AuthHuaweiV3Request} + * * @author yadong.zhang (yadong.zhang0415(a)gmail.com) * @version 1.0 * @since 1.10.0 */ +@Deprecated public class AuthHuaweiRequest extends AuthDefaultRequest { public AuthHuaweiRequest(AuthConfig config) { @@ -71,7 +74,9 @@ public class AuthHuaweiRequest extends AuthDefaultRequest { form.put("nsp_ts", System.currentTimeMillis() + ""); form.put("access_token", authToken.getAccessToken()); form.put("nsp_fmt", "JS"); - form.put("nsp_svc", "OpenUP.User.getInfo"); + form.put("open_id", "OPENID"); + // form.put("nsp_svc", "OpenUP.User.getInfo"); + form.put("nsp_svc", "huawei.oauth2.user.getTokenInfo"); String response = new HttpUtils(config.getHttpConfig()).post(source.userInfo(), form, false).getBody(); JSONObject object = JSONObject.parseObject(response); diff --git a/src/main/java/me/zhyd/oauth/request/AuthHuaweiV3Request.java b/src/main/java/me/zhyd/oauth/request/AuthHuaweiV3Request.java new file mode 100644 index 0000000..6da0ad0 --- /dev/null +++ b/src/main/java/me/zhyd/oauth/request/AuthHuaweiV3Request.java @@ -0,0 +1,196 @@ +package me.zhyd.oauth.request; + +import com.alibaba.fastjson.JSONObject; +import com.xkcoding.http.constants.Constants; +import com.xkcoding.http.support.HttpHeader; +import me.zhyd.oauth.cache.AuthStateCache; +import me.zhyd.oauth.config.AuthConfig; +import me.zhyd.oauth.config.AuthDefaultSource; +import me.zhyd.oauth.enums.AuthUserGender; +import me.zhyd.oauth.enums.scope.AuthHuaweiV3Scope; +import me.zhyd.oauth.exception.AuthException; +import me.zhyd.oauth.model.AuthCallback; +import me.zhyd.oauth.model.AuthResponse; +import me.zhyd.oauth.model.AuthToken; +import me.zhyd.oauth.model.AuthUser; +import me.zhyd.oauth.utils.*; + +import java.nio.charset.StandardCharsets; +import java.util.Base64; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +import static me.zhyd.oauth.enums.AuthResponseStatus.SUCCESS; + +/** + * 华为授权登录 + * + * @author yadong.zhang (yadong.zhang0415(a)gmail.com) + * @version 1.0 + * @since 1.16.7 + */ +public class AuthHuaweiV3Request extends AuthDefaultRequest { + + public AuthHuaweiV3Request(AuthConfig config) { + super(config, AuthDefaultSource.HUAWEI_V3); + } + + public AuthHuaweiV3Request(AuthConfig config, AuthStateCache authStateCache) { + super(config, AuthDefaultSource.HUAWEI_V3, authStateCache); + } + + /** + * 获取access token + * + * @param authCallback 授权成功后的回调参数 + * @return token + * @see AuthDefaultRequest#authorize() + * @see AuthDefaultRequest#authorize(String) + */ + @Override + public AuthToken getAccessToken(AuthCallback authCallback) { + Map form = new HashMap<>(8); + form.put("grant_type", "authorization_code"); + form.put("code", authCallback.getCode()); + form.put("client_id", config.getClientId()); + form.put("client_secret", config.getClientSecret()); + form.put("redirect_uri", config.getRedirectUri()); + + if (config.isPkce()) { + String cacheKey = this.source.getName().concat(":code_verifier:").concat(authCallback.getState()); + String codeVerifier = this.authStateCache.get(cacheKey); + form.put("code_verifier", codeVerifier); + } + + HttpHeader httpHeader = new HttpHeader(); + httpHeader.add(Constants.CONTENT_TYPE, "application/x-www-form-urlencoded"); + String response = new HttpUtils(config.getHttpConfig()).post(source.accessToken(), form, httpHeader, false).getBody(); + return getAuthToken(response); + } + + /** + * 使用token换取用户信息 + * + * @param authToken token信息 + * @return 用户信息 + * @see AuthDefaultRequest#getAccessToken(AuthCallback) + */ + @Override + public AuthUser getUserInfo(AuthToken authToken) { + String idToken = authToken.getIdToken(); + if (StringUtils.isEmpty(idToken)) { + Map form = new HashMap<>(7); + form.put("access_token", authToken.getAccessToken()); + form.put("getNickName", "1"); + form.put("nsp_svc", "GOpen.User.getInfo"); + + HttpHeader httpHeader = new HttpHeader(); + httpHeader.add(Constants.CONTENT_TYPE, "application/x-www-form-urlencoded"); + String response = new HttpUtils(config.getHttpConfig()).post(source.userInfo(), form, httpHeader, false).getBody(); + JSONObject object = JSONObject.parseObject(response); + + this.checkResponse(object); + + return AuthUser.builder() + .rawUserInfo(object) + .uuid(object.getString("unionID")) + .username(object.getString("displayName")) + .nickname(object.getString("displayName")) + .gender(AuthUserGender.UNKNOWN) + .avatar(object.getString("headPictureURL")) + .token(authToken) + .source(source.toString()) + .build(); + } + String payload = new String(Base64.getUrlDecoder().decode(idToken.split("\\.")[1]), StandardCharsets.UTF_8); + + JSONObject object = JSONObject.parseObject(payload); + return AuthUser.builder() + .rawUserInfo(object) + .uuid(object.getString("sub")) + .username(object.getString("name")) + .nickname(object.getString("nickname")) + .gender(AuthUserGender.UNKNOWN) + .avatar(object.getString("picture")) + .token(authToken) + .source(source.toString()) + .build(); + } + + /** + * 刷新access token (续期) + * + * @param authToken 登录成功后返回的Token信息 + * @return AuthResponse + */ + @Override + public AuthResponse refresh(AuthToken authToken) { + Map form = new HashMap<>(7); + form.put("client_id", config.getClientId()); + form.put("client_secret", config.getClientSecret()); + form.put("refresh_token", authToken.getRefreshToken()); + form.put("grant_type", "refresh_token"); + + HttpHeader httpHeader = new HttpHeader(); + httpHeader.add(Constants.CONTENT_TYPE, "application/x-www-form-urlencoded"); + String response = new HttpUtils(config.getHttpConfig()).post(source.refresh(), form, httpHeader, false).getBody(); + return AuthResponse.builder().code(SUCCESS.getCode()).data(getAuthToken(response)).build(); + } + + private AuthToken getAuthToken(String response) { + JSONObject object = JSONObject.parseObject(response); + + this.checkResponse(object); + + return AuthToken.builder() + .accessToken(object.getString("access_token")) + .expireIn(object.getIntValue("expires_in")) + .refreshToken(object.getString("refresh_token")) + .idToken(object.getString("id_token")) + .build(); + } + + /** + * 返回带{@code state}参数的授权url,授权回调时会带上这个{@code state} + * + * @param state state 验证授权流程的参数,可以防止csrf + * @return 返回授权地址 + * @since 1.9.3 + */ + @Override + public String authorize(String state) { + String realState = getRealState(state); + UrlBuilder builder = UrlBuilder.fromBaseUrl(super.authorize(realState)) + .queryParam("access_type", "offline") + .queryParam("scope", this.getScopes(" ", true, AuthScopeUtils.getDefaultScopes(AuthHuaweiV3Scope.values()))); + + if (config.isPkce()) { + String cacheKey = this.source.getName().concat(":code_verifier:").concat(realState); + String codeVerifier = PkceUtil.generateCodeVerifier(); + String codeChallengeMethod = "S256"; + String codeChallenge = PkceUtil.generateCodeChallenge(codeChallengeMethod, codeVerifier); + builder.queryParam("code_challenge", codeChallenge) + .queryParam("code_challenge_method", codeChallengeMethod); + // 缓存 codeVerifier 十分钟 + this.authStateCache.cache(cacheKey, codeVerifier, TimeUnit.MINUTES.toMillis(10)); + } + return builder.build(); + } + + /** + * 校验响应结果 + * + * @param object 接口返回的结果 + */ + private void checkResponse(JSONObject object) { + if (object.containsKey("NSP_STATUS")) { + throw new AuthException(object.getString("error")); + } + if (object.containsKey("error")) { + throw new AuthException(object.getString("sub_error") + ":" + object.getString("error_description")); + } + } + + +} diff --git a/src/main/java/me/zhyd/oauth/utils/AuthChecker.java b/src/main/java/me/zhyd/oauth/utils/AuthChecker.java index 74c6095..5fe6792 100644 --- a/src/main/java/me/zhyd/oauth/utils/AuthChecker.java +++ b/src/main/java/me/zhyd/oauth/utils/AuthChecker.java @@ -80,7 +80,7 @@ public class AuthChecker { return; } String code = callback.getCode(); - if (source == AuthDefaultSource.HUAWEI) { + if (StringUtils.isEmpty(code) && source == AuthDefaultSource.HUAWEI) { code = callback.getAuthorization_code(); } if (StringUtils.isEmpty(code)) { From e9135436f939f35f2831f41cd2c8320e7176f5e9 Mon Sep 17 00:00:00 2001 From: "yadong.zhang" Date: Sun, 1 Sep 2024 18:19:05 +0800 Subject: [PATCH 17/23] =?UTF-8?q?:hankey:=20=E4=BF=AE=E5=A4=8D=E4=BC=81?= =?UTF-8?q?=E4=B8=9A=E5=BE=AE=E4=BF=A1=E6=89=AB=E7=A0=81=E7=99=BB=E5=BD=95?= =?UTF-8?q?=20code=20=E7=9A=84=E4=BC=A0=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../oauth/request/AuthWeChatEnterpriseThirdQrcodeRequest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/me/zhyd/oauth/request/AuthWeChatEnterpriseThirdQrcodeRequest.java b/src/main/java/me/zhyd/oauth/request/AuthWeChatEnterpriseThirdQrcodeRequest.java index 6b1c25a..7921a63 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthWeChatEnterpriseThirdQrcodeRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthWeChatEnterpriseThirdQrcodeRequest.java @@ -63,6 +63,7 @@ public class AuthWeChatEnterpriseThirdQrcodeRequest extends AbstractAuthWeChatEn AuthToken authToken = AuthToken.builder() .accessToken(object.getString("provider_access_token")) .expireIn(object.getIntValue("expires_in")) + .code(authCallback.getCode()) .build(); return authToken; } catch (Exception e) { From 64e109851970a72c94089d78e6c73d61c9cca314 Mon Sep 17 00:00:00 2001 From: "yadong.zhang" Date: Mon, 2 Sep 2024 00:24:05 +0800 Subject: [PATCH 18/23] =?UTF-8?q?:hankey:=20=E6=B7=BB=E5=8A=A0=E6=96=B0?= =?UTF-8?q?=E7=89=88`=E9=92=89=E9=92=89=E6=89=AB=E7=A0=81`=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E8=83=BD=E5=8A=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOGS.md | 3 +- .../java/me/zhyd/oauth/config/AuthConfig.java | 40 ++++++- .../zhyd/oauth/config/AuthDefaultSource.java | 24 ++++ .../oauth/enums/scope/AuthDingTalkScope.java | 33 ++++++ .../java/me/zhyd/oauth/model/AuthToken.java | 7 ++ .../oauth/request/AuthDingTalkV2Request.java | 108 ++++++++++++++++++ 6 files changed, 213 insertions(+), 2 deletions(-) create mode 100644 src/main/java/me/zhyd/oauth/enums/scope/AuthDingTalkScope.java create mode 100644 src/main/java/me/zhyd/oauth/request/AuthDingTalkV2Request.java diff --git a/CHANGELOGS.md b/CHANGELOGS.md index 40a76ba..aa90ed5 100644 --- a/CHANGELOGS.md +++ b/CHANGELOGS.md @@ -1,11 +1,12 @@ ## 1.16.7 ### 2024/08/03 -: + - 新增 - 添加`appleid`社交登录能力。 [Github#192](https://github.com/justauth/JustAuth/pull/192) - 添加`figma`社交登录能力。 [Gitee#41](https://gitee.com/yadong.zhang/JustAuth/pulls/41) - 添加新版`企业微信扫码`登录能力。 [Github Issue#165](https://github.com/justauth/JustAuth/issues/165) + - 添加新版`钉钉扫码`登录能力。 [Gitee Issue#I73FZL](https://gitee.com/yadong.zhang/JustAuth/issues/I73FZL) - 添加新版`华为`登录能力,原`AuthHuaweiRequest`会在后面版本被弃用,如有使用,请切换到`AuthHuaweiV3Request` - 新增微信小程序授权登录 - 优化 diff --git a/src/main/java/me/zhyd/oauth/config/AuthConfig.java b/src/main/java/me/zhyd/oauth/config/AuthConfig.java index 6dbb4b0..74e192a 100644 --- a/src/main/java/me/zhyd/oauth/config/AuthConfig.java +++ b/src/main/java/me/zhyd/oauth/config/AuthConfig.java @@ -209,9 +209,47 @@ public class AuthConfig { private String loginType = "CorpApp"; /** - * 语言编码 + * 企业微信平台的语言编码 * * @since 1.16.7 */ private String lang = "zh"; + + /** + * 钉钉平台参数:控制输出特定类型的组织列表,org_type=management 表示只输出有管理权限的组织。 + * + * scope包含corpid时该参数存在意义。 + * + * @see https://open.dingtalk.com/document/orgapp/obtain-identity-credentials#title-4up-u8w-5ug + * @since 1.16.7 + */ + private String dingTalkOrgType; + + /** + * 钉钉平台参数:用于指定用户需要选择的组织。 + * + * scope包含corpid时该参数存在意义。传入的corpId需要是当前用户所在的组织。 + * + * @see https://open.dingtalk.com/document/orgapp/obtain-identity-credentials#title-4up-u8w-5ug + * @since 1.16.7 + */ + private String dingTalkCorpId; + + /** + * 钉钉平台参数:true表示专属帐号登录,展示组织代码输入页。 + * + * @see https://open.dingtalk.com/document/orgapp/obtain-identity-credentials#title-4up-u8w-5ug + * @since 1.16.7 + */ + private boolean dingTalkExclusiveLogin; + + /** + * 钉钉平台参数:开启了专属帐号功能的组织corpId。 + * + * scope包含corpid时该参数存在意义。传入的corpId需要是当前用户所在的组织。 + * + * @see https://open.dingtalk.com/document/orgapp/obtain-identity-credentials#title-4up-u8w-5ug + * @since 1.16.7 + */ + private String dingTalkExclusiveCorpId; } diff --git a/src/main/java/me/zhyd/oauth/config/AuthDefaultSource.java b/src/main/java/me/zhyd/oauth/config/AuthDefaultSource.java index 4b583a5..97bca55 100644 --- a/src/main/java/me/zhyd/oauth/config/AuthDefaultSource.java +++ b/src/main/java/me/zhyd/oauth/config/AuthDefaultSource.java @@ -112,6 +112,30 @@ public enum AuthDefaultSource implements AuthSource { return AuthDingTalkRequest.class; } }, + /** + * 新版钉钉扫码登录 + */ + DINGTALK_V2 { + @Override + public String authorize() { + return "https://login.dingtalk.com/oauth2/challenge.htm"; + } + + @Override + public String accessToken() { + return "https://api.dingtalk.com/v1.0/oauth2/userAccessToken"; + } + + @Override + public String userInfo() { + return "https://api.dingtalk.com/v1.0/contact/users/me"; + } + + @Override + public Class getTargetClass() { + return AuthDingTalkV2Request.class; + } + }, /** * 钉钉账号登录 */ diff --git a/src/main/java/me/zhyd/oauth/enums/scope/AuthDingTalkScope.java b/src/main/java/me/zhyd/oauth/enums/scope/AuthDingTalkScope.java new file mode 100644 index 0000000..5971078 --- /dev/null +++ b/src/main/java/me/zhyd/oauth/enums/scope/AuthDingTalkScope.java @@ -0,0 +1,33 @@ +package me.zhyd.oauth.enums.scope; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 钉钉平台 OAuth 授权范围 + * + * https://open.dingtalk.com/document/orgapp/obtain-identity-credentials#title-4up-u8w-5ug + * + * @author yadong.zhang (yadong.zhang0415(a)gmail.com) + * @version 1.0.0 + * @since 1.16.7 + */ +@Getter +@AllArgsConstructor +public enum AuthDingTalkScope implements AuthScope { + + /** + * 无需申请 默认开启 + */ + openid("openid", "授权后可获得用户userid", true), + /** + * 无需申请 默认开启 + */ + corpid("corpid", "授权后可获得登录过程中用户选择的组织id", false) + ; + + private final String scope; + private final String description; + private final boolean isDefault; + +} diff --git a/src/main/java/me/zhyd/oauth/model/AuthToken.java b/src/main/java/me/zhyd/oauth/model/AuthToken.java index 321da54..706f95c 100644 --- a/src/main/java/me/zhyd/oauth/model/AuthToken.java +++ b/src/main/java/me/zhyd/oauth/model/AuthToken.java @@ -66,4 +66,11 @@ public class AuthToken implements Serializable { * Apple附带属性 */ private String username; + + /** + * 新版钉钉附带属性 + * + * @since 1.16.7 + */ + private String corpId; } diff --git a/src/main/java/me/zhyd/oauth/request/AuthDingTalkV2Request.java b/src/main/java/me/zhyd/oauth/request/AuthDingTalkV2Request.java new file mode 100644 index 0000000..e4a4f99 --- /dev/null +++ b/src/main/java/me/zhyd/oauth/request/AuthDingTalkV2Request.java @@ -0,0 +1,108 @@ +package me.zhyd.oauth.request; + +import com.alibaba.fastjson.JSONObject; +import com.xkcoding.http.support.HttpHeader; +import me.zhyd.oauth.cache.AuthStateCache; +import me.zhyd.oauth.config.AuthConfig; +import me.zhyd.oauth.config.AuthDefaultSource; +import me.zhyd.oauth.enums.scope.AuthDingTalkScope; +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.AuthScopeUtils; +import me.zhyd.oauth.utils.HttpUtils; +import me.zhyd.oauth.utils.UrlBuilder; + +import java.util.HashMap; +import java.util.Map; + +/** + * 新版钉钉二维码登录 + * + * @author yadong.zhang (yadong.zhang0415(a)gmail.com) + * @since 1.16.7 + */ +public class AuthDingTalkV2Request extends AuthDefaultRequest { + + public AuthDingTalkV2Request(AuthConfig config) { + super(config, AuthDefaultSource.DINGTALK_V2); + } + + public AuthDingTalkV2Request(AuthConfig config, AuthStateCache authStateCache) { + super(config, AuthDefaultSource.DINGTALK_V2, authStateCache); + } + + @Override + public String authorize(String state) { + return UrlBuilder.fromBaseUrl(source.authorize()) + .queryParam("response_type", "code") + .queryParam("client_id", config.getClientId()) + .queryParam("scope", this.getScopes(",", true, AuthScopeUtils.getDefaultScopes(AuthDingTalkScope.values()))) + .queryParam("redirect_uri", config.getRedirectUri()) + .queryParam("prompt", "consent") + .queryParam("org_type", config.getDingTalkOrgType()) + .queryParam("corpId", config.getDingTalkCorpId()) + .queryParam("exclusiveLogin", config.isDingTalkExclusiveLogin()) + .queryParam("exclusiveCorpId", config.getDingTalkExclusiveCorpId()) + .queryParam("state", getRealState(state)) + .build(); + } + + @Override + public AuthToken getAccessToken(AuthCallback authCallback) { + Map params = new HashMap<>(); + params.put("grantType", "authorization_code"); + params.put("clientId", config.getClientId()); + params.put("clientSecret", config.getClientSecret()); + params.put("code", authCallback.getCode()); + String response = new HttpUtils(config.getHttpConfig()).post(this.source.accessToken(), JSONObject.toJSONString(params)).getBody(); + JSONObject accessTokenObject = JSONObject.parseObject(response); + if (!accessTokenObject.containsKey("accessToken")) { + throw new AuthException(JSONObject.toJSONString(response), source); + } + return AuthToken.builder() + .accessToken(accessTokenObject.getString("accessToken")) + .refreshToken(accessTokenObject.getString("refreshToken")) + .expireIn(accessTokenObject.getIntValue("expireIn")) + .corpId(accessTokenObject.getString("corpId")) + .build(); + } + + @Override + public AuthUser getUserInfo(AuthToken authToken) { + HttpHeader header = new HttpHeader(); + header.add("x-acs-dingtalk-access-token", authToken.getAccessToken()); + + String response = new HttpUtils(config.getHttpConfig()).get(this.source.userInfo(), null, header, false).getBody(); + JSONObject object = JSONObject.parseObject(response); + + authToken.setOpenId(object.getString("openId")); + authToken.setUnionId(object.getString("unionId")); + return AuthUser.builder() + .rawUserInfo(object) + .uuid(object.getString("unionId")) + .username(object.getString("nick")) + .nickname(object.getString("nick")) + .avatar(object.getString("avatarUrl")) + .snapshotUser(object.getBooleanValue("visitor")) + .token(authToken) + .source(source.toString()) + .build(); + } + + /** + * 返回获取accessToken的url + * + * @param code 授权码 + * @return 返回获取accessToken的url + */ + protected String accessTokenUrl(String code) { + return UrlBuilder.fromBaseUrl(source.accessToken()) + .queryParam("code", code) + .queryParam("clientId", config.getClientId()) + .queryParam("clientSecret", config.getClientSecret()) + .queryParam("grantType", "authorization_code") + .build(); + } +} From 9862f487b4e3adf6200333773faf419edf17626a Mon Sep 17 00:00:00 2001 From: 31445 <3144550951@qq.com> Date: Sun, 13 Oct 2024 11:57:27 +0800 Subject: [PATCH 19/23] fix: correct documentation link in README --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index a171f68..d603f02 100644 --- a/README.md +++ b/README.md @@ -55,11 +55,11 @@ JustAuth 集成了诸如:Github、Gitee、支付宝、新浪微博、微信、 ## 有哪些功能? -- 集成国内外数十家第三方平台,实现快速接入。参考文档 -- 自定义 State 缓存,支持各种分布式缓存组件。参考文档 -- 自定义 OAuth 平台,更容易适配自有的 OAuth 服务。参考文档 -- 自定义 Http 实现,选择权完全交给开发者,不会单独依赖某一具体实现。参考文档 -- 自定义 Scope,支持更完善的授权体系。参考文档 +- 集成国内外数十家第三方平台,实现快速接入。参考文档 +- 自定义 State 缓存,支持各种分布式缓存组件。参考文档 +- 自定义 OAuth 平台,更容易适配自有的 OAuth 服务。参考文档 +- 自定义 Http 实现,选择权完全交给开发者,不会单独依赖某一具体实现。参考文档 +- 自定义 Scope,支持更完善的授权体系。参考文档 - 更多...参考文档 ## 快速开始 From 4b07aecfcf5c8cb2191ca43725d41cd87d4c7816 Mon Sep 17 00:00:00 2001 From: hurentian Date: Thu, 17 Oct 2024 09:52:33 +0800 Subject: [PATCH 20/23] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81QQ=E5=B0=8F?= =?UTF-8?q?=E7=A8=8B=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../zhyd/oauth/config/AuthDefaultSource.java | 29 +++++ .../request/AuthQQMiniProgramRequest.java | 100 ++++++++++++++++++ .../me/zhyd/oauth/AuthRequestBuilderTest.java | 6 ++ 3 files changed, 135 insertions(+) create mode 100644 src/main/java/me/zhyd/oauth/request/AuthQQMiniProgramRequest.java diff --git a/src/main/java/me/zhyd/oauth/config/AuthDefaultSource.java b/src/main/java/me/zhyd/oauth/config/AuthDefaultSource.java index 97bca55..a4f5a85 100644 --- a/src/main/java/me/zhyd/oauth/config/AuthDefaultSource.java +++ b/src/main/java/me/zhyd/oauth/config/AuthDefaultSource.java @@ -1464,6 +1464,35 @@ public enum AuthDefaultSource implements AuthSource { public Class getTargetClass() { return AuthWechatMiniProgramRequest.class; } + }, + + /** + * QQ小程序授权登录 + */ + QQ_MINI_PROGRAM { + @Override + public String authorize() { + // 参见 https://q.qq.com/wiki/develop/miniprogram/frame/open_ability/open_userinfo.html 文档 + throw new UnsupportedOperationException("不支持获取授权 url,请使用小程序内置函数 qq.login() 登录获取 code"); + } + + @Override + public String accessToken() { + // 参见 https://q.qq.com/wiki/develop/miniprogram/server/open_port/port_login.html 文档 + // 获取 openid, unionId , session_key 等字段 + return "https://api.q.qq.com/sns/jscode2session"; + } + + @Override + public String userInfo() { + // 参见 https://q.qq.com/wiki/develop/miniprogram/API/open_port/port_userinfo.html 文档 + throw new UnsupportedOperationException("不支持获取用户信息 url,请使用小程序内置函数 qq.getUserInfo() 获取用户信息"); + } + + @Override + public Class getTargetClass() { + return null; + } } } diff --git a/src/main/java/me/zhyd/oauth/request/AuthQQMiniProgramRequest.java b/src/main/java/me/zhyd/oauth/request/AuthQQMiniProgramRequest.java new file mode 100644 index 0000000..9797131 --- /dev/null +++ b/src/main/java/me/zhyd/oauth/request/AuthQQMiniProgramRequest.java @@ -0,0 +1,100 @@ +package me.zhyd.oauth.request; + +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; +import me.zhyd.oauth.cache.AuthStateCache; +import me.zhyd.oauth.config.AuthConfig; +import me.zhyd.oauth.config.AuthDefaultSource; +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.HttpUtils; +import me.zhyd.oauth.utils.UrlBuilder; + +/** + * QQ小程序登陆 Request 请求 + *

+ * 参照微信小程序实现 + * + * @author hurentian + * @since 2024-10-08 + */ +public class AuthQQMiniProgramRequest extends AuthDefaultRequest { + public AuthQQMiniProgramRequest(AuthConfig config) { + super(config, AuthDefaultSource.QQ_MINI_PROGRAM); + } + + public AuthQQMiniProgramRequest(AuthConfig config, AuthStateCache authStateCache) { + super(config, AuthDefaultSource.QQ_MINI_PROGRAM, authStateCache); + } + + @Override + public AuthToken getAccessToken(AuthCallback authCallback) { + // 参见 https://q.qq.com/wiki/develop/miniprogram/server/open_port/port_login.html#code2session 文档 + // 使用 code 获取对应的 openId、unionId 等字段 + String response = new HttpUtils(config.getHttpConfig()).get(accessTokenUrl(authCallback.getCode())).getBody(); + JSCode2SessionResponse accessTokenObject = JSONObject.parseObject(response, JSCode2SessionResponse.class); + assert accessTokenObject != null; + checkResponse(accessTokenObject); + // 拼装结果 + return AuthToken.builder() + .openId(accessTokenObject.getOpenid()) + .unionId(accessTokenObject.getUnionId()) + .accessToken(accessTokenObject.getSessionKey()) + .build(); + } + + @Override + public AuthUser getUserInfo(AuthToken authToken) { + // 参见 https://q.qq.com/wiki/develop/game/API/open-port/user-info.html#qq-getuserinfo 文档 + // 如果需要用户信息,需要在小程序调用函数后传给后端 + return AuthUser.builder() + .username("") + .nickname("") + .avatar("") + .uuid(authToken.getOpenId()) + .token(authToken) + .source(source.toString()) + .build(); + } + + /** + * 检查响应内容是否正确 + * + * @param response 请求响应内容 + */ + private void checkResponse(JSCode2SessionResponse response) { + if (response.getErrorCode() != 0) { + throw new AuthException(response.getErrorCode(), response.getErrorMsg()); + } + } + + @Override + protected String accessTokenUrl(String code) { + return UrlBuilder.fromBaseUrl(source.accessToken()) + .queryParam("appid", config.getClientId()) + .queryParam("secret", config.getClientSecret()) + .queryParam("js_code", code) + .queryParam("grant_type", "authorization_code") + .build(); + } + + @Data + @SuppressWarnings("SpellCheckingInspection") + private static class JSCode2SessionResponse { + + @JSONField(name = "errcode") + private int errorCode; + @JSONField(name = "errmsg") + private String errorMsg; + @JSONField(name = "session_key") + private String sessionKey; + private String openid; + @JSONField(name = "unionid") + private String unionId; + + } + +} diff --git a/src/test/java/me/zhyd/oauth/AuthRequestBuilderTest.java b/src/test/java/me/zhyd/oauth/AuthRequestBuilderTest.java index 5de9dcc..e66c5d0 100644 --- a/src/test/java/me/zhyd/oauth/AuthRequestBuilderTest.java +++ b/src/test/java/me/zhyd/oauth/AuthRequestBuilderTest.java @@ -107,6 +107,12 @@ public class AuthRequestBuilderTest { System.out.println(value.getTargetClass()); continue; } + case QQ_MINI_PROGRAM: { + // 小程序不支持获取调用 authorize + AuthRequest authRequest = new AuthQQMiniProgramRequest(config); + System.out.println(value.getTargetClass()); + continue; + } default: AuthRequest authRequest = AuthRequestBuilder.builder() .source(value.getName()) From 354f00660bcf5f61acbe73b4b6aaab351f20d3a9 Mon Sep 17 00:00:00 2001 From: "yadong.zhang" Date: Sat, 14 Dec 2024 14:31:50 +0800 Subject: [PATCH 21/23] =?UTF-8?q?:hankey:=20AppleId=20=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E7=9A=84=20POM=20=E4=BE=9D=E8=B5=96=E6=94=B9=E4=B8=BA=20provid?= =?UTF-8?q?ed?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pom.xml b/pom.xml index 8d848ec..020ea2d 100644 --- a/pom.xml +++ b/pom.xml @@ -106,21 +106,25 @@ io.jsonwebtoken jjwt-api ${jwt.version} + provided io.jsonwebtoken jjwt-impl ${jwt.version} + provided io.jsonwebtoken jjwt-jackson ${jwt.version} + provided org.bouncycastle bcpkix-jdk18on ${bcpkix-jdk18on.version} + provided From cdcf9a5e8dfb3466f27f14de279e5cc71ba08f2e Mon Sep 17 00:00:00 2001 From: "yadong.zhang" Date: Sat, 14 Dec 2024 17:02:33 +0800 Subject: [PATCH 22/23] =?UTF-8?q?:fire:=20=E6=94=AF=E6=8C=81=E6=94=AF?= =?UTF-8?q?=E4=BB=98=E5=AE=9D=E8=AF=81=E4=B9=A6=E6=A8=A1=E5=BC=8F=E7=99=BB?= =?UTF-8?q?=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOGS.md | 5 +- pom.xml | 2 +- .../oauth/request/AuthAlipayCertRequest.java | 152 ++++++++++++++++++ .../zhyd/oauth/request/AuthAlipayRequest.java | 2 +- 4 files changed, 157 insertions(+), 4 deletions(-) create mode 100644 src/main/java/me/zhyd/oauth/request/AuthAlipayCertRequest.java diff --git a/CHANGELOGS.md b/CHANGELOGS.md index aa90ed5..695f032 100644 --- a/CHANGELOGS.md +++ b/CHANGELOGS.md @@ -1,14 +1,15 @@ ## 1.16.7 -### 2024/08/03 +### 2024/12/14 - 新增 - 添加`appleid`社交登录能力。 [Github#192](https://github.com/justauth/JustAuth/pull/192) + - 添加`支付宝证书模式`登录能力(原支持的公钥登录模式依然可用)。 - 添加`figma`社交登录能力。 [Gitee#41](https://gitee.com/yadong.zhang/JustAuth/pulls/41) - 添加新版`企业微信扫码`登录能力。 [Github Issue#165](https://github.com/justauth/JustAuth/issues/165) - 添加新版`钉钉扫码`登录能力。 [Gitee Issue#I73FZL](https://gitee.com/yadong.zhang/JustAuth/issues/I73FZL) - 添加新版`华为`登录能力,原`AuthHuaweiRequest`会在后面版本被弃用,如有使用,请切换到`AuthHuaweiV3Request` - - 新增微信小程序授权登录 + - 添加`微信小程序`登录能力。 - 优化 - 更新 Google 端点地址。[Github #198](https://github.com/justauth/JustAuth/pull/198) - Amazon PKCE 中的 `code_verifier` 基于 `state` 缓存 diff --git a/pom.xml b/pom.xml index 020ea2d..a60abfc 100644 --- a/pom.xml +++ b/pom.xml @@ -61,7 +61,7 @@ 1.18.30 4.13.2 1.2.83 - 4.17.5.ALL + 4.39.165.ALL 0.8.2 0.12.3 1.78 diff --git a/src/main/java/me/zhyd/oauth/request/AuthAlipayCertRequest.java b/src/main/java/me/zhyd/oauth/request/AuthAlipayCertRequest.java new file mode 100644 index 0000000..6277ec9 --- /dev/null +++ b/src/main/java/me/zhyd/oauth/request/AuthAlipayCertRequest.java @@ -0,0 +1,152 @@ +package me.zhyd.oauth.request; + + +import com.alibaba.fastjson.JSONObject; +import com.alipay.api.AlipayApiException; +import com.alipay.api.AlipayClient; +import com.alipay.api.AlipayConfig; +import com.alipay.api.DefaultAlipayClient; +import com.alipay.api.request.AlipaySystemOauthTokenRequest; +import com.alipay.api.request.AlipayUserInfoShareRequest; +import com.alipay.api.response.AlipaySystemOauthTokenResponse; +import com.alipay.api.response.AlipayUserInfoShareResponse; +import me.zhyd.oauth.config.AuthConfig; +import me.zhyd.oauth.enums.AuthResponseStatus; +import me.zhyd.oauth.enums.AuthUserGender; +import me.zhyd.oauth.exception.AuthException; +import me.zhyd.oauth.model.AuthCallback; +import me.zhyd.oauth.model.AuthResponse; +import me.zhyd.oauth.model.AuthToken; +import me.zhyd.oauth.model.AuthUser; +import me.zhyd.oauth.utils.StringUtils; +import me.zhyd.oauth.utils.UrlBuilder; + +import static me.zhyd.oauth.config.AuthDefaultSource.ALIPAY; + +/** + * 支付宝证书模式登录 + * + * @since 1.16.7 + */ +public class AuthAlipayCertRequest extends AuthDefaultRequest { + + private final AlipayClient alipayClient; + + public AuthAlipayCertRequest(AuthConfig config, AlipayConfig alipayConfig) { + super(config, ALIPAY); + try { + this.alipayClient = new DefaultAlipayClient(alipayConfig); + } catch (AlipayApiException e) { + throw new AuthException(e); + } + } + + @Override + protected void checkCode(AuthCallback authCallback) { + if (StringUtils.isEmpty(authCallback.getAuth_code())) { + throw new AuthException(AuthResponseStatus.ILLEGAL_CODE, source); + } + } + + @Override + public AuthToken getAccessToken(AuthCallback authCallback) { + AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest(); + request.setGrantType("authorization_code"); + request.setCode(authCallback.getAuth_code()); + AlipaySystemOauthTokenResponse response; + try { + response = this.alipayClient.certificateExecute(request); + } catch (Exception e) { + throw new AuthException(e); + } + if (!response.isSuccess()) { + throw new AuthException(response.getSubMsg()); + } + return AuthToken.builder() + .accessToken(response.getAccessToken()) + .uid(response.getUserId()) + .expireIn(Integer.parseInt(response.getExpiresIn())) + .refreshToken(response.getRefreshToken()) + .build(); + } + + + /** + * 刷新access token (续期) + * + * @param authToken 登录成功后返回的Token信息 + * @return AuthResponse + */ + @Override + public AuthResponse refresh(AuthToken authToken) { + AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest(); + request.setGrantType("refresh_token"); + request.setRefreshToken(authToken.getRefreshToken()); + AlipaySystemOauthTokenResponse response = null; + try { + response = this.alipayClient.certificateExecute(request); + } catch (Exception e) { + throw new AuthException(e); + } + if (!response.isSuccess()) { + throw new AuthException(response.getSubMsg()); + } + return AuthResponse.builder() + .code(AuthResponseStatus.SUCCESS.getCode()) + .data(AuthToken.builder() + .accessToken(response.getAccessToken()) + .uid(response.getUserId()) + .expireIn(Integer.parseInt(response.getExpiresIn())) + .refreshToken(response.getRefreshToken()) + .build()) + .build(); + } + + @Override + public AuthUser getUserInfo(AuthToken authToken) { + String accessToken = authToken.getAccessToken(); + AlipayUserInfoShareRequest request = new AlipayUserInfoShareRequest(); + AlipayUserInfoShareResponse response = null; + try { + response = this.alipayClient.certificateExecute(request, accessToken); + } catch (AlipayApiException e) { + throw new AuthException(e.getErrMsg(), e); + } + if (!response.isSuccess()) { + throw new AuthException(response.getSubMsg()); + } + + String province = response.getProvince(), city = response.getCity(); + String location = String.format("%s %s", StringUtils.isEmpty(province) ? "" : province, StringUtils.isEmpty(city) ? "" : city); + + return AuthUser.builder() + .rawUserInfo(JSONObject.parseObject(JSONObject.toJSONString(response))) + .uuid(response.getOpenId()) + .username(StringUtils.isEmpty(response.getUserName()) ? response.getNickName() : response.getUserName()) + .nickname(response.getNickName()) + .avatar(response.getAvatar()) + .location(location) + .gender(AuthUserGender.getRealGender(response.getGender())) + .token(authToken) + .source(source.toString()) + .build(); + } + + + /** + * 返回带{@code state}参数的授权url,授权回调时会带上这个{@code state} + * + * @param state state 验证授权流程的参数,可以防止csrf + * @return 返回授权地址 + * @since 1.9.3 + */ + @Override + public String authorize(String state) { + return UrlBuilder.fromBaseUrl(source.authorize()) + .queryParam("app_id", config.getClientId()) + .queryParam("scope", "auth_user") + .queryParam("redirect_uri", config.getRedirectUri()) + .queryParam("state", getRealState(state)) + .build(); + } +} diff --git a/src/main/java/me/zhyd/oauth/request/AuthAlipayRequest.java b/src/main/java/me/zhyd/oauth/request/AuthAlipayRequest.java index b832346..428ca86 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthAlipayRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthAlipayRequest.java @@ -26,7 +26,7 @@ import me.zhyd.oauth.utils.UrlBuilder; import java.net.InetSocketAddress; /** - * 支付宝登录 + * 支付宝公钥模式登录 * * @author yadong.zhang (yadong.zhang0415(a)gmail.com) * @since 1.0.1 From 2b6e419943af258f2895757192c6c27060611a25 Mon Sep 17 00:00:00 2001 From: "yadong.zhang" Date: Sat, 14 Dec 2024 17:12:00 +0800 Subject: [PATCH 23/23] =?UTF-8?q?:memo:=20=E7=BC=96=E5=86=99=E6=96=87?= =?UTF-8?q?=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOGS.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGELOGS.md b/CHANGELOGS.md index 695f032..e8b9403 100644 --- a/CHANGELOGS.md +++ b/CHANGELOGS.md @@ -3,14 +3,16 @@ ### 2024/12/14 - 新增 - - 添加`appleid`社交登录能力。 [Github#192](https://github.com/justauth/JustAuth/pull/192) + - 添加`微信小程序`登录能力。 - 添加`支付宝证书模式`登录能力(原支持的公钥登录模式依然可用)。 + - 添加`appleid`社交登录能力。 [Github#192](https://github.com/justauth/JustAuth/pull/192) + - 添加`QQ小程序`社交登录能力。 [Github#223](https://github.com/justauth/JustAuth/pull/223) - 添加`figma`社交登录能力。 [Gitee#41](https://gitee.com/yadong.zhang/JustAuth/pulls/41) - 添加新版`企业微信扫码`登录能力。 [Github Issue#165](https://github.com/justauth/JustAuth/issues/165) - 添加新版`钉钉扫码`登录能力。 [Gitee Issue#I73FZL](https://gitee.com/yadong.zhang/JustAuth/issues/I73FZL) - 添加新版`华为`登录能力,原`AuthHuaweiRequest`会在后面版本被弃用,如有使用,请切换到`AuthHuaweiV3Request` - - 添加`微信小程序`登录能力。 - 优化 + - 修复文档错误。[Github #222](https://github.com/justauth/JustAuth/pull/222) - 更新 Google 端点地址。[Github #198](https://github.com/justauth/JustAuth/pull/198) - Amazon PKCE 中的 `code_verifier` 基于 `state` 缓存 - `AuthRequest`响应时携带泛型,避免二次解析。[Gitee#38](https://gitee.com/yadong.zhang/JustAuth/pulls/38)