From af723a8b088abef6a80bf8bd771a2d5e315158bc Mon Sep 17 00:00:00 2001 From: "yadong.zhang" Date: Tue, 16 Jul 2019 15:11:18 +0800 Subject: [PATCH] =?UTF-8?q?:recycle:=20=E4=BB=8EUrlBuilder=E4=B8=AD?= =?UTF-8?q?=E6=8B=86=E5=88=86=E5=BE=AE=E4=BF=A1=E7=9B=B8=E5=85=B3=E7=9A=84?= =?UTF-8?q?URL?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../zhyd/oauth/request/AuthWeChatRequest.java | 27 +++++++--- .../me/zhyd/oauth/url/WechatUrlBuilder.java | 49 ++++++++++++++++++ .../url/entity/AuthRefreshTokenEntity.java | 3 ++ .../java/me/zhyd/oauth/utils/UrlBuilder.java | 51 ------------------- 4 files changed, 73 insertions(+), 57 deletions(-) create mode 100644 src/main/java/me/zhyd/oauth/url/WechatUrlBuilder.java diff --git a/src/main/java/me/zhyd/oauth/request/AuthWeChatRequest.java b/src/main/java/me/zhyd/oauth/request/AuthWeChatRequest.java index e7ae78e..eec7c99 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthWeChatRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthWeChatRequest.java @@ -7,7 +7,11 @@ import me.zhyd.oauth.config.AuthConfig; import me.zhyd.oauth.config.AuthSource; import me.zhyd.oauth.exception.AuthException; import me.zhyd.oauth.model.*; -import me.zhyd.oauth.utils.UrlBuilder; +import me.zhyd.oauth.url.WechatUrlBuilder; +import me.zhyd.oauth.url.entity.AuthAccessTokenEntity; +import me.zhyd.oauth.url.entity.AuthAuthorizeEntity; +import me.zhyd.oauth.url.entity.AuthRefreshTokenEntity; +import me.zhyd.oauth.url.entity.AuthUserInfoEntity; /** * 微信登录 @@ -18,7 +22,7 @@ import me.zhyd.oauth.utils.UrlBuilder; */ public class AuthWeChatRequest extends BaseAuthRequest { public AuthWeChatRequest(AuthConfig config) { - super(config, AuthSource.WECHAT); + super(config, AuthSource.WECHAT, new WechatUrlBuilder()); } /** @@ -29,7 +33,10 @@ public class AuthWeChatRequest extends BaseAuthRequest { */ @Override protected AuthToken getAccessToken(AuthCallback authCallback) { - String accessTokenUrl = UrlBuilder.getWeChatAccessTokenUrl(config.getClientId(), config.getClientSecret(), authCallback.getCode()); + String accessTokenUrl = this.urlBuilder.getAccessTokenUrl(AuthAccessTokenEntity.builder() + .config(config) + .code(authCallback.getCode()) + .build()); return this.getToken(accessTokenUrl); } @@ -38,7 +45,10 @@ public class AuthWeChatRequest extends BaseAuthRequest { String accessToken = authToken.getAccessToken(); String openId = authToken.getOpenId(); - HttpResponse response = HttpRequest.get(UrlBuilder.getWeChatUserInfoUrl(accessToken, openId)).execute(); + HttpResponse response = HttpRequest.get(this.urlBuilder.getUserInfoUrl(AuthUserInfoEntity.builder() + .accessToken(accessToken) + .openId(openId) + .build())).execute(); JSONObject object = JSONObject.parseObject(response.body()); this.checkResponse(object); @@ -63,12 +73,17 @@ public class AuthWeChatRequest extends BaseAuthRequest { */ @Override public String authorize() { - return UrlBuilder.getWeChatAuthorizeUrl(config.getClientId(), config.getRedirectUri(), config.getState()); + return this.urlBuilder.getAuthorizeUrl(AuthAuthorizeEntity.builder() + .config(config) + .build()); } @Override public AuthResponse refresh(AuthToken oldToken) { - String refreshTokenUrl = UrlBuilder.getWeChatRefreshUrl(config.getClientId(), oldToken.getRefreshToken()); + String refreshTokenUrl = this.urlBuilder.getRefreshUrl(AuthRefreshTokenEntity.builder() + .clientId(config.getClientId()) + .refreshToken(oldToken.getRefreshToken()) + .build()); return AuthResponse.builder() .code(ResponseStatus.SUCCESS.getCode()) .data(this.getToken(refreshTokenUrl)) diff --git a/src/main/java/me/zhyd/oauth/url/WechatUrlBuilder.java b/src/main/java/me/zhyd/oauth/url/WechatUrlBuilder.java new file mode 100644 index 0000000..7204b44 --- /dev/null +++ b/src/main/java/me/zhyd/oauth/url/WechatUrlBuilder.java @@ -0,0 +1,49 @@ +package me.zhyd.oauth.url; + +import me.zhyd.oauth.config.AuthConfig; +import me.zhyd.oauth.config.AuthSource; +import me.zhyd.oauth.url.entity.*; + +import java.text.MessageFormat; + +/** + * 微信相关的URL构建类 + * + * @author yadong.zhang (yadong.zhang0415(a)gmail.com) + * @version 1.0 + * @since 1.8 + */ +public class WechatUrlBuilder extends AbstractUrlBuilder { + + private static final String WECHAT_AUTHORIZE_PATTERN = "{0}?appid={1}&redirect_uri={2}&response_type=code&scope=snsapi_login&state={3}#wechat_redirect"; + private static final String WECHAT_ACCESS_TOKEN_PATTERN = "{0}?appid={1}&secret={2}&code={3}&grant_type=authorization_code"; + private static final String WECHAT_REFRESH_TOKEN_PATTERN = "{0}?appid={1}&grant_type=refresh_token&refresh_token={2}"; + private static final String WECHAT_USER_INFO_PATTERN = "{0}?access_token={1}&openid={2}&lang=zh_CN"; + + @Override + public String getAccessTokenUrl(AuthAccessTokenEntity accessTokenEntity) { + AuthConfig config = accessTokenEntity.getConfig(); + return MessageFormat.format(WECHAT_ACCESS_TOKEN_PATTERN, AuthSource.WECHAT.accessToken(), config.getClientId(), config.getClientSecret(), accessTokenEntity.getCode()); + } + + @Override + public String getUserInfoUrl(AuthUserInfoEntity userInfoEntity) { + return MessageFormat.format(WECHAT_USER_INFO_PATTERN, AuthSource.WECHAT.userInfo(), userInfoEntity.getAccessToken(), userInfoEntity.getOpenId()); + } + + @Override + public String getAuthorizeUrl(AuthAuthorizeEntity authorizeEntity) { + AuthConfig config = authorizeEntity.getConfig(); + return MessageFormat.format(WECHAT_AUTHORIZE_PATTERN, AuthSource.WECHAT.authorize(), config.getClientId(), config.getRedirectUri(), this.getRealState(config.getState())); + } + + @Override + public String getRefreshUrl(AuthRefreshTokenEntity refreshTokenEntity) { + return MessageFormat.format(WECHAT_REFRESH_TOKEN_PATTERN, AuthSource.WECHAT.refresh(), refreshTokenEntity.getClientId(), refreshTokenEntity.getRefreshToken()); + } + + @Override + public String getRevokeUrl(AuthRevokeEntity revokeEntity) { + return null; + } +} diff --git a/src/main/java/me/zhyd/oauth/url/entity/AuthRefreshTokenEntity.java b/src/main/java/me/zhyd/oauth/url/entity/AuthRefreshTokenEntity.java index 19d07a0..b80a754 100644 --- a/src/main/java/me/zhyd/oauth/url/entity/AuthRefreshTokenEntity.java +++ b/src/main/java/me/zhyd/oauth/url/entity/AuthRefreshTokenEntity.java @@ -11,4 +11,7 @@ import lombok.Getter; @Getter @Builder public class AuthRefreshTokenEntity { + + private String clientId; + private String refreshToken; } diff --git a/src/main/java/me/zhyd/oauth/utils/UrlBuilder.java b/src/main/java/me/zhyd/oauth/utils/UrlBuilder.java index 85187c8..c8a3255 100644 --- a/src/main/java/me/zhyd/oauth/utils/UrlBuilder.java +++ b/src/main/java/me/zhyd/oauth/utils/UrlBuilder.java @@ -57,11 +57,6 @@ public class UrlBuilder { private static final String QQ_AUTHORIZE_PATTERN = "{0}?client_id={1}&response_type=code&redirect_uri={2}&state={3}"; private static final String QQ_OPENID_PATTERN = "{0}?access_token={1}&unionid={2}"; - private static final String WECHAT_AUTHORIZE_PATTERN = "{0}?appid={1}&redirect_uri={2}&response_type=code&scope=snsapi_login&state={3}#wechat_redirect"; - private static final String WECHAT_ACCESS_TOKEN_PATTERN = "{0}?appid={1}&secret={2}&code={3}&grant_type=authorization_code"; - private static final String WECHAT_REFRESH_TOKEN_PATTERN = "{0}?appid={1}&grant_type=refresh_token&refresh_token={2}"; - private static final String WECHAT_USER_INFO_PATTERN = "{0}?access_token={1}&openid={2}&lang=zh_CN"; - private static final String TAOBAO_AUTHORIZE_PATTERN = "{0}?response_type=code&client_id={1}&redirect_uri={2}&state={3}&view=web"; private static final String TAOBAO_ACCESS_TOKEN_PATTERN = "{0}?client_id={1}&client_secret={2}&code={3}&redirect_uri={4}&grant_type=authorization_code"; @@ -440,52 +435,6 @@ public class UrlBuilder { return MessageFormat.format(ALIPAY_AUTHORIZE_PATTERN, AuthSource.ALIPAY.authorize(), clientId, redirectUrl, getState(state)); } - /** - * 获取微信 授权地址 - * - * @param clientId 微信 应用的appid - * @param redirectUrl 微信 应用授权成功后的回调地址 - * @param state 随机字符串,用于保持会话状态,防止CSRF攻击 - * @return full url - */ - public static String getWeChatAuthorizeUrl(String clientId, String redirectUrl, String state) { - return MessageFormat.format(WECHAT_AUTHORIZE_PATTERN, AuthSource.WECHAT.authorize(), clientId, redirectUrl, getState(state)); - } - - /** - * 获取微信 token的接口地址 - * - * @param clientId 微信 应用的appid - * @param clientSecret 微信 应用的secret - * @param code 微信 授权前的code,用来换token - * @return full url - */ - public static String getWeChatAccessTokenUrl(String clientId, String clientSecret, String code) { - return MessageFormat.format(WECHAT_ACCESS_TOKEN_PATTERN, AuthSource.WECHAT.accessToken(), clientId, clientSecret, code); - } - - /** - * 获取微信 用户详情的接口地址 - * - * @param token 微信 应用返回的 access token - * @param openId 微信 应用返回的openId - * @return full url - */ - public static String getWeChatUserInfoUrl(String token, String openId) { - return MessageFormat.format(WECHAT_USER_INFO_PATTERN, AuthSource.WECHAT.userInfo(), token, openId); - } - - /** - * 获取微信 刷新令牌 地址 - * - * @param clientId 微信 应用的appid - * @param refreshToken 微信 应用返回的刷新token - * @return full url - */ - public static String getWeChatRefreshUrl(String clientId, String refreshToken) { - return MessageFormat.format(WECHAT_REFRESH_TOKEN_PATTERN, AuthSource.WECHAT.refresh(), clientId, refreshToken); - } - /** * 获取Taobao token的接口地址: 淘宝的授权登录,在这一步就会返回用户信息 * -- GitLab