From 5694d4828864465e8f3ff08b419b33079185d0b0 Mon Sep 17 00:00:00 2001 From: "Yangkai.Shen" <237497819@qq.com> Date: Thu, 18 Jul 2019 16:53:54 +0800 Subject: [PATCH] =?UTF-8?q?:art:=20=E5=A2=9E=E5=8A=A0=E9=83=A8=E5=88=86?= =?UTF-8?q?=E5=B7=A5=E5=85=B7=E7=B1=BB=E5=8F=8A=E6=96=B9=E6=B3=95=E3=80=81?= =?UTF-8?q?=E9=87=8D=E8=BD=BDAuthState=E9=83=A8=E5=88=86=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/me/zhyd/oauth/utils/AuthState.java | 20 ++++++ .../me/zhyd/oauth/utils/GlobalAuthUtil.java | 19 ++++- .../java/me/zhyd/oauth/utils/UrlBuilder.java | 70 +++++++++++++++++++ .../me/zhyd/oauth/utils/UrlBuilderTest.java | 39 +++++++++++ 4 files changed, 145 insertions(+), 3 deletions(-) create mode 100644 src/main/java/me/zhyd/oauth/utils/UrlBuilder.java create mode 100644 src/test/java/me/zhyd/oauth/utils/UrlBuilderTest.java diff --git a/src/main/java/me/zhyd/oauth/utils/AuthState.java b/src/main/java/me/zhyd/oauth/utils/AuthState.java index d38c5c4..948ac96 100644 --- a/src/main/java/me/zhyd/oauth/utils/AuthState.java +++ b/src/main/java/me/zhyd/oauth/utils/AuthState.java @@ -4,6 +4,7 @@ import cn.hutool.core.codec.Base64; import cn.hutool.core.util.RandomUtil; import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; +import me.zhyd.oauth.config.AuthSource; import me.zhyd.oauth.exception.AuthException; import me.zhyd.oauth.model.AuthResponseStatus; @@ -30,6 +31,16 @@ public class AuthState { */ private static ConcurrentHashMap stateBucket = new ConcurrentHashMap<>(); + /** + * 生成随机的state + * + * @param source oauth平台 + * @return state + */ + public static String create(AuthSource source) { + return create(source.name()); + } + /** * 生成随机的state * @@ -158,6 +169,15 @@ public class AuthState { stateBucket.remove(key); } + /** + * 登录成功后,清除state + * + * @param source oauth平台 + */ + public static void delete(AuthSource source) { + delete(source.name()); + } + private static String getCurrentIp() { String currentIp = IpUtils.getIp(); return StringUtils.isEmpty(currentIp) ? EMPTY_STR : currentIp; diff --git a/src/main/java/me/zhyd/oauth/utils/GlobalAuthUtil.java b/src/main/java/me/zhyd/oauth/utils/GlobalAuthUtil.java index 22bb699..a5712f8 100644 --- a/src/main/java/me/zhyd/oauth/utils/GlobalAuthUtil.java +++ b/src/main/java/me/zhyd/oauth/utils/GlobalAuthUtil.java @@ -1,6 +1,8 @@ package me.zhyd.oauth.utils; import cn.hutool.core.codec.Base64; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; import me.zhyd.oauth.exception.AuthException; import javax.crypto.Mac; @@ -12,9 +14,7 @@ import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; +import java.util.*; /** * 全局的工具类 @@ -82,6 +82,19 @@ public class GlobalAuthUtil { return res; } + public static String parseMapToString(Map params, boolean encode) { + List paramList = new ArrayList<>(); + params.forEach((k, v) -> { + if (ObjectUtil.isNull(v)) { + paramList.add(k + "="); + } else { + String valueString = v.toString(); + paramList.add(k + "=" + (encode ? urlEncode(valueString) : valueString)); + } + }); + return CollUtil.join(paramList, "&"); + } + public static boolean isHttpProtocol(String url) { if (StringUtils.isEmpty(url)) { return false; diff --git a/src/main/java/me/zhyd/oauth/utils/UrlBuilder.java b/src/main/java/me/zhyd/oauth/utils/UrlBuilder.java new file mode 100644 index 0000000..4757da2 --- /dev/null +++ b/src/main/java/me/zhyd/oauth/utils/UrlBuilder.java @@ -0,0 +1,70 @@ +package me.zhyd.oauth.utils; + +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.StrUtil; +import lombok.Data; + +import java.util.LinkedHashMap; +import java.util.Map; + +/** + *

+ * 构造URL + *

+ * + * @author yangkai.shen + * @date Created in 2019-07-18 15:47 + */ +@Data +public class UrlBuilder { + private String baseUrl; + + private final Map params = new LinkedHashMap<>(4); + + /** + * @param baseUrl 基础路径 + * @return the new {@code UrlBuilder} + */ + public static UrlBuilder fromBaseUrl(String baseUrl) { + UrlBuilder builder = new UrlBuilder(); + builder.setBaseUrl(baseUrl); + return builder; + } + + /** + * 添加参数 + * + * @param key 参数名称 + * @param value 参数值 + * @return this UrlBuilder + */ + public UrlBuilder queryParam(String key, Object value) { + Assert.notBlank(key, "参数名不能为空"); + + String valueAsString = (value != null ? value.toString() : null); + this.params.put(key, valueAsString); + + return this; + } + + /** + * 构造url + * + * @return url + */ + public String build() { + return this.build(false); + } + + /** + * 构造url + * + * @param encode 转码 + * @return url + */ + public String build(boolean encode) { + String baseUrl = StrUtil.addSuffixIfNot(this.baseUrl, "?"); + String paramString = GlobalAuthUtil.parseMapToString(this.params, encode); + return baseUrl + paramString; + } +} diff --git a/src/test/java/me/zhyd/oauth/utils/UrlBuilderTest.java b/src/test/java/me/zhyd/oauth/utils/UrlBuilderTest.java new file mode 100644 index 0000000..778a204 --- /dev/null +++ b/src/test/java/me/zhyd/oauth/utils/UrlBuilderTest.java @@ -0,0 +1,39 @@ +package me.zhyd.oauth.utils; + +import me.zhyd.oauth.config.AuthConfig; +import me.zhyd.oauth.config.AuthSource; +import me.zhyd.oauth.request.AuthWeChatRequest; +import org.junit.Assert; +import org.junit.Test; + +/** + *

+ * UrlBuilder测试类 + *

+ * + * @author yangkai.shen + * @date Created in 2019-07-18 16:36 + */ +public class UrlBuilderTest { + @Test + public void testUrlBuilder() { + AuthConfig config = new AuthConfig(); + config.setClientId("appid-110110110"); + config.setClientSecret("secret-110110110"); + config.setRedirectUri("https://xkcoding.com"); + config.setState(AuthState.create(AuthSource.WECHAT)); + // @formatter:off + String build = UrlBuilder.fromBaseUrl(AuthSource.WECHAT.authorize()) + .queryParam("appid", config.getClientId()) + .queryParam("redirect_uri", config.getRedirectUri()) + .queryParam("response_type", "code") + .queryParam("scope", "snsapi_login") + .queryParam("state", config.getState().concat("#wechat_redirect")) + .build(false); + // @formatter:on + AuthWeChatRequest request = new AuthWeChatRequest(config); + String authorize = request.authorize(); + Assert.assertEquals(build, authorize); + AuthState.delete(AuthSource.WECHAT); + } +} -- GitLab