From 4c8fdbae494d47cefcf62a11aae9599f97153ea8 Mon Sep 17 00:00:00 2001 From: "yadong.zhang" Date: Tue, 6 Jul 2021 22:19:30 +0800 Subject: [PATCH] =?UTF-8?q?:memo:=20=E4=BF=AE=E5=A4=8D=E2=80=9C=E6=B7=98?= =?UTF-8?q?=E5=AE=9D=E2=80=9D=E5=B9=B3=E5=8F=B0=E6=8E=88=E6=9D=83=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E5=90=8E=E6=B2=A1=E6=9C=89`uid`=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E3=80=81=E5=A2=9E=E5=8A=A0=E5=88=B7=E6=96=B0token?= =?UTF-8?q?=E7=9A=84=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOGS.md | 3 +- .../zhyd/oauth/request/AuthTaobaoRequest.java | 45 ++++++++++++++++--- 2 files changed, 40 insertions(+), 8 deletions(-) diff --git a/CHANGELOGS.md b/CHANGELOGS.md index 913169a..353bd45 100644 --- a/CHANGELOGS.md +++ b/CHANGELOGS.md @@ -2,11 +2,12 @@ ### 2021/6/3 -- 发布 v1.16.1 +- 发布 v1.16.2 - 新增 - 集成“程序员客栈”平台登录 - 修改 - 更新文档 + - 修复“淘宝”平台授权登录后没有`uid`的问题、增加刷新token的功能 ## 1.16.1 diff --git a/src/main/java/me/zhyd/oauth/request/AuthTaobaoRequest.java b/src/main/java/me/zhyd/oauth/request/AuthTaobaoRequest.java index 92505aa..dc65a54 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthTaobaoRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthTaobaoRequest.java @@ -4,12 +4,16 @@ import com.alibaba.fastjson.JSONObject; 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.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.GlobalAuthUtils; +import me.zhyd.oauth.utils.HttpUtils; +import me.zhyd.oauth.utils.StringUtils; import me.zhyd.oauth.utils.UrlBuilder; /** @@ -33,6 +37,26 @@ public class AuthTaobaoRequest extends AuthDefaultRequest { return AuthToken.builder().accessCode(authCallback.getCode()).build(); } + private AuthToken getAuthToken(JSONObject object) { + this.checkResponse(object); + + return AuthToken.builder() + .accessToken(object.getString("access_token")) + .expireIn(object.getIntValue("expires_in")) + .tokenType(object.getString("token_type")) + .idToken(object.getString("id_token")) + .refreshToken(object.getString("refresh_token")) + .uid(object.getString("taobao_user_id")) + .openId(object.getString("taobao_open_uid")) + .build(); + } + + private void checkResponse(JSONObject object) { + if (object.containsKey("error")) { + throw new AuthException(object.getString("error_description")); + } + } + @Override protected AuthUser getUserInfo(AuthToken authToken) { String response = doPostAuthorizationCode(authToken.getAccessCode()); @@ -40,16 +64,12 @@ public class AuthTaobaoRequest extends AuthDefaultRequest { if (accessTokenObject.containsKey("error")) { throw new AuthException(accessTokenObject.getString("error_description")); } - authToken.setAccessToken(accessTokenObject.getString("access_token")); - authToken.setRefreshToken(accessTokenObject.getString("refresh_token")); - authToken.setExpireIn(accessTokenObject.getIntValue("expires_in")); - authToken.setUid(accessTokenObject.getString("taobao_user_id")); - authToken.setOpenId(accessTokenObject.getString("taobao_open_uid")); + authToken = this.getAuthToken(accessTokenObject); String nick = GlobalAuthUtils.urlDecode(accessTokenObject.getString("taobao_user_nick")); return AuthUser.builder() - .rawUserInfo(new JSONObject()) - .uuid(accessTokenObject.getString("taobao_user_id")) + .rawUserInfo(accessTokenObject) + .uuid(StringUtils.isEmpty(authToken.getUid()) ? authToken.getOpenId() : authToken.getUid()) .username(nick) .nickname(nick) .gender(AuthUserGender.UNKNOWN) @@ -58,6 +78,17 @@ public class AuthTaobaoRequest extends AuthDefaultRequest { .build(); } + @Override + public AuthResponse refresh(AuthToken oldToken) { + String tokenUrl = refreshTokenUrl(oldToken.getRefreshToken()); + String response = new HttpUtils(config.getHttpConfig()).post(tokenUrl); + JSONObject accessTokenObject = JSONObject.parseObject(response); + return AuthResponse.builder() + .code(AuthResponseStatus.SUCCESS.getCode()) + .data(this.getAuthToken(accessTokenObject)) + .build(); + } + /** * 返回带{@code state}参数的授权url,授权回调时会带上这个{@code state} * -- GitLab