From 9971793f0c903416d23c8b5e501c7aca6fbea30a Mon Sep 17 00:00:00 2001 From: ngcly <531237716@qq.com> Date: Mon, 9 Aug 2021 23:48:31 +0800 Subject: [PATCH] =?UTF-8?q?=E8=8E=B7=E5=8F=96=E4=B8=89=E6=96=B9=E5=AE=9E?= =?UTF-8?q?=E4=BE=8B=20=E9=83=A8=E5=88=86=20=E8=BF=9B=E8=A1=8C=E9=87=8D?= =?UTF-8?q?=E6=9E=84=EF=BC=8C=E4=BD=BF=E4=B9=8B=E5=8F=AF=E4=BB=A5=E8=BF=9B?= =?UTF-8?q?=E8=A1=8C=E6=9B=B4=E7=AE=80=E5=8D=95=E7=9A=84=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E5=AF=B9=E5=BA=94=E7=9A=84=E5=AE=9E=E4=BE=8B=E3=80=82=20?= =?UTF-8?q?=E5=A6=82=E4=B9=8B=E5=89=8D=E8=8E=B7=E5=8F=96=E5=AF=B9=E5=BA=94?= =?UTF-8?q?=E7=9A=84=E5=AE=9E=E4=BE=8B=EF=BC=9A=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?switch=20(source.toLowerCase())=20{=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20case=20"dingtalk":=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20authRequest=20=3D=20new=20AuthDingTalkRequest?= =?UTF-8?q?(AuthConfig.builder()=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20.clientId("")=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20.cl?= =?UTF-8?q?ientSecret("")=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20.redirectUri("http://localhost:8443/?= =?UTF-8?q?oauth/callback/dingtalk")=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20.build());=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20break;=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20case=20"baidu":=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20authRequest=20=3D=20new=20AuthBaiduRequ?= =?UTF-8?q?est(AuthConfig.builder()=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20.clientId("")=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?.clientSecret("")=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20.redirectUri("http://localhost:84?= =?UTF-8?q?43/oauth/callback/baidu")=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20.scopes(Arrays.asList(?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20AuthBaiduScope.BASIC.getSco?= =?UTF-8?q?pe(),=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20AuthBaiduScope.SUPER?= =?UTF-8?q?=5FMSG.getScope(),=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20AuthBaidu?= =?UTF-8?q?Scope.NETDISK.getScope()=20=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20))=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20.build());?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20break;=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20=20}=20=E4=B8=8A?= =?UTF-8?q?=E9=9D=A2=E9=9C=80=E8=A6=81=E8=B0=83=E7=94=A8=E7=AB=AF=E8=87=AA?= =?UTF-8?q?=E5=B7=B1=E5=8E=BB=E6=A0=B9=E6=8D=AEsource=E7=BC=96=E7=A0=81?= =?UTF-8?q?=E8=BF=9B=E8=A1=8C=20new=20=E5=AF=B9=E5=BA=94=E7=9A=84=E5=AD=90?= =?UTF-8?q?=E7=B1=BB=EF=BC=8C=E8=BF=99=E6=98=AF=E4=B8=8D=E5=90=88=E7=90=86?= =?UTF-8?q?=E7=9A=84=E3=80=82=E8=B0=83=E7=94=A8=E8=80=85=E5=BA=94=E8=AF=A5?= =?UTF-8?q?=E5=8F=AA=E9=9C=80=E8=A6=81=E5=85=B3=E5=BF=83source=E7=A0=81?= =?UTF-8?q?=E5=92=8C=E5=AF=B9=E5=BA=94=E7=9A=84=E9=85=8D=E7=BD=AE=E3=80=82?= =?UTF-8?q?=20=E7=8E=B0=E5=9C=A8=E9=87=8D=E6=9E=84=E5=90=8E=EF=BC=8C?= =?UTF-8?q?=E8=B0=83=E7=94=A8=E7=AB=AF=E5=8F=AA=E9=9C=80=E8=A6=81=E4=BC=A0?= =?UTF-8?q?=E5=85=A5=E5=AF=B9=E5=BA=94=E7=9A=84source=20=E5=92=8C=E8=87=AA?= =?UTF-8?q?=E5=AE=9A=E4=B9=89=E7=9A=84=E9=85=8D=E7=BD=AE=20=E9=80=9A?= =?UTF-8?q?=E8=BF=87=E7=BB=9F=E4=B8=80=E7=9A=84=E5=85=A5=E5=8F=A3=E5=B0=B1?= =?UTF-8?q?=E5=8F=AF=E4=BB=A5=E6=8B=BF=E5=88=B0=E6=AD=A3=E7=A1=AE=E7=9A=84?= =?UTF-8?q?=E5=AE=9E=E4=BE=8B=E3=80=82=E4=B8=8D=E9=9C=80=E8=A6=81=E8=B0=83?= =?UTF-8?q?=E7=94=A8=E7=AB=AF=E5=81=9A=E5=90=84=E7=A7=8D=E5=88=A4=E6=96=AD?= =?UTF-8?q?=EF=BC=8C=E6=89=80=E6=9C=89=E9=80=BB=E8=BE=91=E5=88=A4=E6=96=AD?= =?UTF-8?q?=E5=9C=A8=E6=9C=8D=E5=8A=A1=E7=AB=AF=E8=BF=99=E8=BE=B9=E5=81=9A?= =?UTF-8?q?=E5=A5=BD=E4=BA=86=E5=A4=84=E7=90=86=E3=80=82=20=E8=B0=83?= =?UTF-8?q?=E7=94=A8=E7=AB=AF=E4=BB=A3=E7=A0=81=E5=A6=82=E4=B8=8B=EF=BC=9A?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20AuthDefaultSource=20defaultSource=20?= =?UTF-8?q?=3D=20AuthDefaultSource.getAuthSource("wechat=5Fmp");=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20AuthRequest=20request=20=3D=20defaultSource.g?= =?UTF-8?q?etAuthRequestInstance(AuthConfig.builder()=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20.clientId("a")=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20.clientSecret("a")=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20.redirectUri("https://www.justauth.cn")=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20.build());?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/me/zhyd/oauth/config/AuthConfig.java | 11 + .../zhyd/oauth/config/AuthDefaultSource.java | 456 +++++++++++++++++- .../java/me/zhyd/oauth/config/AuthSource.java | 17 + .../zhyd/oauth/config/AuthExtendSource.java | 33 ++ .../request/AuthWeChatMpRequestTest.java | 11 + 5 files changed, 527 insertions(+), 1 deletion(-) diff --git a/src/main/java/me/zhyd/oauth/config/AuthConfig.java b/src/main/java/me/zhyd/oauth/config/AuthConfig.java index 38f4ccc..e00e742 100644 --- a/src/main/java/me/zhyd/oauth/config/AuthConfig.java +++ b/src/main/java/me/zhyd/oauth/config/AuthConfig.java @@ -155,6 +155,7 @@ public class AuthConfig { * @since 1.16.0 */ private String authServerId; + /** * 忽略校验 {@code redirectUri} 参数,默认不开启。当 {@code ignoreCheckRedirectUri} 为 {@code true} 时, * {@link me.zhyd.oauth.utils.AuthChecker#checkConfig(AuthConfig, AuthSource)} 将不会校验 {@code redirectUri} 的合法性。 @@ -163,6 +164,16 @@ public class AuthConfig { */ private boolean ignoreCheckRedirectUri; + /** + * 代理地址 + */ + private String proxyHost; + + /** + * 代理端口号 + */ + private Integer proxyPort; + /** * 适配 builder 模式 set 值的情况 * diff --git a/src/main/java/me/zhyd/oauth/config/AuthDefaultSource.java b/src/main/java/me/zhyd/oauth/config/AuthDefaultSource.java index ea99d3d..4c613a6 100644 --- a/src/main/java/me/zhyd/oauth/config/AuthDefaultSource.java +++ b/src/main/java/me/zhyd/oauth/config/AuthDefaultSource.java @@ -1,7 +1,11 @@ package me.zhyd.oauth.config; +import me.zhyd.oauth.cache.AuthStateCache; import me.zhyd.oauth.enums.AuthResponseStatus; import me.zhyd.oauth.exception.AuthException; +import me.zhyd.oauth.request.*; + +import java.util.Arrays; /** * JustAuth内置的各api需要的url, 用枚举类分平台类型管理 @@ -28,6 +32,16 @@ public enum AuthDefaultSource implements AuthSource { public String userInfo() { return "https://api.github.com/user"; } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig) { + return getAuthRequestInstance(authConfig,null); + } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig, AuthStateCache authStateCache) { + return getInstance(AuthGithubRequest.class,authConfig,authStateCache); + } }, /** * 新浪微博 @@ -48,6 +62,16 @@ public enum AuthDefaultSource implements AuthSource { return "https://api.weibo.com/2/users/show.json"; } + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig) { + return getAuthRequestInstance(authConfig,null); + } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig, AuthStateCache authStateCache) { + return getInstance(AuthWeiboRequest.class,authConfig,authStateCache); + } + @Override public String revoke() { return "https://api.weibo.com/oauth2/revokeoauth2"; @@ -71,6 +95,16 @@ public enum AuthDefaultSource implements AuthSource { public String userInfo() { return "https://gitee.com/api/v5/user"; } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig) { + return getAuthRequestInstance(authConfig,null); + } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig, AuthStateCache authStateCache) { + return getInstance(AuthGiteeRequest.class,authConfig,authStateCache); + } }, /** * 钉钉扫码登录 @@ -90,6 +124,16 @@ public enum AuthDefaultSource implements AuthSource { public String userInfo() { return "https://oapi.dingtalk.com/sns/getuserinfo_bycode"; } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig) { + return getAuthRequestInstance(authConfig,null); + } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig, AuthStateCache authStateCache) { + return getInstance(AuthDingTalkRequest.class,authConfig,authStateCache); + } }, /** * 钉钉账号登录 @@ -109,6 +153,16 @@ public enum AuthDefaultSource implements AuthSource { public String userInfo() { return DINGTALK.userInfo(); } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig) { + return getAuthRequestInstance(authConfig,null); + } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig, AuthStateCache authStateCache) { + return getInstance(AuthDingTalkAccountRequest.class,authConfig,authStateCache); + } }, /** * 百度 @@ -138,6 +192,16 @@ public enum AuthDefaultSource implements AuthSource { public String refresh() { return "https://openapi.baidu.com/oauth/2.0/token"; } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig) { + return getAuthRequestInstance(authConfig,null); + } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig, AuthStateCache authStateCache) { + return getInstance(AuthBaiduRequest.class,authConfig,authStateCache); + } }, /** * csdn @@ -157,6 +221,16 @@ public enum AuthDefaultSource implements AuthSource { public String userInfo() { return "https://api.csdn.net/user/getinfo"; } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig) { + return getAuthRequestInstance(authConfig,null); + } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig, AuthStateCache authStateCache) { + return getInstance(AuthCsdnRequest.class,authConfig,authStateCache); + } }, /** * Coding, @@ -179,6 +253,16 @@ public enum AuthDefaultSource implements AuthSource { public String userInfo() { return "https://%s.coding.net/api/account/current_user"; } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig) { + return getAuthRequestInstance(authConfig,null); + } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig, AuthStateCache authStateCache) { + return getInstance(AuthCodingRequest.class,authConfig,authStateCache); + } }, /** * oschina 开源中国 @@ -198,6 +282,16 @@ public enum AuthDefaultSource implements AuthSource { public String userInfo() { return "https://www.oschina.net/action/openapi/user"; } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig) { + return getAuthRequestInstance(authConfig,null); + } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig, AuthStateCache authStateCache) { + return getInstance(AuthOschinaRequest.class,authConfig,authStateCache); + } }, /** * 支付宝 @@ -217,6 +311,16 @@ public enum AuthDefaultSource implements AuthSource { public String userInfo() { return "https://openapi.alipay.com/gateway.do"; } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig) { + return getAuthRequestInstance(authConfig,null); + } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig, AuthStateCache authStateCache) { + return getInstance(AuthAlipayRequest.class,authConfig,authStateCache); + } }, /** * QQ @@ -241,6 +345,16 @@ public enum AuthDefaultSource implements AuthSource { public String refresh() { return "https://graph.qq.com/oauth2.0/token"; } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig) { + return getAuthRequestInstance(authConfig,null); + } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig, AuthStateCache authStateCache) { + return getInstance(AuthQqRequest.class,authConfig,authStateCache); + } }, /** * 微信开放平台 @@ -265,6 +379,16 @@ public enum AuthDefaultSource implements AuthSource { public String refresh() { return "https://api.weixin.qq.com/sns/oauth2/refresh_token"; } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig) { + return getAuthRequestInstance(authConfig,null); + } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig, AuthStateCache authStateCache) { + return getInstance(AuthWeChatOpenRequest.class,authConfig,authStateCache); + } }, /** * 微信公众平台 @@ -289,6 +413,16 @@ public enum AuthDefaultSource implements AuthSource { public String refresh() { return "https://api.weixin.qq.com/sns/oauth2/refresh_token"; } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig) { + return getAuthRequestInstance(authConfig,null); + } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig, AuthStateCache authStateCache) { + return getInstance(AuthWeChatMpRequest.class,authConfig,authStateCache); + } }, /** * 淘宝 @@ -308,6 +442,16 @@ public enum AuthDefaultSource implements AuthSource { public String userInfo() { throw new AuthException(AuthResponseStatus.UNSUPPORTED); } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig) { + return getAuthRequestInstance(authConfig,null); + } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig, AuthStateCache authStateCache) { + return getInstance(AuthTaobaoRequest.class,authConfig,authStateCache); + } }, /** * Google @@ -327,6 +471,16 @@ public enum AuthDefaultSource implements AuthSource { public String userInfo() { return "https://www.googleapis.com/oauth2/v3/userinfo"; } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig) { + return getAuthRequestInstance(authConfig,null); + } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig, AuthStateCache authStateCache) { + return getInstance(AuthGoogleRequest.class,authConfig,authStateCache); + } }, /** * Facebook @@ -346,6 +500,16 @@ public enum AuthDefaultSource implements AuthSource { public String userInfo() { return "https://graph.facebook.com/v10.0/me"; } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig) { + return getAuthRequestInstance(authConfig,null); + } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig, AuthStateCache authStateCache) { + return getInstance(AuthFacebookRequest.class,authConfig,authStateCache); + } }, /** * 抖音 @@ -370,6 +534,16 @@ public enum AuthDefaultSource implements AuthSource { public String refresh() { return "https://open.douyin.com/oauth/refresh_token/"; } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig) { + return getAuthRequestInstance(authConfig,null); + } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig, AuthStateCache authStateCache) { + return getInstance(AuthDouyinRequest.class,authConfig,authStateCache); + } }, /** * 领英 @@ -394,6 +568,16 @@ public enum AuthDefaultSource implements AuthSource { public String refresh() { return "https://www.linkedin.com/oauth/v2/accessToken"; } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig) { + return getAuthRequestInstance(authConfig,null); + } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig, AuthStateCache authStateCache) { + return getInstance(AuthLinkedinRequest.class,authConfig,authStateCache); + } }, /** * 微软 @@ -418,6 +602,16 @@ public enum AuthDefaultSource implements AuthSource { public String refresh() { return "https://login.microsoftonline.com/common/oauth2/v2.0/token"; } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig) { + return getAuthRequestInstance(authConfig,null); + } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig, AuthStateCache authStateCache) { + return getInstance(AuthMicrosoftRequest.class,authConfig,authStateCache); + } }, /** * 小米 @@ -442,6 +636,16 @@ public enum AuthDefaultSource implements AuthSource { public String refresh() { return "https://account.xiaomi.com/oauth2/token"; } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig) { + return getAuthRequestInstance(authConfig,null); + } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig, AuthStateCache authStateCache) { + return getInstance(AuthMiRequest.class,authConfig,authStateCache); + } }, /** * 今日头条 @@ -461,6 +665,16 @@ public enum AuthDefaultSource implements AuthSource { public String userInfo() { return "https://open.snssdk.com/data/user_profile"; } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig) { + return getAuthRequestInstance(authConfig,null); + } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig, AuthStateCache authStateCache) { + return getInstance(AuthToutiaoRequest.class,authConfig,authStateCache); + } }, /** * Teambition @@ -485,6 +699,16 @@ public enum AuthDefaultSource implements AuthSource { public String userInfo() { return "https://api.teambition.com/users/me"; } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig) { + return getAuthRequestInstance(authConfig,null); + } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig, AuthStateCache authStateCache) { + return getInstance(AuthTeambitionRequest.class,authConfig,authStateCache); + } }, /** @@ -510,6 +734,16 @@ public enum AuthDefaultSource implements AuthSource { public String userInfo() { return "https://api.renren.com/v2/user/get"; } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig) { + return getAuthRequestInstance(authConfig,null); + } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig, AuthStateCache authStateCache) { + return getInstance(AuthRenrenRequest.class,authConfig,authStateCache); + } }, /** @@ -530,6 +764,16 @@ public enum AuthDefaultSource implements AuthSource { public String userInfo() { return "https://api.pinterest.com/v1/me"; } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig) { + return getAuthRequestInstance(authConfig,null); + } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig, AuthStateCache authStateCache) { + return getInstance(AuthPinterestRequest.class,authConfig,authStateCache); + } }, /** @@ -550,6 +794,16 @@ public enum AuthDefaultSource implements AuthSource { public String userInfo() { return "https://api.stackexchange.com/2.2/me"; } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig) { + return getAuthRequestInstance(authConfig,null); + } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig, AuthStateCache authStateCache) { + return getInstance(AuthStackOverflowRequest.class,authConfig,authStateCache); + } }, /** @@ -577,6 +831,16 @@ public enum AuthDefaultSource implements AuthSource { public String refresh() { return "https://oauth-login.cloud.huawei.com/oauth2/v2/token"; } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig) { + return getAuthRequestInstance(authConfig,null); + } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig, AuthStateCache authStateCache) { + return getInstance(AuthHuaweiRequest.class,authConfig,authStateCache); + } }, /** @@ -599,6 +863,16 @@ public enum AuthDefaultSource implements AuthSource { public String userInfo() { return "https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo"; } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig) { + return getAuthRequestInstance(authConfig,null); + } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig, AuthStateCache authStateCache) { + return getInstance(AbstractAuthWeChatEnterpriseRequest.class,authConfig,authStateCache); + } }, /** @@ -619,6 +893,16 @@ public enum AuthDefaultSource implements AuthSource { public String userInfo() { return "https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo"; } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig) { + return getAuthRequestInstance(authConfig,null); + } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig, AuthStateCache authStateCache) { + return getInstance(AuthWeChatEnterpriseWebRequest.class,authConfig,authStateCache); + } }, /** @@ -646,6 +930,16 @@ public enum AuthDefaultSource implements AuthSource { public String refresh() { return "https://oauth.kujiale.com/oauth2/auth/token/refresh"; } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig) { + return getAuthRequestInstance(authConfig,null); + } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig, AuthStateCache authStateCache) { + return getInstance(AuthKujialeRequest.class,authConfig,authStateCache); + } }, /** @@ -668,6 +962,16 @@ public enum AuthDefaultSource implements AuthSource { public String userInfo() { return "https://gitlab.com/api/v4/user"; } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig) { + return getAuthRequestInstance(authConfig,null); + } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig, AuthStateCache authStateCache) { + return getInstance(AuthGitlabRequest.class,authConfig,authStateCache); + } }, /** @@ -695,6 +999,16 @@ public enum AuthDefaultSource implements AuthSource { public String refresh() { return "https://openapi.waimai.meituan.com/oauth/refresh_token"; } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig) { + return getAuthRequestInstance(authConfig,null); + } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig, AuthStateCache authStateCache) { + return getInstance(AuthMeituanRequest.class,authConfig,authStateCache); + } }, /** @@ -724,6 +1038,16 @@ public enum AuthDefaultSource implements AuthSource { public String refresh() { return "https://open-api.shop.ele.me/token"; } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig) { + return getAuthRequestInstance(authConfig,null); + } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig, AuthStateCache authStateCache) { + return getInstance(AuthElemeRequest.class,authConfig,authStateCache); + } }, /** @@ -746,6 +1070,16 @@ public enum AuthDefaultSource implements AuthSource { public String userInfo() { return "https://api.twitter.com/1.1/account/verify_credentials.json"; } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig) { + return getAuthRequestInstance(authConfig,null); + } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig, AuthStateCache authStateCache) { + return getInstance(AuthTwitterRequest.class,authConfig,authStateCache); + } }, /** @@ -775,6 +1109,16 @@ public enum AuthDefaultSource implements AuthSource { public String refresh() { return "https://open.feishu.cn/open-apis/authen/v1/refresh_access_token"; } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig) { + return getAuthRequestInstance(authConfig,null); + } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig, AuthStateCache authStateCache) { + return getInstance(AuthFeishuRequest.class,authConfig,authStateCache); + } }, /** * 京东 @@ -801,6 +1145,16 @@ public enum AuthDefaultSource implements AuthSource { public String refresh() { return "https://open-oauth.jd.com/oauth2/refresh_token"; } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig) { + return getAuthRequestInstance(authConfig,null); + } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig, AuthStateCache authStateCache) { + return getInstance(AuthJdRequest.class,authConfig,authStateCache); + } }, /** @@ -826,6 +1180,16 @@ public enum AuthDefaultSource implements AuthSource { public String refresh() { return "https://oauth.aliyun.com/v1/token"; } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig) { + return getAuthRequestInstance(authConfig,null); + } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig, AuthStateCache authStateCache) { + return getInstance(AuthAliyunRequest.class,authConfig,authStateCache); + } }, /** @@ -851,6 +1215,16 @@ public enum AuthDefaultSource implements AuthSource { public String refresh() { return "https://oauth.aliyun.com/v1/token"; } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig) { + return getAuthRequestInstance(authConfig,null); + } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig, AuthStateCache authStateCache) { + return getInstance(AuthXmlyRequest.class,authConfig,authStateCache); + } }, /** @@ -878,6 +1252,16 @@ public enum AuthDefaultSource implements AuthSource { public String refresh() { return "https://api.amazon.com/auth/o2/token"; } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig) { + return getAuthRequestInstance(authConfig,null); + } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig, AuthStateCache authStateCache) { + return getInstance(AuthAmazonRequest.class,authConfig,authStateCache); + } }, /** * Slack @@ -911,6 +1295,16 @@ public enum AuthDefaultSource implements AuthSource { public String revoke() { return "https://slack.com/api/auth.revoke"; } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig) { + return getAuthRequestInstance(authConfig,null); + } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig, AuthStateCache authStateCache) { + return getInstance(AuthSlackRequest.class,authConfig,authStateCache); + } }, /** * line @@ -933,6 +1327,16 @@ public enum AuthDefaultSource implements AuthSource { return "https://api.line.me/v2/profile"; } + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig) { + return getAuthRequestInstance(authConfig,null); + } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig, AuthStateCache authStateCache) { + return getInstance(AuthLineRequest.class,authConfig,authStateCache); + } + @Override public String refresh() { return "https://api.line.me/oauth2/v2.1/token"; @@ -942,6 +1346,7 @@ public enum AuthDefaultSource implements AuthSource { public String revoke() { return "https://api.line.me/oauth2/v2.1/revoke"; } + }, /** * Okta, @@ -975,6 +1380,16 @@ public enum AuthDefaultSource implements AuthSource { public String revoke() { return "https://%s.okta.com/oauth2/%s/v1/revoke"; } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig) { + return getAuthRequestInstance(authConfig,null); + } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig, AuthStateCache authStateCache) { + return getInstance(AuthOktaRequest.class,authConfig,authStateCache); + } }, /** * 程序员客栈 @@ -996,5 +1411,44 @@ public enum AuthDefaultSource implements AuthSource { public String userInfo() { return "https://www.proginn.com/openapi/user/basic_info"; } - }, + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig) { + return getAuthRequestInstance(authConfig,null); + } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig, AuthStateCache authStateCache) { + return getInstance(AuthProginnRequest.class,authConfig,authStateCache); + } + }; + + /** + * 利用反射 生成 AuthRequest 实例 + * @param cl 目标 class + * @param authConfig 配置 + * @param authStateCache 缓存配置 + * @return AuthRequest + */ + AuthRequest getInstance(Class cl, AuthConfig authConfig, AuthStateCache authStateCache) { + try { + Class clazz = Class.forName(cl.getName()); + if(authStateCache==null){ + return (AuthRequest) clazz.getDeclaredConstructor(AuthConfig.class).newInstance(authConfig); + }else{ + return (AuthRequest) clazz.getDeclaredConstructor(AuthConfig.class, AuthStateCache.class).newInstance(authConfig, authStateCache); + } + } catch (Exception e) { + throw new AuthException("未获取到有效的Auth配置"); + } + } + + /** + * 根据source获取对应的AuthSource枚举实例 + * @param source 枚举名 + * @return AuthDefaultSource + */ + public static AuthDefaultSource getAuthSource(String source){ + return Arrays.stream(AuthDefaultSource.values()).filter(authSource -> source.equalsIgnoreCase(authSource.name())).findAny().orElseThrow(()->new AuthException("未获取到有效的AuthSource配置")); + } } diff --git a/src/main/java/me/zhyd/oauth/config/AuthSource.java b/src/main/java/me/zhyd/oauth/config/AuthSource.java index a6cde64..db67a75 100644 --- a/src/main/java/me/zhyd/oauth/config/AuthSource.java +++ b/src/main/java/me/zhyd/oauth/config/AuthSource.java @@ -1,8 +1,10 @@ package me.zhyd.oauth.config; +import me.zhyd.oauth.cache.AuthStateCache; import me.zhyd.oauth.enums.AuthResponseStatus; import me.zhyd.oauth.exception.AuthException; import me.zhyd.oauth.model.AuthCallback; +import me.zhyd.oauth.request.AuthRequest; /** * OAuth平台的API地址的统一接口,提供以下方法: @@ -44,6 +46,21 @@ public interface AuthSource { */ String userInfo(); + /** + * 根据配置获取对应的实例 + * @param authConfig 配置 + * @return AuthRequest + */ + AuthRequest getAuthRequestInstance(AuthConfig authConfig); + + /** + * 根据配置和缓存获取对应的实例 + * @param authConfig 配置 + * @param authStateCache 缓存 + * @return AuthRequest + */ + AuthRequest getAuthRequestInstance(AuthConfig authConfig, AuthStateCache authStateCache); + /** * 取消授权的api * diff --git a/src/test/java/me/zhyd/oauth/config/AuthExtendSource.java b/src/test/java/me/zhyd/oauth/config/AuthExtendSource.java index 233c1dc..4101f06 100644 --- a/src/test/java/me/zhyd/oauth/config/AuthExtendSource.java +++ b/src/test/java/me/zhyd/oauth/config/AuthExtendSource.java @@ -1,5 +1,12 @@ package me.zhyd.oauth.config; +import me.zhyd.oauth.cache.AuthStateCache; +import me.zhyd.oauth.exception.AuthException; +import me.zhyd.oauth.request.AuthExtendRequest; +import me.zhyd.oauth.request.AuthRequest; + +import java.lang.reflect.Constructor; + /** * 测试自定义实现{@link AuthSource}接口后的枚举类 * @@ -40,6 +47,32 @@ public enum AuthExtendSource implements AuthSource { return null; } + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig) { + return getAuthRequestInstance(authConfig,null); + } + + @Override + public AuthRequest getAuthRequestInstance(AuthConfig authConfig, AuthStateCache authStateCache) { + try { + AuthRequest request; + Class clazz = Class.forName(AuthExtendRequest.class.getName()); + Constructor constructor; + if(authStateCache==null){ + constructor = clazz.getDeclaredConstructor(AuthConfig.class); + constructor.setAccessible(true); + request = (AuthRequest) constructor.newInstance(authConfig); + }else{ + constructor = clazz.getDeclaredConstructor(AuthConfig.class, AuthStateCache.class); + constructor.setAccessible(true); + request = (AuthRequest) constructor.newInstance(authConfig, authStateCache); + } + return request; + } catch (Exception e) { + throw new AuthException("未获取到有效的Auth配置"); + } + } + /** * 取消授权的api * diff --git a/src/test/java/me/zhyd/oauth/request/AuthWeChatMpRequestTest.java b/src/test/java/me/zhyd/oauth/request/AuthWeChatMpRequestTest.java index 1fd144a..14dff6f 100644 --- a/src/test/java/me/zhyd/oauth/request/AuthWeChatMpRequestTest.java +++ b/src/test/java/me/zhyd/oauth/request/AuthWeChatMpRequestTest.java @@ -1,6 +1,7 @@ package me.zhyd.oauth.request; import me.zhyd.oauth.config.AuthConfig; +import me.zhyd.oauth.config.AuthDefaultSource; import me.zhyd.oauth.utils.AuthStateUtils; import org.junit.Test; @@ -16,4 +17,14 @@ public class AuthWeChatMpRequestTest { .build()); System.out.println(request.authorize(AuthStateUtils.createState())); } + + @Test + public void authorize1() { + AuthRequest request = AuthDefaultSource.getAuthSource("wechat_mp").getAuthRequestInstance(AuthConfig.builder() + .clientId("a") + .clientSecret("a") + .redirectUri("https://www.justauth.cn") + .build()); + System.out.println(request.authorize(AuthStateUtils.createState())); + } } -- GitLab