diff --git a/src/main/java/me/zhyd/oauth/request/AuthAlipayRequest.java b/src/main/java/me/zhyd/oauth/request/AuthAlipayRequest.java index 16536a85e4365a0c7156630bfc1900acd20bffc7..0f3750f48edb6006d28802dde896da5b16aecf62 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthAlipayRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthAlipayRequest.java @@ -14,8 +14,8 @@ import me.zhyd.oauth.model.AuthCallback; import me.zhyd.oauth.model.AuthToken; import me.zhyd.oauth.model.AuthUser; import me.zhyd.oauth.model.AuthUserGender; -import me.zhyd.oauth.url.AuthAlipayUrlBuilder; import me.zhyd.oauth.utils.StringUtils; +import me.zhyd.oauth.utils.UrlBuilder; /** * 支付宝登录 @@ -29,9 +29,9 @@ public class AuthAlipayRequest extends AuthDefaultRequest { private AlipayClient alipayClient; public AuthAlipayRequest(AuthConfig config) { - super(config, AuthSource.ALIPAY, new AuthAlipayUrlBuilder()); + super(config, AuthSource.ALIPAY); this.alipayClient = new DefaultAlipayClient(AuthSource.ALIPAY.accessToken(), config.getClientId(), config.getClientSecret(), "json", "UTF-8", config - .getAlipayPublicKey(), "RSA2"); + .getAlipayPublicKey(), "RSA2"); } @Override @@ -49,11 +49,11 @@ public class AuthAlipayRequest extends AuthDefaultRequest { throw new AuthException(response.getSubMsg()); } return AuthToken.builder() - .accessToken(response.getAccessToken()) - .uid(response.getUserId()) - .expireIn(Integer.parseInt(response.getExpiresIn())) - .refreshToken(response.getRefreshToken()) - .build(); + .accessToken(response.getAccessToken()) + .uid(response.getUserId()) + .expireIn(Integer.parseInt(response.getExpiresIn())) + .refreshToken(response.getRefreshToken()) + .build(); } @Override @@ -70,19 +70,33 @@ public class AuthAlipayRequest extends AuthDefaultRequest { throw new AuthException(response.getSubMsg()); } - String province = response.getProvince(), - city = response.getCity(); + String province = response.getProvince(), city = response.getCity(); String location = String.format("%s %s", StringUtils.isEmpty(province) ? "" : province, StringUtils.isEmpty(city) ? "" : city); return AuthUser.builder() - .uuid(response.getUserId()) - .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(AuthSource.ALIPAY) - .build(); + .uuid(response.getUserId()) + .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(AuthSource.ALIPAY) + .build(); + } + + /** + * 返回认证url,可自行跳转页面 + * + * @return 返回授权地址 + */ + @Override + public String authorize() { + return UrlBuilder.fromBaseUrl(source.authorize()) + .queryParam("app_id", config.getClientId()) + .queryParam("scope", "auth_user") + .queryParam("redirect_uri", config.getRedirectUri()) + .queryParam("state", getRealState(config.getState())) + .build(); } } diff --git a/src/main/java/me/zhyd/oauth/request/AuthBaiduRequest.java b/src/main/java/me/zhyd/oauth/request/AuthBaiduRequest.java index bb2082fcc9133787f8c50e9ef56919099583e9dd..402134ad3d78702553a935f3533867db593f5826 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthBaiduRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthBaiduRequest.java @@ -8,8 +8,7 @@ import me.zhyd.oauth.config.AuthSource; import me.zhyd.oauth.enums.AuthBaiduErrorCode; import me.zhyd.oauth.exception.AuthException; import me.zhyd.oauth.model.*; -import me.zhyd.oauth.url.AuthBaiduUrlBuilder; -import me.zhyd.oauth.url.entity.AuthUserInfoEntity; +import me.zhyd.oauth.utils.UrlBuilder; /** * 百度账号登录 @@ -21,32 +20,28 @@ import me.zhyd.oauth.url.entity.AuthUserInfoEntity; public class AuthBaiduRequest extends AuthDefaultRequest { public AuthBaiduRequest(AuthConfig config) { - super(config, AuthSource.BAIDU, new AuthBaiduUrlBuilder()); + super(config, AuthSource.BAIDU); } @Override protected AuthToken getAccessToken(AuthCallback authCallback) { - String accessTokenUrl = this.urlBuilder.getAccessTokenUrl(authCallback.getCode()); - HttpResponse response = HttpRequest.post(accessTokenUrl).execute(); + HttpResponse response = doPostAuthorizationCode(authCallback.getCode()); JSONObject accessTokenObject = JSONObject.parseObject(response.body()); AuthBaiduErrorCode errorCode = AuthBaiduErrorCode.getErrorCode(accessTokenObject.getString("error")); if (AuthBaiduErrorCode.OK != errorCode) { throw new AuthException(errorCode.getDesc()); } return AuthToken.builder() - .accessToken(accessTokenObject.getString("access_token")) - .refreshToken(accessTokenObject.getString("refresh_token")) - .scope(accessTokenObject.getString("scope")) - .expireIn(accessTokenObject.getIntValue("expires_in")) - .build(); + .accessToken(accessTokenObject.getString("access_token")) + .refreshToken(accessTokenObject.getString("refresh_token")) + .scope(accessTokenObject.getString("scope")) + .expireIn(accessTokenObject.getIntValue("expires_in")) + .build(); } @Override protected AuthUser getUserInfo(AuthToken authToken) { - String accessToken = authToken.getAccessToken(); - HttpResponse response = HttpRequest.get(this.urlBuilder.getUserInfoUrl(AuthUserInfoEntity.builder() - .accessToken(accessToken) - .build())).execute(); + HttpResponse response = doGetUserInfo(authToken); String userInfo = response.body(); JSONObject object = JSONObject.parseObject(userInfo); AuthBaiduErrorCode errorCode = AuthBaiduErrorCode.getErrorCode(object.getString("error")); @@ -54,29 +49,46 @@ public class AuthBaiduRequest extends AuthDefaultRequest { throw new AuthException(errorCode.getDesc()); } return AuthUser.builder() - .uuid(object.getString("userid")) - .username(object.getString("username")) - .nickname(object.getString("username")) - .gender(AuthUserGender.getRealGender(object.getString("sex"))) - .token(authToken) - .source(AuthSource.BAIDU) - .build(); + .uuid(object.getString("userid")) + .username(object.getString("username")) + .nickname(object.getString("username")) + .gender(AuthUserGender.getRealGender(object.getString("sex"))) + .token(authToken) + .source(AuthSource.BAIDU) + .build(); } @Override public AuthResponse revoke(AuthToken authToken) { String accessToken = authToken.getAccessToken(); - HttpResponse response = HttpRequest.get(this.urlBuilder.getRevokeUrl(accessToken)).execute(); + HttpResponse response = HttpRequest.get(UrlBuilder.fromBaseUrl(source.revoke()) + .queryParam("access_token", accessToken) + .build()).execute(); String userInfo = response.body(); JSONObject object = JSONObject.parseObject(userInfo); if (object.containsKey("error_code")) { return AuthResponse.builder() - .code(AuthResponseStatus.FAILURE.getCode()) - .msg(object.getString("error_msg")) - .build(); + .code(AuthResponseStatus.FAILURE.getCode()) + .msg(object.getString("error_msg")) + .build(); } AuthResponseStatus status = object.getIntValue("result") == 1 ? AuthResponseStatus.SUCCESS : AuthResponseStatus.FAILURE; return AuthResponse.builder().code(status.getCode()).msg(status.getMsg()).build(); } + /** + * 返回认证url,可自行跳转页面 + * + * @return 返回授权地址 + */ + @Override + public String authorize() { + return UrlBuilder.fromBaseUrl(source.authorize()) + .queryParam("response_type", "code") + .queryParam("client_id", config.getClientId()) + .queryParam("redirect_uri", config.getRedirectUri()) + .queryParam("display", "popup") + .queryParam("state", getRealState(config.getState())) + .build(); + } } diff --git a/src/main/java/me/zhyd/oauth/request/AuthCodingRequest.java b/src/main/java/me/zhyd/oauth/request/AuthCodingRequest.java index 54c79b9f2d26dbde63b55f71b8d8c9aeea65ce42..bf98f4604381a9906477c331858aaf3273340617 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthCodingRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthCodingRequest.java @@ -10,8 +10,7 @@ import me.zhyd.oauth.model.AuthCallback; import me.zhyd.oauth.model.AuthToken; import me.zhyd.oauth.model.AuthUser; import me.zhyd.oauth.model.AuthUserGender; -import me.zhyd.oauth.url.AuthCodingUrlBuilder; -import me.zhyd.oauth.url.entity.AuthUserInfoEntity; +import me.zhyd.oauth.utils.UrlBuilder; /** * Cooding登录 @@ -23,30 +22,26 @@ import me.zhyd.oauth.url.entity.AuthUserInfoEntity; public class AuthCodingRequest extends AuthDefaultRequest { public AuthCodingRequest(AuthConfig config) { - super(config, AuthSource.CODING, new AuthCodingUrlBuilder()); + super(config, AuthSource.CODING); } @Override protected AuthToken getAccessToken(AuthCallback authCallback) { - String accessTokenUrl = this.urlBuilder.getAccessTokenUrl(authCallback.getCode()); - HttpResponse response = HttpRequest.get(accessTokenUrl).execute(); + HttpResponse response = doGetAuthorizationCode(authCallback.getCode()); JSONObject accessTokenObject = JSONObject.parseObject(response.body()); if (accessTokenObject.getIntValue("code") != 0) { throw new AuthException("Unable to get token from coding using code [" + authCallback.getCode() + "]: " + accessTokenObject); } return AuthToken.builder() - .accessToken(accessTokenObject.getString("access_token")) - .expireIn(accessTokenObject.getIntValue("expires_in")) - .refreshToken(accessTokenObject.getString("refresh_token")) - .build(); + .accessToken(accessTokenObject.getString("access_token")) + .expireIn(accessTokenObject.getIntValue("expires_in")) + .refreshToken(accessTokenObject.getString("refresh_token")) + .build(); } @Override protected AuthUser getUserInfo(AuthToken authToken) { - String accessToken = authToken.getAccessToken(); - HttpResponse response = HttpRequest.get(this.urlBuilder.getUserInfoUrl(AuthUserInfoEntity.builder() - .accessToken(accessToken) - .build())).execute(); + HttpResponse response = doGetUserInfo(authToken); JSONObject object = JSONObject.parseObject(response.body()); if (object.getIntValue("code") != 0) { throw new AuthException(object.getString("msg")); @@ -54,18 +49,34 @@ public class AuthCodingRequest extends AuthDefaultRequest { object = object.getJSONObject("data"); return AuthUser.builder() - .uuid(object.getString("id")) - .username(object.getString("name")) - .avatar("https://coding.net/" + object.getString("avatar")) - .blog("https://coding.net/" + object.getString("path")) - .nickname(object.getString("name")) - .company(object.getString("company")) - .location(object.getString("location")) - .gender(AuthUserGender.getRealGender(object.getString("sex"))) - .email(object.getString("email")) - .remark(object.getString("slogan")) - .token(authToken) - .source(AuthSource.CODING) - .build(); + .uuid(object.getString("id")) + .username(object.getString("name")) + .avatar("https://coding.net/" + object.getString("avatar")) + .blog("https://coding.net/" + object.getString("path")) + .nickname(object.getString("name")) + .company(object.getString("company")) + .location(object.getString("location")) + .gender(AuthUserGender.getRealGender(object.getString("sex"))) + .email(object.getString("email")) + .remark(object.getString("slogan")) + .token(authToken) + .source(AuthSource.CODING) + .build(); + } + + /** + * 返回认证url,可自行跳转页面 + * + * @return 返回授权地址 + */ + @Override + public String authorize() { + return UrlBuilder.fromBaseUrl(source.authorize()) + .queryParam("response_type", "code") + .queryParam("client_id", config.getClientId()) + .queryParam("redirect_uri", config.getRedirectUri()) + .queryParam("scope", "user") + .queryParam("state", getRealState(config.getState())) + .build(); } } diff --git a/src/main/java/me/zhyd/oauth/request/AuthCsdnRequest.java b/src/main/java/me/zhyd/oauth/request/AuthCsdnRequest.java index 012eccc5cfbbc30d9b4cae7b2a79a0657042dd98..1320f46d77bfb14a4beb4f078950a669160af3d4 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthCsdnRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthCsdnRequest.java @@ -1,6 +1,5 @@ package me.zhyd.oauth.request; -import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpResponse; import com.alibaba.fastjson.JSONObject; import me.zhyd.oauth.config.AuthConfig; @@ -10,8 +9,6 @@ import me.zhyd.oauth.model.AuthCallback; import me.zhyd.oauth.model.AuthToken; import me.zhyd.oauth.model.AuthUser; import me.zhyd.oauth.model.AuthUserGender; -import me.zhyd.oauth.url.AuthCsdnUrlBuilder; -import me.zhyd.oauth.url.entity.AuthUserInfoEntity; /** * CSDN登录 @@ -24,13 +21,12 @@ import me.zhyd.oauth.url.entity.AuthUserInfoEntity; public class AuthCsdnRequest extends AuthDefaultRequest { public AuthCsdnRequest(AuthConfig config) { - super(config, AuthSource.CSDN, new AuthCsdnUrlBuilder()); + super(config, AuthSource.CSDN); } @Override protected AuthToken getAccessToken(AuthCallback authCallback) { - String accessTokenUrl = this.urlBuilder.getAccessTokenUrl(authCallback.getCode()); - HttpResponse response = HttpRequest.post(accessTokenUrl).execute(); + HttpResponse response = doPostAuthorizationCode(authCallback.getCode()); JSONObject accessTokenObject = JSONObject.parseObject(response.body()); if (accessTokenObject.containsKey("error_code")) { throw new AuthException("Unable to get token from csdn using code [" + authCallback.getCode() + "]: " + accessTokenObject); @@ -40,22 +36,19 @@ public class AuthCsdnRequest extends AuthDefaultRequest { @Override protected AuthUser getUserInfo(AuthToken authToken) { - String accessToken = authToken.getAccessToken(); - HttpResponse response = HttpRequest.get(this.urlBuilder.getUserInfoUrl(AuthUserInfoEntity.builder() - .accessToken(accessToken) - .build())).execute(); + HttpResponse response = doGetUserInfo(authToken); JSONObject object = JSONObject.parseObject(response.body()); if (object.containsKey("error_code")) { throw new AuthException(object.getString("error")); } return AuthUser.builder() - .uuid(object.getString("username")) - .username(object.getString("username")) - .remark(object.getString("description")) - .blog(object.getString("website")) - .gender(AuthUserGender.UNKNOWN) - .token(authToken) - .source(AuthSource.CSDN) - .build(); + .uuid(object.getString("username")) + .username(object.getString("username")) + .remark(object.getString("description")) + .blog(object.getString("website")) + .gender(AuthUserGender.UNKNOWN) + .token(authToken) + .source(AuthSource.CSDN) + .build(); } } diff --git a/src/main/java/me/zhyd/oauth/request/AuthDefaultRequest.java b/src/main/java/me/zhyd/oauth/request/AuthDefaultRequest.java index 065e4d1cebbf465d1663dc894383142694672a91..911b210714ebdc422065625dfc475ef5c905d7fe 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthDefaultRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthDefaultRequest.java @@ -1,17 +1,21 @@ package me.zhyd.oauth.request; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; import lombok.Data; 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.url.AuthDefaultUrlBuilder; import me.zhyd.oauth.utils.AuthChecker; +import me.zhyd.oauth.utils.StringUtils; +import me.zhyd.oauth.utils.UrlBuilder; /** * 默认的request处理类 * * @author yadong.zhang (yadong.zhang0415(a)gmail.com) + * @author yangkai.shen (https://xkcoding.com) * @version 1.0 * @since 1.8 */ @@ -19,7 +23,6 @@ import me.zhyd.oauth.utils.AuthChecker; public abstract class AuthDefaultRequest implements AuthRequest { protected AuthConfig config; protected AuthSource source; - protected AuthDefaultUrlBuilder urlBuilder; public AuthDefaultRequest(AuthConfig config, AuthSource source) { this.config = config; @@ -31,12 +34,6 @@ public abstract class AuthDefaultRequest implements AuthRequest { AuthChecker.checkConfig(config, source); } - public AuthDefaultRequest(AuthConfig config, AuthSource source, AuthDefaultUrlBuilder urlBuilder) { - this(config, source); - this.urlBuilder = urlBuilder; - this.urlBuilder.setAuthConfig(config); - } - protected abstract AuthToken getAccessToken(AuthCallback authCallback); protected abstract AuthUser getUserInfo(AuthToken authToken); @@ -70,6 +67,100 @@ public abstract class AuthDefaultRequest implements AuthRequest { */ @Override public String authorize() { - return this.urlBuilder.getAuthorizeUrl(); + return UrlBuilder.fromBaseUrl(source.authorize()) + .queryParam("response_type", "code") + .queryParam("client_id", config.getClientId()) + .queryParam("redirect_uri", config.getRedirectUri()) + .queryParam("state", getRealState(config.getState())) + .build(); + } + + /** + * 返回获取accessToken的url + * + * @return 返回获取accessToken的url + */ + protected String accessTokenUrl(String code) { + return UrlBuilder.fromBaseUrl(source.accessToken()) + .queryParam("code", code) + .queryParam("client_id", config.getClientId()) + .queryParam("client_secret", config.getClientSecret()) + .queryParam("grant_type", "authorization_code") + .queryParam("redirect_uri", config.getRedirectUri()) + .build(); + } + + /** + * 返回获取accessToken的url + * + * @return 返回获取accessToken的url + */ + protected String refreshTokenUrl(String refreshToken) { + return UrlBuilder.fromBaseUrl(source.refresh()) + .queryParam("client_id", config.getClientId()) + .queryParam("client_secret", config.getClientSecret()) + .queryParam("refresh_token", refreshToken) + .queryParam("grant_type", "refresh_token") + .queryParam("redirect_uri", config.getRedirectUri()) + .build(); + } + + /** + * 返回获取userInfo的url + * + * @return 返回获取userInfo的url + */ + protected String userInfoUrl(AuthToken authToken) { + return UrlBuilder.fromBaseUrl(source.userInfo()).queryParam("access_token", authToken.getAccessToken()).build(); + } + + /** + * 获取state,如果为空, 则默认去当前日期的时间戳 + * + * @param state 原始的state + * @return 返回不为null的state + */ + protected String getRealState(String state) { + return StringUtils.isEmpty(state) ? String.valueOf(System.currentTimeMillis()) : state; + } + + /** + * 通用的 authorizationCode 协议 + * + * @param code code码 + * @return HttpResponse + */ + protected HttpResponse doPostAuthorizationCode(String code) { + return HttpRequest.post(accessTokenUrl(code)).execute(); + } + + /** + * 通用的 authorizationCode 协议 + * + * @param code code码 + * @return HttpResponse + */ + protected HttpResponse doGetAuthorizationCode(String code) { + return HttpRequest.get(accessTokenUrl(code)).execute(); + } + + /** + * 通用的 用户信息 + * + * @param authToken token封装 + * @return HttpResponse + */ + protected HttpResponse doPostUserInfo(AuthToken authToken) { + return HttpRequest.post(userInfoUrl(authToken)).execute(); + } + + /** + * 通用的 用户信息 + * + * @param authToken token封装 + * @return HttpResponse + */ + protected HttpResponse doGetUserInfo(AuthToken authToken) { + return HttpRequest.get(userInfoUrl(authToken)).execute(); } } diff --git a/src/main/java/me/zhyd/oauth/request/AuthDingTalkRequest.java b/src/main/java/me/zhyd/oauth/request/AuthDingTalkRequest.java index 88f61de15cf9b07ca8b58b817e618db0f30e4f6c..a5b423c45e36188310596983babff7860d4ec12d 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthDingTalkRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthDingTalkRequest.java @@ -12,9 +12,8 @@ import me.zhyd.oauth.model.AuthCallback; import me.zhyd.oauth.model.AuthToken; import me.zhyd.oauth.model.AuthUser; import me.zhyd.oauth.model.AuthUserGender; -import me.zhyd.oauth.url.AuthDingtalkUrlBuilder; -import me.zhyd.oauth.url.entity.AuthUserInfoEntity; import me.zhyd.oauth.utils.GlobalAuthUtil; +import me.zhyd.oauth.utils.UrlBuilder; /** * 钉钉登录 @@ -26,7 +25,7 @@ import me.zhyd.oauth.utils.GlobalAuthUtil; public class AuthDingTalkRequest extends AuthDefaultRequest { public AuthDingTalkRequest(AuthConfig config) { - super(config, AuthSource.DINGTALK, new AuthDingtalkUrlBuilder()); + super(config, AuthSource.DINGTALK); } @Override @@ -37,17 +36,9 @@ public class AuthDingTalkRequest extends AuthDefaultRequest { @Override protected AuthUser getUserInfo(AuthToken authToken) { String code = authToken.getAccessCode(); - // 根据timestamp, appSecret计算签名值 - String timestamp = System.currentTimeMillis() + ""; - String urlEncodeSignature = GlobalAuthUtil.generateDingTalkSignature(config.getClientSecret(), timestamp); JSONObject param = new JSONObject(); param.put("tmp_auth_code", code); - HttpResponse response = HttpRequest.post(this.urlBuilder.getUserInfoUrl(AuthUserInfoEntity.builder() - .signature(urlEncodeSignature) - .timestamp(timestamp) - .clientId(config.getClientId()) - .build() - )).body(param.toJSONString()).execute(); + HttpResponse response = HttpRequest.post(userInfoUrl(authToken)).body(param.toJSONString()).execute(); String userInfo = response.body(); JSONObject object = JSON.parseObject(userInfo); AuthDingTalkErrorCode errorCode = AuthDingTalkErrorCode.getErrorCode(object.getIntValue("errcode")); @@ -56,16 +47,51 @@ public class AuthDingTalkRequest extends AuthDefaultRequest { } object = object.getJSONObject("user_info"); AuthToken token = AuthToken.builder() - .openId(object.getString("openid")) - .unionId(object.getString("unionid")) - .build(); + .openId(object.getString("openid")) + .unionId(object.getString("unionid")) + .build(); return AuthUser.builder() - .uuid(object.getString("unionid")) - .nickname(object.getString("nick")) - .username(object.getString("nick")) - .gender(AuthUserGender.UNKNOWN) - .source(AuthSource.DINGTALK) - .token(token) - .build(); + .uuid(object.getString("unionid")) + .nickname(object.getString("nick")) + .username(object.getString("nick")) + .gender(AuthUserGender.UNKNOWN) + .source(AuthSource.DINGTALK) + .token(token) + .build(); + } + + /** + * 返回认证url,可自行跳转页面 + * + * @return 返回授权地址 + */ + @Override + public String authorize() { + return UrlBuilder.fromBaseUrl(source.authorize()) + .queryParam("response_type", "code") + .queryParam("appid", config.getClientId()) + .queryParam("scope", "snsapi_login") + .queryParam("redirect_uri", config.getRedirectUri()) + .queryParam("state", getRealState(config.getState())) + .build(); + } + + /** + * 返回获取userInfo的url + * + * @param authToken + * @return 返回获取userInfo的url + */ + @Override + protected String userInfoUrl(AuthToken authToken) { + // 根据timestamp, appSecret计算签名值 + String timestamp = System.currentTimeMillis() + ""; + String urlEncodeSignature = GlobalAuthUtil.generateDingTalkSignature(config.getClientSecret(), timestamp); + + return UrlBuilder.fromBaseUrl(source.userInfo()) + .queryParam("signature", urlEncodeSignature) + .queryParam("timestamp", timestamp) + .queryParam("accessKey", config.getClientId()) + .build(); } } diff --git a/src/main/java/me/zhyd/oauth/request/AuthDouyinRequest.java b/src/main/java/me/zhyd/oauth/request/AuthDouyinRequest.java index feabc7522fc1403563fc6596b9ffd6170c1d221c..b5f1f62fa8a7488928066ff1d659010fd111b4d2 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthDouyinRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthDouyinRequest.java @@ -7,8 +7,7 @@ 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.url.AuthDouyinUrlBuilder; -import me.zhyd.oauth.url.entity.AuthUserInfoEntity; +import me.zhyd.oauth.utils.UrlBuilder; /** @@ -21,47 +20,39 @@ import me.zhyd.oauth.url.entity.AuthUserInfoEntity; public class AuthDouyinRequest extends AuthDefaultRequest { public AuthDouyinRequest(AuthConfig config) { - super(config, AuthSource.DOUYIN, new AuthDouyinUrlBuilder()); + super(config, AuthSource.DOUYIN); } @Override protected AuthToken getAccessToken(AuthCallback authCallback) { - String accessTokenUrl = this.urlBuilder.getAccessTokenUrl(authCallback.getCode()); - return this.getToken(accessTokenUrl); + return this.getToken(accessTokenUrl(authCallback.getCode())); } @Override protected AuthUser getUserInfo(AuthToken authToken) { - String accessToken = authToken.getAccessToken(); - String openId = authToken.getOpenId(); - String url = this.urlBuilder.getUserInfoUrl(AuthUserInfoEntity.builder() - .accessToken(accessToken) - .openId(openId) - .build()); - HttpResponse response = HttpRequest.get(url).execute(); + HttpResponse response = doGetUserInfo(authToken); JSONObject object = JSONObject.parseObject(response.body()); JSONObject userInfoObject = this.checkResponse(object); return AuthUser.builder() - .uuid(userInfoObject.getString("union_id")) - .username(userInfoObject.getString("nickname")) - .nickname(userInfoObject.getString("nickname")) - .avatar(userInfoObject.getString("avatar")) - .remark(userInfoObject.getString("description")) - .gender(AuthUserGender.UNKNOWN) - .token(authToken) - .source(AuthSource.DOUYIN) - .build(); + .uuid(userInfoObject.getString("union_id")) + .username(userInfoObject.getString("nickname")) + .nickname(userInfoObject.getString("nickname")) + .avatar(userInfoObject.getString("avatar")) + .remark(userInfoObject.getString("description")) + .gender(AuthUserGender.UNKNOWN) + .token(authToken) + .source(AuthSource.DOUYIN) + .build(); } @Override public AuthResponse refresh(AuthToken oldToken) { - String refreshTokenUrl = this.urlBuilder.getRefreshUrl(oldToken.getRefreshToken()); return AuthResponse.builder() - .code(AuthResponseStatus.SUCCESS.getCode()) - .data(this.getToken(refreshTokenUrl)) - .build(); + .code(AuthResponseStatus.SUCCESS.getCode()) + .data(refreshTokenUrl(oldToken.getRefreshToken())) + .build(); } /** @@ -93,11 +84,72 @@ public class AuthDouyinRequest extends AuthDefaultRequest { JSONObject accessTokenObject = this.checkResponse(object); return AuthToken.builder() - .accessToken(accessTokenObject.getString("access_token")) - .openId(accessTokenObject.getString("open_id")) - .expireIn(accessTokenObject.getIntValue("expires_in")) - .refreshToken(accessTokenObject.getString("refresh_token")) - .scope(accessTokenObject.getString("scope")) - .build(); + .accessToken(accessTokenObject.getString("access_token")) + .openId(accessTokenObject.getString("open_id")) + .expireIn(accessTokenObject.getIntValue("expires_in")) + .refreshToken(accessTokenObject.getString("refresh_token")) + .scope(accessTokenObject.getString("scope")) + .build(); + } + + /** + * 返回认证url,可自行跳转页面 + * + * @return 返回授权地址 + */ + @Override + public String authorize() { + return UrlBuilder.fromBaseUrl(source.authorize()) + .queryParam("response_type", "code") + .queryParam("client_key", config.getClientId()) + .queryParam("redirect_uri", config.getRedirectUri()) + .queryParam("state", getRealState(config.getState())) + .queryParam("scope", "user_info") + .build(); + } + + /** + * 返回获取accessToken的url + * + * @param code + * @return 返回获取accessToken的url + */ + @Override + protected String accessTokenUrl(String code) { + return UrlBuilder.fromBaseUrl(source.accessToken()) + .queryParam("code", code) + .queryParam("client_key", config.getClientId()) + .queryParam("client_secret", config.getClientSecret()) + .queryParam("grant_type", "authorization_code") + .build(); + } + + /** + * 返回获取userInfo的url + * + * @param authToken + * @return 返回获取userInfo的url + */ + @Override + protected String userInfoUrl(AuthToken authToken) { + return UrlBuilder.fromBaseUrl(source.userInfo()) + .queryParam("access_token", authToken.getAccessToken()) + .queryParam("open_id", authToken.getOpenId()) + .build(); + } + + /** + * 返回获取accessToken的url + * + * @param refreshToken + * @return 返回获取accessToken的url + */ + @Override + protected String refreshTokenUrl(String refreshToken) { + return UrlBuilder.fromBaseUrl(source.refresh()) + .queryParam("client_key", config.getClientId()) + .queryParam("refresh_token", refreshToken) + .queryParam("grant_type", "refresh_token") + .build(); } } diff --git a/src/main/java/me/zhyd/oauth/request/AuthFacebookRequest.java b/src/main/java/me/zhyd/oauth/request/AuthFacebookRequest.java index ccf32d3ed4210483447f9bc80487c8f781f348ff..fafc28054b44a47cc67acce40af8f0e224511037 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthFacebookRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthFacebookRequest.java @@ -1,6 +1,5 @@ package me.zhyd.oauth.request; -import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpResponse; import com.alibaba.fastjson.JSONObject; import me.zhyd.oauth.config.AuthConfig; @@ -10,8 +9,7 @@ import me.zhyd.oauth.model.AuthCallback; import me.zhyd.oauth.model.AuthToken; import me.zhyd.oauth.model.AuthUser; import me.zhyd.oauth.model.AuthUserGender; -import me.zhyd.oauth.url.AuthFacebookUrlBuilder; -import me.zhyd.oauth.url.entity.AuthUserInfoEntity; +import me.zhyd.oauth.utils.UrlBuilder; /** * Facebook登录 @@ -23,13 +21,12 @@ import me.zhyd.oauth.url.entity.AuthUserInfoEntity; public class AuthFacebookRequest extends AuthDefaultRequest { public AuthFacebookRequest(AuthConfig config) { - super(config, AuthSource.FACEBOOK, new AuthFacebookUrlBuilder()); + super(config, AuthSource.FACEBOOK); } @Override protected AuthToken getAccessToken(AuthCallback authCallback) { - String accessTokenUrl = this.urlBuilder.getAccessTokenUrl(authCallback.getCode()); - HttpResponse response = HttpRequest.post(accessTokenUrl).execute(); + HttpResponse response = doPostAuthorizationCode(authCallback.getCode()); JSONObject accessTokenObject = JSONObject.parseObject(response.body()); if (accessTokenObject.containsKey("error")) { @@ -37,18 +34,15 @@ public class AuthFacebookRequest extends AuthDefaultRequest { } return AuthToken.builder() - .accessToken(accessTokenObject.getString("access_token")) - .expireIn(accessTokenObject.getIntValue("expires_in")) - .tokenType(accessTokenObject.getString("token_type")) - .build(); + .accessToken(accessTokenObject.getString("access_token")) + .expireIn(accessTokenObject.getIntValue("expires_in")) + .tokenType(accessTokenObject.getString("token_type")) + .build(); } @Override protected AuthUser getUserInfo(AuthToken authToken) { - String accessToken = authToken.getAccessToken(); - HttpResponse response = HttpRequest.get(this.urlBuilder.getUserInfoUrl(AuthUserInfoEntity.builder() - .accessToken(accessToken) - .build())).execute(); + HttpResponse response = doGetUserInfo(authToken); String userInfo = response.body(); JSONObject object = JSONObject.parseObject(userInfo); if (object.containsKey("error")) { @@ -63,15 +57,29 @@ public class AuthFacebookRequest extends AuthDefaultRequest { } } return AuthUser.builder() - .uuid(object.getString("id")) - .username(object.getString("name")) - .nickname(object.getString("name")) - .avatar(picture) - .location(object.getString("locale")) - .email(object.getString("email")) - .gender(AuthUserGender.getRealGender(object.getString("gender"))) - .token(authToken) - .source(AuthSource.FACEBOOK) - .build(); + .uuid(object.getString("id")) + .username(object.getString("name")) + .nickname(object.getString("name")) + .avatar(picture) + .location(object.getString("locale")) + .email(object.getString("email")) + .gender(AuthUserGender.getRealGender(object.getString("gender"))) + .token(authToken) + .source(AuthSource.FACEBOOK) + .build(); + } + + /** + * 返回获取userInfo的url + * + * @param authToken + * @return 返回获取userInfo的url + */ + @Override + protected String userInfoUrl(AuthToken authToken) { + return UrlBuilder.fromBaseUrl(source.userInfo()) + .queryParam("access_token", authToken.getAccessToken()) + .queryParam("fields", "id,name,birthday,gender,hometown,email,devices,picture.width(400)") + .build(); } } diff --git a/src/main/java/me/zhyd/oauth/request/AuthGiteeRequest.java b/src/main/java/me/zhyd/oauth/request/AuthGiteeRequest.java index 88db0cdc6922cd3a995147f3e1a24469e53a637f..409b516c701b41c887dcfc9893e85990ea66b36c 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthGiteeRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthGiteeRequest.java @@ -1,6 +1,5 @@ package me.zhyd.oauth.request; -import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpResponse; import com.alibaba.fastjson.JSONObject; import me.zhyd.oauth.config.AuthConfig; @@ -10,8 +9,6 @@ import me.zhyd.oauth.model.AuthCallback; import me.zhyd.oauth.model.AuthToken; import me.zhyd.oauth.model.AuthUser; import me.zhyd.oauth.model.AuthUserGender; -import me.zhyd.oauth.url.AuthGiteeUrlBuilder; -import me.zhyd.oauth.url.entity.AuthUserInfoEntity; /** * Gitee登录 @@ -23,13 +20,12 @@ import me.zhyd.oauth.url.entity.AuthUserInfoEntity; public class AuthGiteeRequest extends AuthDefaultRequest { public AuthGiteeRequest(AuthConfig config) { - super(config, AuthSource.GITEE, new AuthGiteeUrlBuilder()); + super(config, AuthSource.GITEE); } @Override protected AuthToken getAccessToken(AuthCallback authCallback) { - String accessTokenUrl = this.urlBuilder.getAccessTokenUrl(authCallback.getCode()); - HttpResponse response = HttpRequest.post(accessTokenUrl).execute(); + HttpResponse response = doPostAuthorizationCode(authCallback.getCode()); JSONObject accessTokenObject = JSONObject.parseObject(response.body()); if (accessTokenObject.containsKey("error")) { throw new AuthException("Unable to get token from gitee using code [" + authCallback.getCode() + "]: " + accessTokenObject); @@ -39,25 +35,22 @@ public class AuthGiteeRequest extends AuthDefaultRequest { @Override protected AuthUser getUserInfo(AuthToken authToken) { - String accessToken = authToken.getAccessToken(); - HttpResponse response = HttpRequest.get(this.urlBuilder.getUserInfoUrl(AuthUserInfoEntity.builder() - .accessToken(accessToken) - .build())).execute(); + HttpResponse response = doGetUserInfo(authToken); String userInfo = response.body(); JSONObject object = JSONObject.parseObject(userInfo); return AuthUser.builder() - .uuid(object.getString("id")) - .username(object.getString("login")) - .avatar(object.getString("avatar_url")) - .blog(object.getString("blog")) - .nickname(object.getString("name")) - .company(object.getString("company")) - .location(object.getString("address")) - .email(object.getString("email")) - .remark(object.getString("bio")) - .gender(AuthUserGender.UNKNOWN) - .token(authToken) - .source(AuthSource.GITEE) - .build(); + .uuid(object.getString("id")) + .username(object.getString("login")) + .avatar(object.getString("avatar_url")) + .blog(object.getString("blog")) + .nickname(object.getString("name")) + .company(object.getString("company")) + .location(object.getString("address")) + .email(object.getString("email")) + .remark(object.getString("bio")) + .gender(AuthUserGender.UNKNOWN) + .token(authToken) + .source(AuthSource.GITEE) + .build(); } } diff --git a/src/main/java/me/zhyd/oauth/request/AuthGithubRequest.java b/src/main/java/me/zhyd/oauth/request/AuthGithubRequest.java index 5bccd1e220437cc21f55a1ac973fe06421d3e4f0..7763f40e52f2e7bc24217ad499f33087dda798a9 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthGithubRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthGithubRequest.java @@ -1,6 +1,5 @@ package me.zhyd.oauth.request; -import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpResponse; import com.alibaba.fastjson.JSONObject; import me.zhyd.oauth.config.AuthConfig; @@ -10,8 +9,6 @@ import me.zhyd.oauth.model.AuthCallback; import me.zhyd.oauth.model.AuthToken; import me.zhyd.oauth.model.AuthUser; import me.zhyd.oauth.model.AuthUserGender; -import me.zhyd.oauth.url.AuthGithubUrlBuilder; -import me.zhyd.oauth.url.entity.AuthUserInfoEntity; import me.zhyd.oauth.utils.GlobalAuthUtil; import java.util.Map; @@ -26,13 +23,12 @@ import java.util.Map; public class AuthGithubRequest extends AuthDefaultRequest { public AuthGithubRequest(AuthConfig config) { - super(config, AuthSource.GITHUB, new AuthGithubUrlBuilder()); + super(config, AuthSource.GITHUB); } @Override protected AuthToken getAccessToken(AuthCallback authCallback) { - String accessTokenUrl = this.urlBuilder.getAccessTokenUrl(authCallback.getCode()); - HttpResponse response = HttpRequest.post(accessTokenUrl).execute(); + HttpResponse response = doPostAuthorizationCode(authCallback.getCode()); Map res = GlobalAuthUtil.parseStringToMap(response.body()); if (res.containsKey("error")) { throw new AuthException(res.get("error") + ":" + res.get("error_description")); @@ -42,25 +38,22 @@ public class AuthGithubRequest extends AuthDefaultRequest { @Override protected AuthUser getUserInfo(AuthToken authToken) { - String accessToken = authToken.getAccessToken(); - HttpResponse response = HttpRequest.get(this.urlBuilder.getUserInfoUrl(AuthUserInfoEntity.builder() - .accessToken(accessToken) - .build())).execute(); + HttpResponse response = doGetUserInfo(authToken); String userInfo = response.body(); JSONObject object = JSONObject.parseObject(userInfo); return AuthUser.builder() - .uuid(object.getString("id")) - .username(object.getString("login")) - .avatar(object.getString("avatar_url")) - .blog(object.getString("blog")) - .nickname(object.getString("name")) - .company(object.getString("company")) - .location(object.getString("location")) - .email(object.getString("email")) - .remark(object.getString("bio")) - .gender(AuthUserGender.UNKNOWN) - .token(authToken) - .source(AuthSource.GITHUB) - .build(); + .uuid(object.getString("id")) + .username(object.getString("login")) + .avatar(object.getString("avatar_url")) + .blog(object.getString("blog")) + .nickname(object.getString("name")) + .company(object.getString("company")) + .location(object.getString("location")) + .email(object.getString("email")) + .remark(object.getString("bio")) + .gender(AuthUserGender.UNKNOWN) + .token(authToken) + .source(AuthSource.GITHUB) + .build(); } } diff --git a/src/main/java/me/zhyd/oauth/request/AuthGoogleRequest.java b/src/main/java/me/zhyd/oauth/request/AuthGoogleRequest.java index 62ed5f0a1f1c06638fa40bab199511a48ec31811..9c7aee90f44e796ed2e158658f75124df7b7e4c9 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthGoogleRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthGoogleRequest.java @@ -1,6 +1,5 @@ package me.zhyd.oauth.request; -import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpResponse; import com.alibaba.fastjson.JSONObject; import me.zhyd.oauth.config.AuthConfig; @@ -10,8 +9,7 @@ import me.zhyd.oauth.model.AuthCallback; import me.zhyd.oauth.model.AuthToken; import me.zhyd.oauth.model.AuthUser; import me.zhyd.oauth.model.AuthUserGender; -import me.zhyd.oauth.url.AuthGoogleUrlBuilder; -import me.zhyd.oauth.url.entity.AuthUserInfoEntity; +import me.zhyd.oauth.utils.UrlBuilder; /** * Google登录 @@ -23,47 +21,70 @@ import me.zhyd.oauth.url.entity.AuthUserInfoEntity; public class AuthGoogleRequest extends AuthDefaultRequest { public AuthGoogleRequest(AuthConfig config) { - super(config, AuthSource.GOOGLE, new AuthGoogleUrlBuilder()); + super(config, AuthSource.GOOGLE); } @Override protected AuthToken getAccessToken(AuthCallback authCallback) { - String accessTokenUrl = this.urlBuilder.getAccessTokenUrl(authCallback.getCode()); - HttpResponse response = HttpRequest.post(accessTokenUrl).execute(); + HttpResponse response = doPostAuthorizationCode(authCallback.getCode()); JSONObject accessTokenObject = JSONObject.parseObject(response.body()); if (accessTokenObject.containsKey("error") || accessTokenObject.containsKey("error_description")) { throw new AuthException("get google access_token has error:[" + accessTokenObject.getString("error") + "], error_description:[" + accessTokenObject - .getString("error_description") + "]"); + .getString("error_description") + "]"); } return AuthToken.builder() - .accessToken(accessTokenObject.getString("access_token")) - .expireIn(accessTokenObject.getIntValue("expires_in")) - .scope(accessTokenObject.getString("scope")) - .tokenType(accessTokenObject.getString("token_type")) - .idToken(accessTokenObject.getString("id_token")) - .build(); + .accessToken(accessTokenObject.getString("access_token")) + .expireIn(accessTokenObject.getIntValue("expires_in")) + .scope(accessTokenObject.getString("scope")) + .tokenType(accessTokenObject.getString("token_type")) + .idToken(accessTokenObject.getString("id_token")) + .build(); } @Override protected AuthUser getUserInfo(AuthToken authToken) { - String accessToken = authToken.getIdToken(); - HttpResponse response = HttpRequest.get(this.urlBuilder.getUserInfoUrl(AuthUserInfoEntity.builder() - .accessToken(accessToken) - .build())).execute(); + HttpResponse response = doGetUserInfo(authToken); String userInfo = response.body(); JSONObject object = JSONObject.parseObject(userInfo); return AuthUser.builder() - .uuid(object.getString("sub")) - .username(object.getString("name")) - .avatar(object.getString("picture")) - .nickname(object.getString("name")) - .location(object.getString("locale")) - .email(object.getString("email")) - .gender(AuthUserGender.UNKNOWN) - .token(authToken) - .source(AuthSource.GOOGLE) - .build(); + .uuid(object.getString("sub")) + .username(object.getString("name")) + .avatar(object.getString("picture")) + .nickname(object.getString("name")) + .location(object.getString("locale")) + .email(object.getString("email")) + .gender(AuthUserGender.UNKNOWN) + .token(authToken) + .source(AuthSource.GOOGLE) + .build(); + } + + /** + * 返回认证url,可自行跳转页面 + * + * @return 返回授权地址 + */ + @Override + public String authorize() { + return UrlBuilder.fromBaseUrl(source.authorize()) + .queryParam("response_type", "code") + .queryParam("client_id", config.getClientId()) + .queryParam("scope", "openid%20email%20profile") + .queryParam("redirect_uri", config.getRedirectUri()) + .queryParam("state", getRealState(config.getState())) + .build(); + } + + /** + * 返回获取userInfo的url + * + * @param authToken + * @return 返回获取userInfo的url + */ + @Override + protected String userInfoUrl(AuthToken authToken) { + return UrlBuilder.fromBaseUrl(source.userInfo()).queryParam("id_token", authToken.getAccessToken()).build(); } } diff --git a/src/main/java/me/zhyd/oauth/request/AuthLinkedinRequest.java b/src/main/java/me/zhyd/oauth/request/AuthLinkedinRequest.java index 110647f98f70b55b022c4cbafd9ac78cda675e22..c044a0d141dbcc62e5682feaf586dbcdd563741e 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthLinkedinRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthLinkedinRequest.java @@ -8,9 +8,8 @@ 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.url.AuthLinkedinUrlBuilder; -import me.zhyd.oauth.url.entity.AuthUserInfoEntity; import me.zhyd.oauth.utils.StringUtils; +import me.zhyd.oauth.utils.UrlBuilder; /** @@ -23,23 +22,22 @@ import me.zhyd.oauth.utils.StringUtils; public class AuthLinkedinRequest extends AuthDefaultRequest { public AuthLinkedinRequest(AuthConfig config) { - super(config, AuthSource.LINKEDIN, new AuthLinkedinUrlBuilder()); + super(config, AuthSource.LINKEDIN); } @Override protected AuthToken getAccessToken(AuthCallback authCallback) { - String accessTokenUrl = this.urlBuilder.getAccessTokenUrl(authCallback.getCode()); - return this.getToken(accessTokenUrl); + return this.getToken(accessTokenUrl(authCallback.getCode())); } @Override protected AuthUser getUserInfo(AuthToken authToken) { String accessToken = authToken.getAccessToken(); - HttpResponse response = HttpRequest.get(this.urlBuilder.getUserInfoUrl(AuthUserInfoEntity.builder().build())) - .header("Host", "api.linkedin.com") - .header("Connection", "Keep-Alive") - .header("Authorization", "Bearer " + accessToken) - .execute(); + HttpResponse response = HttpRequest.get(userInfoUrl(authToken)) + .header("Host", "api.linkedin.com") + .header("Connection", "Keep-Alive") + .header("Authorization", "Bearer " + accessToken) + .execute(); JSONObject userInfoObject = JSONObject.parseObject(response.body()); this.checkResponse(userInfoObject); @@ -65,7 +63,7 @@ public class AuthLinkedinRequest extends AuthDefaultRequest { JSONObject profilePictureObject = userInfoObject.getJSONObject("profilePicture"); if (profilePictureObject.containsKey("displayImage~")) { JSONArray displayImageElements = profilePictureObject.getJSONObject("displayImage~") - .getJSONArray("elements"); + .getJSONArray("elements"); if (null != displayImageElements && displayImageElements.size() > 0) { JSONObject largestImageObj = displayImageElements.getJSONObject(displayImageElements.size() - 1); avatar = largestImageObj.getJSONArray("identifiers").getJSONObject(0).getString("identifier"); @@ -75,31 +73,31 @@ public class AuthLinkedinRequest extends AuthDefaultRequest { // 获取用户邮箱地址 String email = this.getUserEmail(accessToken); return AuthUser.builder() - .uuid(userInfoObject.getString("id")) - .username(userName) - .nickname(userName) - .avatar(avatar) - .email(email) - .token(authToken) - .gender(AuthUserGender.UNKNOWN) - .source(AuthSource.LINKEDIN) - .build(); + .uuid(userInfoObject.getString("id")) + .username(userName) + .nickname(userName) + .avatar(avatar) + .email(email) + .token(authToken) + .gender(AuthUserGender.UNKNOWN) + .source(AuthSource.LINKEDIN) + .build(); } private String getUserEmail(String accessToken) { String email = null; HttpResponse emailResponse = HttpRequest.get("https://api.linkedin.com/v2/emailAddress?q=members&projection=(elements*(handle~))") - .header("Host", "api.linkedin.com") - .header("Connection", "Keep-Alive") - .header("Authorization", "Bearer " + accessToken) - .execute(); + .header("Host", "api.linkedin.com") + .header("Connection", "Keep-Alive") + .header("Authorization", "Bearer " + accessToken) + .execute(); System.out.println(emailResponse.body()); JSONObject emailObj = JSONObject.parseObject(emailResponse.body()); if (emailObj.containsKey("elements")) { email = emailObj.getJSONArray("elements") - .getJSONObject(0) - .getJSONObject("handle~") - .getString("emailAddress"); + .getJSONObject(0) + .getJSONObject("handle~") + .getString("emailAddress"); } return email; } @@ -115,14 +113,15 @@ public class AuthLinkedinRequest extends AuthDefaultRequest { @Override public AuthResponse refresh(AuthToken oldToken) { - if (StringUtils.isEmpty(oldToken.getRefreshToken())) { + String refreshToken = oldToken.getRefreshToken(); + if (StringUtils.isEmpty(refreshToken)) { throw new AuthException(AuthResponseStatus.UNSUPPORTED); } - String refreshTokenUrl = this.urlBuilder.getRefreshUrl(oldToken.getRefreshToken()); + String refreshTokenUrl = refreshTokenUrl(refreshToken); return AuthResponse.builder() - .code(AuthResponseStatus.SUCCESS.getCode()) - .data(this.getToken(refreshTokenUrl)) - .build(); + .code(AuthResponseStatus.SUCCESS.getCode()) + .data(this.getToken(refreshTokenUrl)) + .build(); } private void checkResponse(JSONObject userInfoObject) { @@ -139,18 +138,47 @@ public class AuthLinkedinRequest extends AuthDefaultRequest { */ private AuthToken getToken(String accessTokenUrl) { HttpResponse response = HttpRequest.post(accessTokenUrl) - .header("Host", "www.linkedin.com") - .header("Content-Type", "application/x-www-form-urlencoded") - .execute(); + .header("Host", "www.linkedin.com") + .header("Content-Type", "application/x-www-form-urlencoded") + .execute(); String accessTokenStr = response.body(); JSONObject accessTokenObject = JSONObject.parseObject(accessTokenStr); this.checkResponse(accessTokenObject); return AuthToken.builder() - .accessToken(accessTokenObject.getString("access_token")) - .expireIn(accessTokenObject.getIntValue("expires_in")) - .refreshToken(accessTokenObject.getString("refresh_token")) - .build(); + .accessToken(accessTokenObject.getString("access_token")) + .expireIn(accessTokenObject.getIntValue("expires_in")) + .refreshToken(accessTokenObject.getString("refresh_token")) + .build(); + } + + /** + * 返回认证url,可自行跳转页面 + * + * @return 返回授权地址 + */ + @Override + public String authorize() { + return UrlBuilder.fromBaseUrl(source.authorize()) + .queryParam("response_type", "code") + .queryParam("client_id", config.getClientId()) + .queryParam("redirect_uri", config.getRedirectUri()) + .queryParam("state", getRealState(config.getState())) + .queryParam("scope", "r_liteprofile%20r_emailaddress%20w_member_social") + .build(); + } + + /** + * 返回获取userInfo的url + * + * @param authToken + * @return 返回获取userInfo的url + */ + @Override + protected String userInfoUrl(AuthToken authToken) { + return UrlBuilder.fromBaseUrl(source.userInfo()) + .queryParam("projection", "(id,firstName,lastName,profilePicture(displayImage~:playableStreams))") + .build(); } } diff --git a/src/main/java/me/zhyd/oauth/request/AuthMiRequest.java b/src/main/java/me/zhyd/oauth/request/AuthMiRequest.java index 296b17cfe3ca4751f4d496bd6f8039f61c2d0b5e..337d298d8d663d4ef95376e5833ff6b589900cc0 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthMiRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthMiRequest.java @@ -9,8 +9,7 @@ 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.url.AuthMiUrlBuilder; -import me.zhyd.oauth.url.entity.AuthUserInfoEntity; +import me.zhyd.oauth.utils.UrlBuilder; import java.text.MessageFormat; @@ -26,13 +25,12 @@ public class AuthMiRequest extends AuthDefaultRequest { private static final String PREFIX = "&&&START&&&"; public AuthMiRequest(AuthConfig config) { - super(config, AuthSource.MI, new AuthMiUrlBuilder()); + super(config, AuthSource.MI); } @Override protected AuthToken getAccessToken(AuthCallback authCallback) { - String accessTokenUrl = this.urlBuilder.getAccessTokenUrl(authCallback.getCode()); - return getToken(accessTokenUrl); + return getToken(accessTokenUrl(authCallback.getCode())); } private AuthToken getToken(String accessTokenUrl) { @@ -45,25 +43,21 @@ public class AuthMiRequest extends AuthDefaultRequest { } return AuthToken.builder() - .accessToken(accessTokenObject.getString("access_token")) - .expireIn(accessTokenObject.getIntValue("expires_in")) - .scope(accessTokenObject.getString("scope")) - .tokenType(accessTokenObject.getString("token_type")) - .refreshToken(accessTokenObject.getString("refresh_token")) - .openId(accessTokenObject.getString("openId")) - .macAlgorithm(accessTokenObject.getString("mac_algorithm")) - .macKey(accessTokenObject.getString("mac_key")) - .build(); + .accessToken(accessTokenObject.getString("access_token")) + .expireIn(accessTokenObject.getIntValue("expires_in")) + .scope(accessTokenObject.getString("scope")) + .tokenType(accessTokenObject.getString("token_type")) + .refreshToken(accessTokenObject.getString("refresh_token")) + .openId(accessTokenObject.getString("openId")) + .macAlgorithm(accessTokenObject.getString("mac_algorithm")) + .macKey(accessTokenObject.getString("mac_key")) + .build(); } @Override protected AuthUser getUserInfo(AuthToken authToken) { // 获取用户信息 - HttpResponse userResponse = HttpRequest.get(this.urlBuilder.getUserInfoUrl(AuthUserInfoEntity.builder() - .clientId(config.getClientId()) - .accessToken(authToken.getAccessToken()) - .build())) - .execute(); + HttpResponse userResponse = doGetUserInfo(authToken); JSONObject userProfile = JSONObject.parseObject(userResponse.body()); if ("error".equalsIgnoreCase(userProfile.getString("result"))) { @@ -73,19 +67,19 @@ public class AuthMiRequest extends AuthDefaultRequest { JSONObject user = userProfile.getJSONObject("data"); AuthUser authUser = AuthUser.builder() - .uuid(authToken.getOpenId()) - .username(user.getString("miliaoNick")) - .nickname(user.getString("miliaoNick")) - .avatar(user.getString("miliaoIcon")) - .email(user.getString("mail")) - .gender(AuthUserGender.UNKNOWN) - .token(authToken) - .source(AuthSource.MI) - .build(); + .uuid(authToken.getOpenId()) + .username(user.getString("miliaoNick")) + .nickname(user.getString("miliaoNick")) + .avatar(user.getString("miliaoIcon")) + .email(user.getString("mail")) + .gender(AuthUserGender.UNKNOWN) + .token(authToken) + .source(AuthSource.MI) + .build(); // 获取用户邮箱手机号等信息 String emailPhoneUrl = MessageFormat.format("{0}?clientId={1}&token={2}", "https://open.account.xiaomi.com/user/phoneAndEmail", config - .getClientId(), authToken.getAccessToken()); + .getClientId(), authToken.getAccessToken()); HttpResponse emailResponse = HttpRequest.get(emailPhoneUrl).execute(); JSONObject userEmailPhone = JSONObject.parseObject(emailResponse.body()); @@ -107,8 +101,40 @@ public class AuthMiRequest extends AuthDefaultRequest { */ @Override public AuthResponse refresh(AuthToken authToken) { - String miRefreshUrl = this.urlBuilder.getRefreshUrl(authToken.getRefreshToken()); + return AuthResponse.builder() + .code(AuthResponseStatus.SUCCESS.getCode()) + .data(getToken(refreshTokenUrl(authToken.getRefreshToken()))) + .build(); + } - return AuthResponse.builder().code(AuthResponseStatus.SUCCESS.getCode()).data(getToken(miRefreshUrl)).build(); + /** + * 返回认证url,可自行跳转页面 + * + * @return 返回授权地址 + */ + @Override + public String authorize() { + return UrlBuilder.fromBaseUrl(source.authorize()) + .queryParam("response_type", "code") + .queryParam("client_id", config.getClientId()) + .queryParam("redirect_uri", config.getRedirectUri()) + .queryParam("state", getRealState(config.getState())) + .queryParam("scope", "user/profile%20user/openIdV2%20user/phoneAndEmail") + .queryParam("skip_confirm", "false") + .build(); + } + + /** + * 返回获取userInfo的url + * + * @param authToken + * @return 返回获取userInfo的url + */ + @Override + protected String userInfoUrl(AuthToken authToken) { + return UrlBuilder.fromBaseUrl(source.userInfo()) + .queryParam("clientId", config.getClientId()) + .queryParam("token", authToken.getAccessToken()) + .build(); } } diff --git a/src/main/java/me/zhyd/oauth/request/AuthMicrosoftRequest.java b/src/main/java/me/zhyd/oauth/request/AuthMicrosoftRequest.java index da30f93c2199202e0eb68dba1f0a869b72693452..993e7f70ee16e953463fb5e5e2faf339f7482f55 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthMicrosoftRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthMicrosoftRequest.java @@ -8,8 +8,7 @@ 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.url.AuthMicrosoftUrlBuilder; -import me.zhyd.oauth.url.entity.AuthUserInfoEntity; +import me.zhyd.oauth.utils.UrlBuilder; import java.util.HashMap; import java.util.Map; @@ -23,14 +22,12 @@ import java.util.Map; */ public class AuthMicrosoftRequest extends AuthDefaultRequest { public AuthMicrosoftRequest(AuthConfig config) { - super(config, AuthSource.MICROSOFT, new AuthMicrosoftUrlBuilder()); + super(config, AuthSource.MICROSOFT); } @Override protected AuthToken getAccessToken(AuthCallback authCallback) { - String accessTokenUrl = this.urlBuilder.getAccessTokenUrl(authCallback.getCode()); - - return getToken(accessTokenUrl); + return getToken(accessTokenUrl(authCallback.getCode())); } /** @@ -43,22 +40,22 @@ public class AuthMicrosoftRequest extends AuthDefaultRequest { Map paramMap = new HashMap<>(6); HttpUtil.decodeParamMap(accessTokenUrl, "UTF-8").forEach(paramMap::put); HttpResponse response = HttpRequest.post(accessTokenUrl) - .header("Host", "https://login.microsoftonline.com") - .header("Content-Type", "application/x-www-form-urlencoded") - .form(paramMap) - .execute(); + .header("Host", "https://login.microsoftonline.com") + .header("Content-Type", "application/x-www-form-urlencoded") + .form(paramMap) + .execute(); String accessTokenStr = response.body(); JSONObject accessTokenObject = JSONObject.parseObject(accessTokenStr); this.checkResponse(accessTokenObject); return AuthToken.builder() - .accessToken(accessTokenObject.getString("access_token")) - .expireIn(accessTokenObject.getIntValue("expires_in")) - .scope(accessTokenObject.getString("scope")) - .tokenType(accessTokenObject.getString("token_type")) - .refreshToken(accessTokenObject.getString("refresh_token")) - .build(); + .accessToken(accessTokenObject.getString("access_token")) + .expireIn(accessTokenObject.getIntValue("expires_in")) + .scope(accessTokenObject.getString("scope")) + .tokenType(accessTokenObject.getString("token_type")) + .refreshToken(accessTokenObject.getString("refresh_token")) + .build(); } private void checkResponse(JSONObject response) { @@ -72,21 +69,19 @@ public class AuthMicrosoftRequest extends AuthDefaultRequest { String token = authToken.getAccessToken(); String tokenType = authToken.getTokenType(); String jwt = tokenType + " " + token; - HttpResponse response = HttpRequest.get(this.urlBuilder.getUserInfoUrl(AuthUserInfoEntity.builder().build())) - .header("Authorization", jwt) - .execute(); + HttpResponse response = HttpRequest.get(userInfoUrl(authToken)).header("Authorization", jwt).execute(); String userInfo = response.body(); JSONObject object = JSONObject.parseObject(userInfo); return AuthUser.builder() - .uuid(object.getString("id")) - .username(object.getString("userPrincipalName")) - .nickname(object.getString("displayName")) - .location(object.getString("officeLocation")) - .email(object.getString("mail")) - .gender(AuthUserGender.UNKNOWN) - .token(authToken) - .source(AuthSource.MICROSOFT) - .build(); + .uuid(object.getString("id")) + .username(object.getString("userPrincipalName")) + .nickname(object.getString("displayName")) + .location(object.getString("officeLocation")) + .email(object.getString("mail")) + .gender(AuthUserGender.UNKNOWN) + .token(authToken) + .source(AuthSource.MICROSOFT) + .build(); } /** @@ -97,8 +92,73 @@ public class AuthMicrosoftRequest extends AuthDefaultRequest { */ @Override public AuthResponse refresh(AuthToken authToken) { - String refreshTokenUrl = this.urlBuilder.getRefreshUrl(authToken.getRefreshToken()); + return AuthResponse.builder() + .code(AuthResponseStatus.SUCCESS.getCode()) + .data(getToken(refreshTokenUrl(authToken.getRefreshToken()))) + .build(); + } + + /** + * 返回认证url,可自行跳转页面 + * + * @return 返回授权地址 + */ + @Override + public String authorize() { + return UrlBuilder.fromBaseUrl(source.authorize()) + .queryParam("response_type", "code") + .queryParam("client_id", config.getClientId()) + .queryParam("redirect_uri", config.getRedirectUri()) + .queryParam("response_mode", "query") + .queryParam("scope", "offline_access%20user.read%20mail.read") + .queryParam("state", getRealState(config.getState())) + .build(); + } + + /** + * 返回获取accessToken的url + * + * @param code + * @return 返回获取accessToken的url + */ + @Override + protected String accessTokenUrl(String code) { + return UrlBuilder.fromBaseUrl(source.accessToken()) + .queryParam("code", code) + .queryParam("client_id", config.getClientId()) + .queryParam("client_secret", config.getClientSecret()) + .queryParam("grant_type", "authorization_code") + .queryParam("scope", "user.read%20mail.read") + .queryParam("redirect_uri", config.getRedirectUri()) + .build(); + } + + /** + * 返回获取userInfo的url + * + * @param authToken + * @return 返回获取userInfo的url + */ + @Override + protected String userInfoUrl(AuthToken authToken) { + return UrlBuilder.fromBaseUrl(source.userInfo()).build(); + } - return AuthResponse.builder().code(AuthResponseStatus.SUCCESS.getCode()).data(getToken(refreshTokenUrl)).build(); + /** + * 返回获取accessToken的url + * + * @param refreshToken + * @return 返回获取accessToken的url + */ + @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) + .queryParam("grant_type", "refresh_token") + .queryParam("scope", "user.read%20mail.read") + .queryParam("redirect_uri", config.getRedirectUri()) + .build(); } } diff --git a/src/main/java/me/zhyd/oauth/request/AuthOschinaRequest.java b/src/main/java/me/zhyd/oauth/request/AuthOschinaRequest.java index 975ae5ac95404f5f17f5a59e72e59dbe68e9c7a4..945ff6a39e92f7292b3732059e2293ae6dcac640 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthOschinaRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthOschinaRequest.java @@ -1,6 +1,5 @@ package me.zhyd.oauth.request; -import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpResponse; import com.alibaba.fastjson.JSONObject; import me.zhyd.oauth.config.AuthConfig; @@ -10,8 +9,7 @@ import me.zhyd.oauth.model.AuthCallback; import me.zhyd.oauth.model.AuthToken; import me.zhyd.oauth.model.AuthUser; import me.zhyd.oauth.model.AuthUserGender; -import me.zhyd.oauth.url.AuthOschinaUrlBuilder; -import me.zhyd.oauth.url.entity.AuthUserInfoEntity; +import me.zhyd.oauth.utils.UrlBuilder; /** * oschina登录 @@ -23,46 +21,74 @@ import me.zhyd.oauth.url.entity.AuthUserInfoEntity; public class AuthOschinaRequest extends AuthDefaultRequest { public AuthOschinaRequest(AuthConfig config) { - super(config, AuthSource.OSCHINA, new AuthOschinaUrlBuilder()); + super(config, AuthSource.OSCHINA); } @Override protected AuthToken getAccessToken(AuthCallback authCallback) { - String accessTokenUrl = this.urlBuilder.getAccessTokenUrl(authCallback.getCode()); - HttpResponse response = HttpRequest.post(accessTokenUrl).execute(); + HttpResponse response = doPostAuthorizationCode(authCallback.getCode()); JSONObject accessTokenObject = JSONObject.parseObject(response.body()); if (accessTokenObject.containsKey("error")) { throw new AuthException("Unable to get token from oschina using code [" + authCallback.getCode() + "]: " + accessTokenObject); } return AuthToken.builder() - .accessToken(accessTokenObject.getString("access_token")) - .refreshToken(accessTokenObject.getString("refresh_token")) - .uid(accessTokenObject.getString("uid")) - .expireIn(accessTokenObject.getIntValue("expires_in")) - .build(); + .accessToken(accessTokenObject.getString("access_token")) + .refreshToken(accessTokenObject.getString("refresh_token")) + .uid(accessTokenObject.getString("uid")) + .expireIn(accessTokenObject.getIntValue("expires_in")) + .build(); } @Override protected AuthUser getUserInfo(AuthToken authToken) { - String accessToken = authToken.getAccessToken(); - HttpResponse response = HttpRequest.get(this.urlBuilder.getUserInfoUrl(AuthUserInfoEntity.builder() - .accessToken(accessToken) - .build())).execute(); + HttpResponse response = doGetUserInfo(authToken); JSONObject object = JSONObject.parseObject(response.body()); if (object.containsKey("error")) { throw new AuthException(object.getString("error_description")); } return AuthUser.builder() - .uuid(object.getString("id")) - .username(object.getString("name")) - .nickname(object.getString("name")) - .avatar(object.getString("avatar")) - .blog(object.getString("url")) - .location(object.getString("location")) - .gender(AuthUserGender.getRealGender(object.getString("gender"))) - .email(object.getString("email")) - .token(authToken) - .source(AuthSource.OSCHINA) - .build(); + .uuid(object.getString("id")) + .username(object.getString("name")) + .nickname(object.getString("name")) + .avatar(object.getString("avatar")) + .blog(object.getString("url")) + .location(object.getString("location")) + .gender(AuthUserGender.getRealGender(object.getString("gender"))) + .email(object.getString("email")) + .token(authToken) + .source(AuthSource.OSCHINA) + .build(); + } + + /** + * 返回获取accessToken的url + * + * @param code + * @return 返回获取accessToken的url + */ + @Override + protected String accessTokenUrl(String code) { + return UrlBuilder.fromBaseUrl(source.accessToken()) + .queryParam("code", code) + .queryParam("client_id", config.getClientId()) + .queryParam("client_secret", config.getClientSecret()) + .queryParam("grant_type", "authorization_code") + .queryParam("redirect_uri", config.getRedirectUri()) + .queryParam("dataType", "json") + .build(); + } + + /** + * 返回获取userInfo的url + * + * @param authToken + * @return 返回获取userInfo的url + */ + @Override + protected String userInfoUrl(AuthToken authToken) { + return UrlBuilder.fromBaseUrl(source.userInfo()) + .queryParam("access_token", authToken.getAccessToken()) + .queryParam("dataType", "json") + .build(); } } diff --git a/src/main/java/me/zhyd/oauth/request/AuthQqRequest.java b/src/main/java/me/zhyd/oauth/request/AuthQqRequest.java index db4bc33fd777f039ba75e1d5d3d7858ff9586757..2452650e2f84be9b98727e4cf254d94ed9a5665e 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthQqRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthQqRequest.java @@ -11,10 +11,9 @@ import me.zhyd.oauth.model.AuthCallback; import me.zhyd.oauth.model.AuthToken; import me.zhyd.oauth.model.AuthUser; import me.zhyd.oauth.model.AuthUserGender; -import me.zhyd.oauth.url.AuthQqUrlBuilder; -import me.zhyd.oauth.url.entity.AuthUserInfoEntity; import me.zhyd.oauth.utils.GlobalAuthUtil; import me.zhyd.oauth.utils.StringUtils; +import me.zhyd.oauth.utils.UrlBuilder; import java.util.Map; @@ -28,34 +27,27 @@ import java.util.Map; */ public class AuthQqRequest extends AuthDefaultRequest { public AuthQqRequest(AuthConfig config) { - super(config, AuthSource.QQ, new AuthQqUrlBuilder()); + super(config, AuthSource.QQ); } @Override protected AuthToken getAccessToken(AuthCallback authCallback) { - String accessTokenUrl = this.urlBuilder.getAccessTokenUrl(authCallback.getCode()); - HttpResponse response = HttpRequest.get(accessTokenUrl).execute(); + HttpResponse response = doGetAuthorizationCode(authCallback.getCode()); Map accessTokenObject = GlobalAuthUtil.parseStringToMap(response.body()); if (!accessTokenObject.containsKey("access_token")) { throw new AuthException("Unable to get token from qq using code [" + authCallback.getCode() + "]: " + accessTokenObject); } return AuthToken.builder() - .accessToken(accessTokenObject.get("access_token")) - .expireIn(Integer.valueOf(accessTokenObject.get("expires_in"))) - .refreshToken(accessTokenObject.get("refresh_token")) - .build(); + .accessToken(accessTokenObject.get("access_token")) + .expireIn(Integer.valueOf(accessTokenObject.get("expires_in"))) + .refreshToken(accessTokenObject.get("refresh_token")) + .build(); } @Override protected AuthUser getUserInfo(AuthToken authToken) { - String accessToken = authToken.getAccessToken(); String openId = this.getOpenId(authToken); - HttpResponse response = HttpRequest.get(this.urlBuilder.getUserInfoUrl(AuthUserInfoEntity.builder() - .clientId(config.getClientId()) - .accessToken(accessToken) - .openId(openId) - .build())) - .execute(); + HttpResponse response = doGetUserInfo(authToken); JSONObject object = JSONObject.parseObject(response.body()); if (object.getIntValue("ret") != 0) { throw new AuthException(object.getString("msg")); @@ -67,20 +59,22 @@ public class AuthQqRequest extends AuthDefaultRequest { String location = String.format("%s-%s", object.getString("province"), object.getString("city")); return AuthUser.builder() - .username(object.getString("nickname")) - .nickname(object.getString("nickname")) - .avatar(avatar) - .location(location) - .uuid(openId) - .gender(AuthUserGender.getRealGender(object.getString("gender"))) - .token(authToken) - .source(AuthSource.QQ) - .build(); + .username(object.getString("nickname")) + .nickname(object.getString("nickname")) + .avatar(avatar) + .location(location) + .uuid(openId) + .gender(AuthUserGender.getRealGender(object.getString("gender"))) + .token(authToken) + .source(AuthSource.QQ) + .build(); } private String getOpenId(AuthToken authToken) { - String accessToken = authToken.getAccessToken(); - HttpResponse response = HttpRequest.get(this.urlBuilder.getOpenIdUrl(accessToken, config.isUnionId())).execute(); + HttpResponse response = HttpRequest.get(UrlBuilder.fromBaseUrl("https://graph.qq.com/oauth2.0/me") + .queryParam("access_token", authToken.getAccessToken()) + .queryParam("unionid", config.isUnionId() ? 1 : 0) + .build()).execute(); if (response.isOk()) { String body = response.body(); String removePrefix = StrUtil.replace(body, "callback(", ""); @@ -99,4 +93,19 @@ public class AuthQqRequest extends AuthDefaultRequest { throw new AuthException("request error"); } + + /** + * 返回获取userInfo的url + * + * @param authToken + * @return 返回获取userInfo的url + */ + @Override + protected String userInfoUrl(AuthToken authToken) { + return UrlBuilder.fromBaseUrl(source.userInfo()) + .queryParam("access_token", authToken.getAccessToken()) + .queryParam("oauth_consumer_key", config.getClientId()) + .queryParam("openid", authToken.getOpenId()) + .build(); + } } diff --git a/src/main/java/me/zhyd/oauth/request/AuthRenrenRequest.java b/src/main/java/me/zhyd/oauth/request/AuthRenrenRequest.java index dc74e89d2af73ca6d6a4bb7a4975cffed2afef9f..47ce130bdd2c2c322d62bd83555f159a57bc5d7e 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthRenrenRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthRenrenRequest.java @@ -1,6 +1,5 @@ package me.zhyd.oauth.request; -import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpResponse; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; @@ -10,8 +9,7 @@ import me.zhyd.oauth.model.AuthCallback; import me.zhyd.oauth.model.AuthToken; import me.zhyd.oauth.model.AuthUser; import me.zhyd.oauth.model.AuthUserGender; -import me.zhyd.oauth.url.AuthRenrenUrlBuilder; -import me.zhyd.oauth.url.entity.AuthUserInfoEntity; +import me.zhyd.oauth.utils.UrlBuilder; import java.util.Objects; @@ -27,13 +25,12 @@ import static me.zhyd.oauth.config.AuthSource.RENREN; public class AuthRenrenRequest extends AuthDefaultRequest { public AuthRenrenRequest(AuthConfig config) { - super(config, RENREN, new AuthRenrenUrlBuilder()); + super(config, RENREN); } @Override protected AuthToken getAccessToken(AuthCallback authCallback) { - String accessTokenUrl = this.urlBuilder.getAccessTokenUrl(authCallback.getCode()); - HttpResponse response = HttpRequest.post(accessTokenUrl).execute(); + HttpResponse response = doPostAuthorizationCode(authCallback.getCode()); JSONObject accessTokenObject = JSONObject.parseObject(response.body()); if (!response.isOk()) { throw new AuthException("Unable to get token from renren using code [" + authCallback.getCode() + "]: " + accessTokenObject); @@ -48,11 +45,7 @@ public class AuthRenrenRequest extends AuthDefaultRequest { @Override protected AuthUser getUserInfo(AuthToken authToken) { - String accessToken = authToken.getAccessToken(); - HttpResponse response = HttpRequest.get(this.urlBuilder.getUserInfoUrl(AuthUserInfoEntity.builder() - .openId(authToken.getOpenId()) - .accessToken(accessToken) - .build())).execute(); + HttpResponse response = doGetUserInfo(authToken); JSONObject userObj = JSONObject.parseObject(response.body()).getJSONObject("response"); return AuthUser.builder() @@ -89,4 +82,18 @@ public class AuthRenrenRequest extends AuthDefaultRequest { } return jsonArray.getJSONObject(0).getString("name"); } + + /** + * 返回获取userInfo的url + * + * @param authToken + * @return 返回获取userInfo的url + */ + @Override + protected String userInfoUrl(AuthToken authToken) { + return UrlBuilder.fromBaseUrl(source.userInfo()) + .queryParam("access_token", authToken.getAccessToken()) + .queryParam("userId", authToken.getOpenId()) + .build(); + } } diff --git a/src/main/java/me/zhyd/oauth/request/AuthTaobaoRequest.java b/src/main/java/me/zhyd/oauth/request/AuthTaobaoRequest.java index cf205909ac21001f7ba1b0a2e944eedc0e6525f0..838ec661e691eeb3c222f50c8cef875f6a964bf8 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthTaobaoRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthTaobaoRequest.java @@ -1,14 +1,16 @@ package me.zhyd.oauth.request; -import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpResponse; import com.alibaba.fastjson.JSONObject; 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.url.AuthTaobaoUrlBuilder; +import me.zhyd.oauth.model.AuthCallback; +import me.zhyd.oauth.model.AuthToken; +import me.zhyd.oauth.model.AuthUser; +import me.zhyd.oauth.model.AuthUserGender; import me.zhyd.oauth.utils.GlobalAuthUtil; +import me.zhyd.oauth.utils.UrlBuilder; /** * 淘宝登录 @@ -20,7 +22,7 @@ import me.zhyd.oauth.utils.GlobalAuthUtil; public class AuthTaobaoRequest extends AuthDefaultRequest { public AuthTaobaoRequest(AuthConfig config) { - super(config, AuthSource.TAOBAO, new AuthTaobaoUrlBuilder()); + super(config, AuthSource.TAOBAO); } @Override @@ -30,8 +32,7 @@ public class AuthTaobaoRequest extends AuthDefaultRequest { @Override protected AuthUser getUserInfo(AuthToken authToken) { - String accessCode = authToken.getAccessCode(); - HttpResponse response = HttpRequest.post(this.urlBuilder.getAccessTokenUrl(accessCode)).execute(); + HttpResponse response = doPostAuthorizationCode(authToken.getAccessCode()); JSONObject accessTokenObject = JSONObject.parseObject(response.body()); if (accessTokenObject.containsKey("error")) { throw new AuthException(accessTokenObject.getString("error_description")); @@ -44,12 +45,28 @@ public class AuthTaobaoRequest extends AuthDefaultRequest { String nick = GlobalAuthUtil.urlDecode(accessTokenObject.getString("taobao_user_nick")); return AuthUser.builder() - .uuid(accessTokenObject.getString("taobao_user_id")) - .username(nick) - .nickname(nick) - .gender(AuthUserGender.UNKNOWN) - .token(authToken) - .source(AuthSource.TAOBAO) - .build(); + .uuid(accessTokenObject.getString("taobao_user_id")) + .username(nick) + .nickname(nick) + .gender(AuthUserGender.UNKNOWN) + .token(authToken) + .source(AuthSource.TAOBAO) + .build(); + } + + /** + * 返回认证url,可自行跳转页面 + * + * @return 返回授权地址 + */ + @Override + public String authorize() { + return UrlBuilder.fromBaseUrl(source.authorize()) + .queryParam("response_type", "code") + .queryParam("client_id", config.getClientId()) + .queryParam("redirect_uri", config.getRedirectUri()) + .queryParam("state", getRealState(config.getState())) + .queryParam("view", "web") + .build(); } } diff --git a/src/main/java/me/zhyd/oauth/request/AuthTeambitionRequest.java b/src/main/java/me/zhyd/oauth/request/AuthTeambitionRequest.java index 673db4070cc97ac9ff01c2a6351898d2d243f921..46dab25bdff239cc73244b1d11ab68c57183fc2d 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthTeambitionRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthTeambitionRequest.java @@ -7,7 +7,6 @@ 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.url.AuthTeambitionUrlBuilder; /** * Teambition授权登录 @@ -19,7 +18,7 @@ import me.zhyd.oauth.url.AuthTeambitionUrlBuilder; public class AuthTeambitionRequest extends AuthDefaultRequest { public AuthTeambitionRequest(AuthConfig config) { - super(config, AuthSource.TEAMBITION, new AuthTeambitionUrlBuilder()); + super(config, AuthSource.TEAMBITION); } /** @@ -28,30 +27,29 @@ public class AuthTeambitionRequest extends AuthDefaultRequest { */ @Override protected AuthToken getAccessToken(AuthCallback authCallback) { - String accessTokenUrl = this.urlBuilder.getAccessTokenUrl(authCallback.getCode()); - HttpResponse response = HttpRequest.post(accessTokenUrl) - .form("client_id", config.getClientId()) - .form("client_secret", config.getClientSecret()) - .form("code", authCallback.getCode()) - .form("grant_type", "code") - .execute(); + HttpResponse response = HttpRequest.post(source.accessToken()) + .form("client_id", config.getClientId()) + .form("client_secret", config.getClientSecret()) + .form("code", authCallback.getCode()) + .form("grant_type", "code") + .execute(); JSONObject accessTokenObject = JSONObject.parseObject(response.body()); this.checkResponse(accessTokenObject); return AuthToken.builder() - .accessToken(accessTokenObject.getString("access_token")) - .refreshToken(accessTokenObject.getString("refresh_token")) - .build(); + .accessToken(accessTokenObject.getString("access_token")) + .refreshToken(accessTokenObject.getString("refresh_token")) + .build(); } @Override protected AuthUser getUserInfo(AuthToken authToken) { String accessToken = authToken.getAccessToken(); - HttpResponse response = HttpRequest.get(this.urlBuilder.getUserInfoUrl(null)) - .header("Authorization", "OAuth2 " + accessToken) - .execute(); + HttpResponse response = HttpRequest.get(source.userInfo()) + .header("Authorization", "OAuth2 " + accessToken) + .execute(); JSONObject object = JSONObject.parseObject(response.body()); this.checkResponse(object); @@ -59,39 +57,38 @@ public class AuthTeambitionRequest extends AuthDefaultRequest { authToken.setUid(object.getString("_id")); return AuthUser.builder() - .uuid(object.getString("_id")) - .username(object.getString("name")) - .nickname(object.getString("name")) - .avatar(object.getString("avatarUrl")) - .blog(object.getString("website")) - .location(object.getString("location")) - .email(object.getString("email")) - .gender(AuthUserGender.UNKNOWN) - .token(authToken) - .source(AuthSource.TEAMBITION) - .build(); + .uuid(object.getString("_id")) + .username(object.getString("name")) + .nickname(object.getString("name")) + .avatar(object.getString("avatarUrl")) + .blog(object.getString("website")) + .location(object.getString("location")) + .email(object.getString("email")) + .gender(AuthUserGender.UNKNOWN) + .token(authToken) + .source(AuthSource.TEAMBITION) + .build(); } @Override public AuthResponse refresh(AuthToken oldToken) { String uid = oldToken.getUid(); String refreshToken = oldToken.getRefreshToken(); - String refreshTokenUrl = this.urlBuilder.getRefreshUrl(refreshToken); - HttpResponse response = HttpRequest.post(refreshTokenUrl) - .form("_userId", uid) - .form("refresh_token", refreshToken) - .execute(); + HttpResponse response = HttpRequest.post(source.refresh()) + .form("_userId", uid) + .form("refresh_token", refreshToken) + .execute(); JSONObject refreshTokenObject = JSONObject.parseObject(response.body()); this.checkResponse(refreshTokenObject); return AuthResponse.builder() - .code(AuthResponseStatus.SUCCESS.getCode()) - .data(AuthToken.builder() - .accessToken(refreshTokenObject.getString("access_token")) - .refreshToken(refreshTokenObject.getString("refresh_token")) - .build()) - .build(); + .code(AuthResponseStatus.SUCCESS.getCode()) + .data(AuthToken.builder() + .accessToken(refreshTokenObject.getString("access_token")) + .refreshToken(refreshTokenObject.getString("refresh_token")) + .build()) + .build(); } /** diff --git a/src/main/java/me/zhyd/oauth/request/AuthTencentCloudRequest.java b/src/main/java/me/zhyd/oauth/request/AuthTencentCloudRequest.java index 91b2b2a1e1e1e9c88034a4266ce12aa1dd8f356f..b0204fb69c517519de0a5f7bfcbde7a8412a7d43 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthTencentCloudRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthTencentCloudRequest.java @@ -1,6 +1,5 @@ package me.zhyd.oauth.request; -import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpResponse; import com.alibaba.fastjson.JSONObject; import me.zhyd.oauth.config.AuthConfig; @@ -10,8 +9,7 @@ import me.zhyd.oauth.model.AuthCallback; import me.zhyd.oauth.model.AuthToken; import me.zhyd.oauth.model.AuthUser; import me.zhyd.oauth.model.AuthUserGender; -import me.zhyd.oauth.url.AuthTencentCloudUrlBuilder; -import me.zhyd.oauth.url.entity.AuthUserInfoEntity; +import me.zhyd.oauth.utils.UrlBuilder; /** * 腾讯云登录 @@ -23,48 +21,61 @@ import me.zhyd.oauth.url.entity.AuthUserInfoEntity; public class AuthTencentCloudRequest extends AuthDefaultRequest { public AuthTencentCloudRequest(AuthConfig config) { - super(config, AuthSource.TENCENT_CLOUD, new AuthTencentCloudUrlBuilder()); + super(config, AuthSource.TENCENT_CLOUD); } @Override protected AuthToken getAccessToken(AuthCallback authCallback) { - String accessTokenUrl = this.urlBuilder.getAccessTokenUrl(authCallback.getCode()); - HttpResponse response = HttpRequest.get(accessTokenUrl).execute(); + HttpResponse response = doGetAuthorizationCode(authCallback.getCode()); JSONObject accessTokenObject = JSONObject.parseObject(response.body()); if (accessTokenObject.getIntValue("code") != 0) { - throw new AuthException("Unable to get token from tencent cloud using code [" + authCallback.getCode() + "]: " + accessTokenObject.get("msg")); + throw new AuthException("Unable to get token from tencent cloud using code [" + authCallback.getCode() + "]: " + accessTokenObject + .get("msg")); } return AuthToken.builder() - .accessToken(accessTokenObject.getString("access_token")) - .expireIn(accessTokenObject.getIntValue("expires_in")) - .refreshToken(accessTokenObject.getString("refresh_token")) - .build(); + .accessToken(accessTokenObject.getString("access_token")) + .expireIn(accessTokenObject.getIntValue("expires_in")) + .refreshToken(accessTokenObject.getString("refresh_token")) + .build(); } @Override protected AuthUser getUserInfo(AuthToken authToken) { - String accessToken = authToken.getAccessToken(); - HttpResponse response = HttpRequest.get(this.urlBuilder.getUserInfoUrl(AuthUserInfoEntity.builder() - .accessToken(accessToken) - .build())).execute(); + HttpResponse response = doGetUserInfo(authToken); JSONObject object = JSONObject.parseObject(response.body()); if (object.getIntValue("code") != 0) { throw new AuthException(object.getString("msg")); } object = object.getJSONObject("data"); return AuthUser.builder() - .uuid(object.getString("id")) - .username(object.getString("name")) - .avatar("https://dev.tencent.com/" + object.getString("avatar")) - .blog("https://dev.tencent.com/" + object.getString("path")) - .nickname(object.getString("name")) - .company(object.getString("company")) - .location(object.getString("location")) - .gender(AuthUserGender.getRealGender(object.getString("sex"))) - .email(object.getString("email")) - .remark(object.getString("slogan")) - .token(authToken) - .source(AuthSource.TENCENT_CLOUD) - .build(); + .uuid(object.getString("id")) + .username(object.getString("name")) + .avatar("https://dev.tencent.com/" + object.getString("avatar")) + .blog("https://dev.tencent.com/" + object.getString("path")) + .nickname(object.getString("name")) + .company(object.getString("company")) + .location(object.getString("location")) + .gender(AuthUserGender.getRealGender(object.getString("sex"))) + .email(object.getString("email")) + .remark(object.getString("slogan")) + .token(authToken) + .source(AuthSource.TENCENT_CLOUD) + .build(); + } + + /** + * 返回认证url,可自行跳转页面 + * + * @return 返回授权地址 + */ + @Override + public String authorize() { + return UrlBuilder.fromBaseUrl(source.authorize()) + .queryParam("response_type", "code") + .queryParam("client_id", config.getClientId()) + .queryParam("redirect_uri", config.getRedirectUri()) + .queryParam("scope", "user") + .queryParam("state", getRealState(config.getState())) + .build(); } } diff --git a/src/main/java/me/zhyd/oauth/request/AuthToutiaoRequest.java b/src/main/java/me/zhyd/oauth/request/AuthToutiaoRequest.java index 45431f28e858002ee48302a5c2ea5284021d9dd1..19ab8bf6176e80b98cd0a360c0eefff2998091ee 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthToutiaoRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthToutiaoRequest.java @@ -1,6 +1,5 @@ package me.zhyd.oauth.request; -import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpResponse; import com.alibaba.fastjson.JSONObject; import me.zhyd.oauth.config.AuthConfig; @@ -11,8 +10,7 @@ import me.zhyd.oauth.model.AuthCallback; import me.zhyd.oauth.model.AuthToken; import me.zhyd.oauth.model.AuthUser; import me.zhyd.oauth.model.AuthUserGender; -import me.zhyd.oauth.url.AuthToutiaoUrlBuilder; -import me.zhyd.oauth.url.entity.AuthUserInfoEntity; +import me.zhyd.oauth.utils.UrlBuilder; /** * 今日头条登录 @@ -24,32 +22,29 @@ import me.zhyd.oauth.url.entity.AuthUserInfoEntity; public class AuthToutiaoRequest extends AuthDefaultRequest { public AuthToutiaoRequest(AuthConfig config) { - super(config, AuthSource.TOUTIAO, new AuthToutiaoUrlBuilder()); + super(config, AuthSource.TOUTIAO); } @Override protected AuthToken getAccessToken(AuthCallback authCallback) { - String accessTokenUrl = this.urlBuilder.getAccessTokenUrl(authCallback.getCode()); - HttpResponse response = HttpRequest.get(accessTokenUrl).execute(); + HttpResponse response = doGetAuthorizationCode(authCallback.getCode()); JSONObject accessTokenObject = JSONObject.parseObject(response.body()); if (accessTokenObject.containsKey("error_code")) { - throw new AuthException(AuthToutiaoErrorCode.getErrorCode(accessTokenObject.getIntValue("error_code")).getDesc()); + throw new AuthException(AuthToutiaoErrorCode.getErrorCode(accessTokenObject.getIntValue("error_code")) + .getDesc()); } return AuthToken.builder() - .accessToken(accessTokenObject.getString("access_token")) - .expireIn(accessTokenObject.getIntValue("expires_in")) - .openId(accessTokenObject.getString("open_id")) - .build(); + .accessToken(accessTokenObject.getString("access_token")) + .expireIn(accessTokenObject.getIntValue("expires_in")) + .openId(accessTokenObject.getString("open_id")) + .build(); } @Override protected AuthUser getUserInfo(AuthToken authToken) { - HttpResponse userResponse = HttpRequest.get(this.urlBuilder.getUserInfoUrl(AuthUserInfoEntity.builder() - .clientId(config.getClientId()) - .accessToken(authToken.getAccessToken()) - .build())).execute(); + HttpResponse userResponse = doGetUserInfo(authToken); JSONObject userProfile = JSONObject.parseObject(userResponse.body()); @@ -63,14 +58,61 @@ public class AuthToutiaoRequest extends AuthDefaultRequest { String anonymousUserName = "匿名用户"; return AuthUser.builder() - .uuid(user.getString("uid")) - .username(isAnonymousUser ? anonymousUserName : user.getString("screen_name")) - .nickname(isAnonymousUser ? anonymousUserName : user.getString("screen_name")) - .avatar(user.getString("avatar_url")) - .remark(user.getString("description")) - .gender(AuthUserGender.getRealGender(user.getString("gender"))) - .token(authToken) - .source(AuthSource.TOUTIAO) - .build(); + .uuid(user.getString("uid")) + .username(isAnonymousUser ? anonymousUserName : user.getString("screen_name")) + .nickname(isAnonymousUser ? anonymousUserName : user.getString("screen_name")) + .avatar(user.getString("avatar_url")) + .remark(user.getString("description")) + .gender(AuthUserGender.getRealGender(user.getString("gender"))) + .token(authToken) + .source(AuthSource.TOUTIAO) + .build(); + } + + /** + * 返回认证url,可自行跳转页面 + * + * @return 返回授权地址 + */ + @Override + public String authorize() { + return UrlBuilder.fromBaseUrl(source.authorize()) + .queryParam("response_type", "code") + .queryParam("client_key", config.getClientId()) + .queryParam("redirect_uri", config.getRedirectUri()) + .queryParam("state", getRealState(config.getState())) + .queryParam("auth_only", 1) + .queryParam("display", 0) + .build(); + } + + /** + * 返回获取accessToken的url + * + * @param code + * @return 返回获取accessToken的url + */ + @Override + protected String accessTokenUrl(String code) { + return UrlBuilder.fromBaseUrl(source.accessToken()) + .queryParam("code", code) + .queryParam("client_key", config.getClientId()) + .queryParam("client_secret", config.getClientSecret()) + .queryParam("grant_type", "authorization_code") + .build(); + } + + /** + * 返回获取userInfo的url + * + * @param authToken + * @return 返回获取userInfo的url + */ + @Override + protected String userInfoUrl(AuthToken authToken) { + return UrlBuilder.fromBaseUrl(source.userInfo()) + .queryParam("client_key", config.getClientId()) + .queryParam("access_token", authToken.getAccessToken()) + .build(); } } diff --git a/src/main/java/me/zhyd/oauth/request/AuthWeChatRequest.java b/src/main/java/me/zhyd/oauth/request/AuthWeChatRequest.java index 82a1662796ce1232849b7631821c22b3a483c2cd..1aeee68969c7897f71d42618478ae65ca119c7e3 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthWeChatRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthWeChatRequest.java @@ -7,8 +7,7 @@ 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.url.AuthWechatUrlBuilder; -import me.zhyd.oauth.url.entity.AuthUserInfoEntity; +import me.zhyd.oauth.utils.UrlBuilder; /** * 微信登录 @@ -19,7 +18,7 @@ import me.zhyd.oauth.url.entity.AuthUserInfoEntity; */ public class AuthWeChatRequest extends AuthDefaultRequest { public AuthWeChatRequest(AuthConfig config) { - super(config, AuthSource.WECHAT, new AuthWechatUrlBuilder()); + super(config, AuthSource.WECHAT); } /** @@ -30,48 +29,42 @@ public class AuthWeChatRequest extends AuthDefaultRequest { */ @Override protected AuthToken getAccessToken(AuthCallback authCallback) { - String accessTokenUrl = this.urlBuilder.getAccessTokenUrl(authCallback.getCode()); - return this.getToken(accessTokenUrl); + return this.getToken(accessTokenUrl(authCallback.getCode())); } @Override protected AuthUser getUserInfo(AuthToken authToken) { - String accessToken = authToken.getAccessToken(); String openId = authToken.getOpenId(); - HttpResponse response = HttpRequest.get(this.urlBuilder.getUserInfoUrl(AuthUserInfoEntity.builder() - .accessToken(accessToken) - .openId(openId) - .build())).execute(); + HttpResponse response = doGetUserInfo(authToken); JSONObject object = JSONObject.parseObject(response.body()); this.checkResponse(object); String location = String.format("%s-%s-%s", object.getString("country"), object.getString("province"), object.getString("city")); - if (object.containsKey("unionid")){ + if (object.containsKey("unionid")) { authToken.setUnionId(object.getString("unionid")); } return AuthUser.builder() - .username(object.getString("nickname")) - .nickname(object.getString("nickname")) - .avatar(object.getString("headimgurl")) - .location(location) - .uuid(openId) - .gender(AuthUserGender.getRealGender(object.getString("sex"))) - .token(authToken) - .source(AuthSource.WECHAT) - .build(); + .username(object.getString("nickname")) + .nickname(object.getString("nickname")) + .avatar(object.getString("headimgurl")) + .location(location) + .uuid(openId) + .gender(AuthUserGender.getRealGender(object.getString("sex"))) + .token(authToken) + .source(AuthSource.WECHAT) + .build(); } @Override public AuthResponse refresh(AuthToken oldToken) { - String refreshTokenUrl = this.urlBuilder.getRefreshUrl(oldToken.getRefreshToken()); return AuthResponse.builder() - .code(AuthResponseStatus.SUCCESS.getCode()) - .data(this.getToken(refreshTokenUrl)) - .build(); + .code(AuthResponseStatus.SUCCESS.getCode()) + .data(this.getToken(refreshTokenUrl(oldToken.getRefreshToken()))) + .build(); } /** @@ -98,10 +91,72 @@ public class AuthWeChatRequest extends AuthDefaultRequest { this.checkResponse(accessTokenObject); return AuthToken.builder() - .accessToken(accessTokenObject.getString("access_token")) - .refreshToken(accessTokenObject.getString("refresh_token")) - .expireIn(accessTokenObject.getIntValue("expires_in")) - .openId(accessTokenObject.getString("openid")) - .build(); + .accessToken(accessTokenObject.getString("access_token")) + .refreshToken(accessTokenObject.getString("refresh_token")) + .expireIn(accessTokenObject.getIntValue("expires_in")) + .openId(accessTokenObject.getString("openid")) + .build(); + } + + /** + * 返回认证url,可自行跳转页面 + * + * @return 返回授权地址 + */ + @Override + public String authorize() { + return UrlBuilder.fromBaseUrl(source.authorize()) + .queryParam("response_type", "code") + .queryParam("appid", config.getClientId()) + .queryParam("redirect_uri", config.getRedirectUri()) + .queryParam("scope", "snsapi_login") + .queryParam("state", getRealState(config.getState()).concat("#wechat_redirect")) + .build(); + } + + /** + * 返回获取accessToken的url + * + * @param code + * @return 返回获取accessToken的url + */ + @Override + protected String accessTokenUrl(String code) { + return UrlBuilder.fromBaseUrl(source.accessToken()) + .queryParam("code", code) + .queryParam("appid", config.getClientId()) + .queryParam("secret", config.getClientSecret()) + .queryParam("grant_type", "authorization_code") + .build(); + } + + /** + * 返回获取userInfo的url + * + * @param authToken + * @return 返回获取userInfo的url + */ + @Override + protected String userInfoUrl(AuthToken authToken) { + return UrlBuilder.fromBaseUrl(source.userInfo()) + .queryParam("access_token", authToken.getAccessToken()) + .queryParam("openid", authToken.getOpenId()) + .queryParam("lang", "zh_CN") + .build(); + } + + /** + * 返回获取accessToken的url + * + * @param refreshToken + * @return 返回获取accessToken的url + */ + @Override + protected String refreshTokenUrl(String refreshToken) { + return UrlBuilder.fromBaseUrl(source.refresh()) + .queryParam("appid", config.getClientId()) + .queryParam("refresh_token", refreshToken) + .queryParam("grant_type", "refresh_token") + .build(); } } diff --git a/src/main/java/me/zhyd/oauth/request/AuthWeiboRequest.java b/src/main/java/me/zhyd/oauth/request/AuthWeiboRequest.java index a428f77199fe3d5b13ad272617568444f8094307..97555dcb1f1df19c74681885cee90f2b9766c00b 100644 --- a/src/main/java/me/zhyd/oauth/request/AuthWeiboRequest.java +++ b/src/main/java/me/zhyd/oauth/request/AuthWeiboRequest.java @@ -10,10 +10,9 @@ import me.zhyd.oauth.model.AuthCallback; import me.zhyd.oauth.model.AuthToken; import me.zhyd.oauth.model.AuthUser; import me.zhyd.oauth.model.AuthUserGender; -import me.zhyd.oauth.url.AuthWeiboUrlBuilder; -import me.zhyd.oauth.url.entity.AuthUserInfoEntity; import me.zhyd.oauth.utils.IpUtils; import me.zhyd.oauth.utils.StringUtils; +import me.zhyd.oauth.utils.UrlBuilder; /** @@ -26,24 +25,24 @@ import me.zhyd.oauth.utils.StringUtils; public class AuthWeiboRequest extends AuthDefaultRequest { public AuthWeiboRequest(AuthConfig config) { - super(config, AuthSource.WEIBO, new AuthWeiboUrlBuilder()); + super(config, AuthSource.WEIBO); } @Override protected AuthToken getAccessToken(AuthCallback authCallback) { - String accessTokenUrl = this.urlBuilder.getAccessTokenUrl(authCallback.getCode()); - HttpResponse response = HttpRequest.post(accessTokenUrl).execute(); + HttpResponse response = doPostAuthorizationCode(authCallback.getCode()); String accessTokenStr = response.body(); JSONObject accessTokenObject = JSONObject.parseObject(accessTokenStr); if (accessTokenObject.containsKey("error")) { - throw new AuthException("Unable to get token from weibo using code [" + authCallback.getCode() + "]:" + accessTokenObject.getString("error_description")); + throw new AuthException("Unable to get token from weibo using code [" + authCallback.getCode() + "]:" + accessTokenObject + .getString("error_description")); } return AuthToken.builder() - .accessToken(accessTokenObject.getString("access_token")) - .uid(accessTokenObject.getString("uid")) - .openId(accessTokenObject.getString("uid")) - .expireIn(accessTokenObject.getIntValue("expires_in")) - .build(); + .accessToken(accessTokenObject.getString("access_token")) + .uid(accessTokenObject.getString("uid")) + .openId(accessTokenObject.getString("uid")) + .expireIn(accessTokenObject.getIntValue("expires_in")) + .build(); } @Override @@ -51,29 +50,41 @@ public class AuthWeiboRequest extends AuthDefaultRequest { String accessToken = authToken.getAccessToken(); String uid = authToken.getUid(); String oauthParam = String.format("uid=%s&access_token=%s", uid, accessToken); - HttpResponse response = HttpRequest.get(this.urlBuilder.getUserInfoUrl(AuthUserInfoEntity.builder() - .extra(oauthParam) - .build())) - .header("Authorization", "OAuth2 " + oauthParam) - .header("API-RemoteIP", IpUtils.getIp()) - .execute(); + HttpResponse response = HttpRequest.get(userInfoUrl(authToken)) + .header("Authorization", "OAuth2 " + oauthParam) + .header("API-RemoteIP", IpUtils.getIp()) + .execute(); String userInfo = response.body(); JSONObject object = JSONObject.parseObject(userInfo); if (object.containsKey("error")) { throw new AuthException(object.getString("error")); } return AuthUser.builder() - .uuid(object.getString("id")) - .username(object.getString("name")) - .avatar(object.getString("profile_image_url")) - .blog(StringUtils.isEmpty(object.getString("url")) ? "https://weibo.com/" + object.getString("profile_url") : object - .getString("url")) - .nickname(object.getString("screen_name")) - .location(object.getString("location")) - .remark(object.getString("description")) - .gender(AuthUserGender.getRealGender(object.getString("gender"))) - .token(authToken) - .source(AuthSource.WEIBO) - .build(); + .uuid(object.getString("id")) + .username(object.getString("name")) + .avatar(object.getString("profile_image_url")) + .blog(StringUtils.isEmpty(object.getString("url")) ? "https://weibo.com/" + object.getString("profile_url") : object + .getString("url")) + .nickname(object.getString("screen_name")) + .location(object.getString("location")) + .remark(object.getString("description")) + .gender(AuthUserGender.getRealGender(object.getString("gender"))) + .token(authToken) + .source(AuthSource.WEIBO) + .build(); + } + + /** + * 返回获取userInfo的url + * + * @param authToken + * @return 返回获取userInfo的url + */ + @Override + protected String userInfoUrl(AuthToken authToken) { + return UrlBuilder.fromBaseUrl(source.userInfo()) + .queryParam("access_token", authToken.getAccessToken()) + .queryParam("uid", authToken.getUid()) + .build(); } } diff --git a/src/main/java/me/zhyd/oauth/url/AuthAlipayUrlBuilder.java b/src/main/java/me/zhyd/oauth/url/AuthAlipayUrlBuilder.java deleted file mode 100644 index b4d0fd268318ece15f30a2b25df66f5ae841e806..0000000000000000000000000000000000000000 --- a/src/main/java/me/zhyd/oauth/url/AuthAlipayUrlBuilder.java +++ /dev/null @@ -1,45 +0,0 @@ -package me.zhyd.oauth.url; - -import me.zhyd.oauth.config.AuthSource; -import me.zhyd.oauth.exception.AuthException; -import me.zhyd.oauth.model.AuthResponseStatus; -import me.zhyd.oauth.url.entity.AuthUserInfoEntity; - -import java.text.MessageFormat; - -/** - * Baidu相关的URL构建类 - * - * @author yadong.zhang (yadong.zhang0415(a)gmail.com) - * @version 1.0 - * @since 1.8 - */ -public class AuthAlipayUrlBuilder extends AuthDefaultUrlBuilder { - - private static final String ALIPAY_AUTHORIZE_PATTERN = "{0}?app_id={1}&scope=auth_user&redirect_uri={2}&state={3}"; - - @Override - public String getAccessTokenUrl(String code) { - throw new AuthException(AuthResponseStatus.NOT_IMPLEMENTED); - } - - @Override - public String getUserInfoUrl(AuthUserInfoEntity userInfoEntity) { - throw new AuthException(AuthResponseStatus.NOT_IMPLEMENTED); - } - - @Override - public String getAuthorizeUrl() { - return MessageFormat.format(ALIPAY_AUTHORIZE_PATTERN, AuthSource.ALIPAY.authorize(), config.getClientId(), config.getRedirectUri(), this.getRealState(config.getState())); - } - - @Override - public String getRefreshUrl(String refreshToken) { - throw new AuthException(AuthResponseStatus.NOT_IMPLEMENTED); - } - - @Override - public String getRevokeUrl(String accessToken) { - throw new AuthException(AuthResponseStatus.NOT_IMPLEMENTED); - } -} diff --git a/src/main/java/me/zhyd/oauth/url/AuthBaiduUrlBuilder.java b/src/main/java/me/zhyd/oauth/url/AuthBaiduUrlBuilder.java deleted file mode 100644 index 7a8540fbf420b348b64593fa0b8a3fbd6439026b..0000000000000000000000000000000000000000 --- a/src/main/java/me/zhyd/oauth/url/AuthBaiduUrlBuilder.java +++ /dev/null @@ -1,48 +0,0 @@ -package me.zhyd.oauth.url; - -import me.zhyd.oauth.config.AuthSource; -import me.zhyd.oauth.exception.AuthException; -import me.zhyd.oauth.model.AuthResponseStatus; -import me.zhyd.oauth.url.entity.AuthUserInfoEntity; - -import java.text.MessageFormat; - -/** - * Baidu相关的URL构建类 - * - * @author yadong.zhang (yadong.zhang0415(a)gmail.com) - * @version 1.0 - * @since 1.8 - */ -public class AuthBaiduUrlBuilder extends AuthDefaultUrlBuilder { - - private static final String BAIDU_ACCESS_TOKEN_PATTERN = "{0}?client_id={1}&client_secret={2}&grant_type=authorization_code&code={3}&redirect_uri={4}"; - private static final String BAIDU_USER_INFO_PATTERN = "{0}?access_token={1}"; - private static final String BAIDU_AUTHORIZE_PATTERN = "{0}?client_id={1}&response_type=code&redirect_uri={2}&display=popup&state={3}"; - private static final String BAIDU_REVOKE_PATTERN = "{0}?access_token={1}"; - - @Override - public String getAccessTokenUrl(String code) { - return MessageFormat.format(BAIDU_ACCESS_TOKEN_PATTERN, AuthSource.BAIDU.accessToken(), config.getClientId(), config.getClientSecret(), code, config.getRedirectUri()); - } - - @Override - public String getUserInfoUrl(AuthUserInfoEntity userInfoEntity) { - return MessageFormat.format(BAIDU_USER_INFO_PATTERN, AuthSource.BAIDU.userInfo(), userInfoEntity.getAccessToken()); - } - - @Override - public String getAuthorizeUrl() { - return MessageFormat.format(BAIDU_AUTHORIZE_PATTERN, AuthSource.BAIDU.authorize(), config.getClientId(), config.getRedirectUri(), this.getRealState(config.getState())); - } - - @Override - public String getRefreshUrl(String refreshToken) { - throw new AuthException(AuthResponseStatus.NOT_IMPLEMENTED); - } - - @Override - public String getRevokeUrl(String accessToken) { - return MessageFormat.format(BAIDU_REVOKE_PATTERN, AuthSource.BAIDU.revoke(), accessToken); - } -} diff --git a/src/main/java/me/zhyd/oauth/url/AuthCodingUrlBuilder.java b/src/main/java/me/zhyd/oauth/url/AuthCodingUrlBuilder.java deleted file mode 100644 index e4651db56d6b4d50b8c3eb3fd0aa626efe1abbf6..0000000000000000000000000000000000000000 --- a/src/main/java/me/zhyd/oauth/url/AuthCodingUrlBuilder.java +++ /dev/null @@ -1,47 +0,0 @@ -package me.zhyd.oauth.url; - -import me.zhyd.oauth.config.AuthSource; -import me.zhyd.oauth.exception.AuthException; -import me.zhyd.oauth.model.AuthResponseStatus; -import me.zhyd.oauth.url.entity.AuthUserInfoEntity; - -import java.text.MessageFormat; - -/** - * Coding相关的URL构建类 - * - * @author yadong.zhang (yadong.zhang0415(a)gmail.com) - * @version 1.0 - * @since 1.8 - */ -public class AuthCodingUrlBuilder extends AuthDefaultUrlBuilder { - - private static final String CODING_ACCESS_TOKEN_PATTERN = "{0}?client_id={1}&client_secret={2}&grant_type=authorization_code&code={3}"; - private static final String CODING_USER_INFO_PATTERN = "{0}?access_token={1}"; - private static final String CODING_AUTHORIZE_PATTERN = "{0}?client_id={1}&response_type=code&redirect_uri={2}&scope=user&state={3}"; - - @Override - public String getAccessTokenUrl(String code) { - return MessageFormat.format(CODING_ACCESS_TOKEN_PATTERN, AuthSource.CODING.accessToken(), config.getClientId(), config.getClientSecret(), code); - } - - @Override - public String getUserInfoUrl(AuthUserInfoEntity userInfoEntity) { - return MessageFormat.format(CODING_USER_INFO_PATTERN, AuthSource.CODING.userInfo(), userInfoEntity.getAccessToken()); - } - - @Override - public String getAuthorizeUrl() { - return MessageFormat.format(CODING_AUTHORIZE_PATTERN, AuthSource.CODING.authorize(), config.getClientId(), config.getRedirectUri(), this.getRealState(config.getState())); - } - - @Override - public String getRefreshUrl(String refreshToken) { - throw new AuthException(AuthResponseStatus.NOT_IMPLEMENTED); - } - - @Override - public String getRevokeUrl(String accessToken) { - throw new AuthException(AuthResponseStatus.NOT_IMPLEMENTED); - } -} diff --git a/src/main/java/me/zhyd/oauth/url/AuthCsdnUrlBuilder.java b/src/main/java/me/zhyd/oauth/url/AuthCsdnUrlBuilder.java deleted file mode 100644 index 8b5cf6602d34d0e5a32c1ff054739315b8e1eb35..0000000000000000000000000000000000000000 --- a/src/main/java/me/zhyd/oauth/url/AuthCsdnUrlBuilder.java +++ /dev/null @@ -1,48 +0,0 @@ -package me.zhyd.oauth.url; - -import me.zhyd.oauth.config.AuthSource; -import me.zhyd.oauth.exception.AuthException; -import me.zhyd.oauth.model.AuthResponseStatus; -import me.zhyd.oauth.url.entity.AuthUserInfoEntity; - -import java.text.MessageFormat; - -/** - * csdn相关的URL构建类 - * - * @author yadong.zhang (yadong.zhang0415(a)gmail.com) - * @version 1.0 - * @since 1.8 - */ -@Deprecated -public class AuthCsdnUrlBuilder extends AuthDefaultUrlBuilder { - - private static final String CSDN_ACCESS_TOKEN_PATTERN = "{0}?client_id={1}&client_secret={2}&grant_type=authorization_code&code={3}&redirect_uri={4}"; - private static final String CSDN_USER_INFO_PATTERN = "{0}?access_token={1}"; - private static final String CSDN_AUTHORIZE_PATTERN = "{0}?client_id={1}&response_type=code&redirect_uri={2}&state={3}"; - - @Override - public String getAccessTokenUrl(String code) { - return MessageFormat.format(CSDN_ACCESS_TOKEN_PATTERN, AuthSource.CSDN.accessToken(), config.getClientId(), config.getClientSecret(), code, config.getRedirectUri()); - } - - @Override - public String getUserInfoUrl(AuthUserInfoEntity userInfoEntity) { - return MessageFormat.format(CSDN_USER_INFO_PATTERN, AuthSource.CSDN.userInfo(), userInfoEntity.getAccessToken()); - } - - @Override - public String getAuthorizeUrl() { - return MessageFormat.format(CSDN_AUTHORIZE_PATTERN, AuthSource.CSDN.authorize(), config.getClientId(), config.getRedirectUri(), this.getRealState(config.getState())); - } - - @Override - public String getRefreshUrl(String refreshToken) { - throw new AuthException(AuthResponseStatus.NOT_IMPLEMENTED); - } - - @Override - public String getRevokeUrl(String accessToken) { - throw new AuthException(AuthResponseStatus.NOT_IMPLEMENTED); - } -} diff --git a/src/main/java/me/zhyd/oauth/url/AuthDefaultUrlBuilder.java b/src/main/java/me/zhyd/oauth/url/AuthDefaultUrlBuilder.java deleted file mode 100644 index b23c087a74e003b862c0f776a2d067a0aff17eb0..0000000000000000000000000000000000000000 --- a/src/main/java/me/zhyd/oauth/url/AuthDefaultUrlBuilder.java +++ /dev/null @@ -1,83 +0,0 @@ -package me.zhyd.oauth.url; - -import me.zhyd.oauth.config.AuthConfig; -import me.zhyd.oauth.exception.AuthException; -import me.zhyd.oauth.model.AuthResponseStatus; -import me.zhyd.oauth.url.entity.AuthUserInfoEntity; -import me.zhyd.oauth.utils.StringUtils; - -/** - * @author yadong.zhang (yadong.zhang0415(a)gmail.com) - * @version 1.0 - * @since 1.8 - */ -public abstract class AuthDefaultUrlBuilder { - - protected AuthConfig config; - - /** - * 获取AccessToken的URL - * - * @param code 第三方平台返回的code - * @return AccessTokenUrl - */ - public abstract String getAccessTokenUrl(String code); - - /** - * 获取用户信息的URL - * - * @param userInfoEntity 传递生成 UserInfoUrl 必须的参数 - * @return UserInfoUrl - */ - public abstract String getUserInfoUrl(AuthUserInfoEntity userInfoEntity); - - /** - * 获取跳转授权页面的URL - * - * @return AuthorizeUrl - */ - public abstract String getAuthorizeUrl(); - - /** - * 获取刷新token的URL - * - * @param refreshToken 授权后取得的refresh token - * @return RefreshUrl - */ - public abstract String getRefreshUrl(String refreshToken); - - /** - * 获取取消授权的URL - * - * @param accessToken 授权后的token - * @return RevokeUrl - */ - public abstract String getRevokeUrl(String accessToken); - - /** - * 获取openId的地址,目前只有qq平台需要,故不需要子类强制重写 - * - * @param accessToken 用户授权后返回的accesstoken - * @param unionid 是否需要申请unionid,目前只针对qq登录 - * 注:qq授权登录时,获取unionid需要单独发送邮件申请权限。如果个人开发者账号中申请了该权限,可以将该值置为true,在获取openId时就会同步获取unionId - * 参考链接:http://wiki.connect.qq.com/unionid%E4%BB%8B%E7%BB%8D - * @return openIdUrl - */ - public String getOpenIdUrl(String accessToken, boolean unionid) { - throw new AuthException(AuthResponseStatus.NOT_IMPLEMENTED); - } - - /** - * 获取state,如果为空, 则默认去当前日期的时间戳 - * - * @param state 原始的state - * @return 返回不为null的state - */ - protected String getRealState(String state) { - return StringUtils.isEmpty(state) ? String.valueOf(System.currentTimeMillis()) : state; - } - - public void setAuthConfig(AuthConfig config) { - this.config = config; - } -} diff --git a/src/main/java/me/zhyd/oauth/url/AuthDingtalkUrlBuilder.java b/src/main/java/me/zhyd/oauth/url/AuthDingtalkUrlBuilder.java deleted file mode 100644 index f04b9b836c09b2872ef76c8aced41902ce634948..0000000000000000000000000000000000000000 --- a/src/main/java/me/zhyd/oauth/url/AuthDingtalkUrlBuilder.java +++ /dev/null @@ -1,46 +0,0 @@ -package me.zhyd.oauth.url; - -import me.zhyd.oauth.config.AuthSource; -import me.zhyd.oauth.exception.AuthException; -import me.zhyd.oauth.model.AuthResponseStatus; -import me.zhyd.oauth.url.entity.AuthUserInfoEntity; - -import java.text.MessageFormat; - -/** - * 钉钉相关的URL构建类 - * - * @author yadong.zhang (yadong.zhang0415(a)gmail.com) - * @version 1.0 - * @since 1.8 - */ -public class AuthDingtalkUrlBuilder extends AuthDefaultUrlBuilder { - - private static final String DING_TALK_QRCONNECT_PATTERN = "{0}?appid={1}&response_type=code&scope=snsapi_login&redirect_uri={2}&state={3}"; - private static final String DING_TALK_USER_INFO_PATTERN = "{0}?signature={1}×tamp={2}&accessKey={3}"; - - @Override - public String getAccessTokenUrl(String code) { - throw new AuthException(AuthResponseStatus.NOT_IMPLEMENTED); - } - - @Override - public String getUserInfoUrl(AuthUserInfoEntity userInfoEntity) { - return MessageFormat.format(DING_TALK_USER_INFO_PATTERN, AuthSource.DINGTALK.userInfo(), userInfoEntity.getSignature(), userInfoEntity.getTimestamp(), userInfoEntity.getClientId()); - } - - @Override - public String getAuthorizeUrl() { - return MessageFormat.format(DING_TALK_QRCONNECT_PATTERN, AuthSource.DINGTALK.authorize(), config.getClientId(), config.getRedirectUri(), this.getRealState(config.getState())); - } - - @Override - public String getRefreshUrl(String refreshToken) { - throw new AuthException(AuthResponseStatus.NOT_IMPLEMENTED); - } - - @Override - public String getRevokeUrl(String accessToken) { - throw new AuthException(AuthResponseStatus.NOT_IMPLEMENTED); - } -} diff --git a/src/main/java/me/zhyd/oauth/url/AuthDouyinUrlBuilder.java b/src/main/java/me/zhyd/oauth/url/AuthDouyinUrlBuilder.java deleted file mode 100644 index 49b17e8f2eb1764c39f3493567ad8d7209d35fac..0000000000000000000000000000000000000000 --- a/src/main/java/me/zhyd/oauth/url/AuthDouyinUrlBuilder.java +++ /dev/null @@ -1,48 +0,0 @@ -package me.zhyd.oauth.url; - -import me.zhyd.oauth.config.AuthSource; -import me.zhyd.oauth.exception.AuthException; -import me.zhyd.oauth.model.AuthResponseStatus; -import me.zhyd.oauth.url.entity.AuthUserInfoEntity; - -import java.text.MessageFormat; - -/** - * 抖音相关的URL构建类 - * - * @author yadong.zhang (yadong.zhang0415(a)gmail.com) - * @version 1.0 - * @since 1.8 - */ -public class AuthDouyinUrlBuilder extends AuthDefaultUrlBuilder { - - private static final String DOUYIN_AUTHORIZE_PATTERN = "{0}?client_key={1}&redirect_uri={2}&state={3}&response_type=code&scope=user_info"; - private static final String DOUYIN_ACCESS_TOKEN_PATTERN = "{0}?client_key={1}&client_secret={2}&code={3}&grant_type=authorization_code"; - private static final String DOUYIN_USER_INFO_PATTERN = "{0}?access_token={1}&open_id={2}"; - private static final String DOUYIN_REFRESH_TOKEN_PATTERN = "{0}?client_key={1}&refresh_token={2}&grant_type=refresh_token"; - - @Override - public String getAccessTokenUrl(String code) { - return MessageFormat.format(DOUYIN_ACCESS_TOKEN_PATTERN, AuthSource.DOUYIN.accessToken(), config.getClientId(), config.getClientSecret(), code); - } - - @Override - public String getUserInfoUrl(AuthUserInfoEntity userInfoEntity) { - return MessageFormat.format(DOUYIN_USER_INFO_PATTERN, AuthSource.DOUYIN.userInfo(), userInfoEntity.getAccessToken(), userInfoEntity.getOpenId()); - } - - @Override - public String getAuthorizeUrl() { - return MessageFormat.format(DOUYIN_AUTHORIZE_PATTERN, AuthSource.DOUYIN.authorize(), config.getClientId(), config.getRedirectUri(), this.getRealState(config.getState())); - } - - @Override - public String getRefreshUrl(String refreshToken) { - return MessageFormat.format(DOUYIN_REFRESH_TOKEN_PATTERN, AuthSource.DOUYIN.refresh(), config.getClientId(), refreshToken); - } - - @Override - public String getRevokeUrl(String accessToken) { - throw new AuthException(AuthResponseStatus.NOT_IMPLEMENTED); - } -} diff --git a/src/main/java/me/zhyd/oauth/url/AuthFacebookUrlBuilder.java b/src/main/java/me/zhyd/oauth/url/AuthFacebookUrlBuilder.java deleted file mode 100644 index d9483c17236bf90be2c4fe1d46613244686c65cf..0000000000000000000000000000000000000000 --- a/src/main/java/me/zhyd/oauth/url/AuthFacebookUrlBuilder.java +++ /dev/null @@ -1,47 +0,0 @@ -package me.zhyd.oauth.url; - -import me.zhyd.oauth.config.AuthSource; -import me.zhyd.oauth.exception.AuthException; -import me.zhyd.oauth.model.AuthResponseStatus; -import me.zhyd.oauth.url.entity.AuthUserInfoEntity; - -import java.text.MessageFormat; - -/** - * Facebook相关的URL构建类 - * - * @author yadong.zhang (yadong.zhang0415(a)gmail.com) - * @version 1.0 - * @since 1.8 - */ -public class AuthFacebookUrlBuilder extends AuthDefaultUrlBuilder { - - private static final String FACEBOOK_AUTHORIZE_PATTERN = "{0}?client_id={1}&redirect_uri={2}&state={3}&response_type=code&scope="; - private static final String FACEBOOK_ACCESS_TOKEN_PATTERN = "{0}?client_id={1}&client_secret={2}&code={3}&redirect_uri={4}&grant_type=authorization_code"; - private static final String FACEBOOK_USER_INFO_PATTERN = "{0}?access_token={1}&fields=id,name,birthday,gender,hometown,email,devices,picture.width(400)"; - - @Override - public String getAccessTokenUrl(String code) { - return MessageFormat.format(FACEBOOK_ACCESS_TOKEN_PATTERN, AuthSource.FACEBOOK.accessToken(), config.getClientId(), config.getClientSecret(), code, config.getRedirectUri()); - } - - @Override - public String getUserInfoUrl(AuthUserInfoEntity userInfoEntity) { - return MessageFormat.format(FACEBOOK_USER_INFO_PATTERN, AuthSource.FACEBOOK.userInfo(), userInfoEntity.getAccessToken()); - } - - @Override - public String getAuthorizeUrl() { - return MessageFormat.format(FACEBOOK_AUTHORIZE_PATTERN, AuthSource.FACEBOOK.authorize(), config.getClientId(), config.getRedirectUri(), this.getRealState(config.getState())); - } - - @Override - public String getRefreshUrl(String refreshToken) { - throw new AuthException(AuthResponseStatus.NOT_IMPLEMENTED); - } - - @Override - public String getRevokeUrl(String accessToken) { - throw new AuthException(AuthResponseStatus.NOT_IMPLEMENTED); - } -} diff --git a/src/main/java/me/zhyd/oauth/url/AuthGiteeUrlBuilder.java b/src/main/java/me/zhyd/oauth/url/AuthGiteeUrlBuilder.java deleted file mode 100644 index d4b3239d475f0a66b0803064554fc82f0670b729..0000000000000000000000000000000000000000 --- a/src/main/java/me/zhyd/oauth/url/AuthGiteeUrlBuilder.java +++ /dev/null @@ -1,47 +0,0 @@ -package me.zhyd.oauth.url; - -import me.zhyd.oauth.config.AuthSource; -import me.zhyd.oauth.exception.AuthException; -import me.zhyd.oauth.model.AuthResponseStatus; -import me.zhyd.oauth.url.entity.*; - -import java.text.MessageFormat; - -/** - * Gitee相关的URL构建类 - * - * @author yadong.zhang (yadong.zhang0415(a)gmail.com) - * @version 1.0 - * @since 1.8 - */ -public class AuthGiteeUrlBuilder extends AuthDefaultUrlBuilder { - - private static final String GITEE_ACCESS_TOKEN_PATTERN = "{0}?client_id={1}&client_secret={2}&grant_type=authorization_code&code={3}&redirect_uri={4}"; - private static final String GITEE_USER_INFO_PATTERN = "{0}?access_token={1}"; - private static final String GITEE_AUTHORIZE_PATTERN = "{0}?client_id={1}&response_type=code&redirect_uri={2}&state={3}"; - - @Override - public String getAccessTokenUrl(String code) { - return MessageFormat.format(GITEE_ACCESS_TOKEN_PATTERN, AuthSource.GITEE.accessToken(), config.getClientId(), config.getClientSecret(), code, config.getRedirectUri()); - } - - @Override - public String getUserInfoUrl(AuthUserInfoEntity userInfoEntity) { - return MessageFormat.format(GITEE_USER_INFO_PATTERN, AuthSource.GITEE.userInfo(), userInfoEntity.getAccessToken()); - } - - @Override - public String getAuthorizeUrl() { - return MessageFormat.format(GITEE_AUTHORIZE_PATTERN, AuthSource.GITEE.authorize(), config.getClientId(), config.getRedirectUri(), this.getRealState(config.getState())); - } - - @Override - public String getRefreshUrl(String refreshToken) { - throw new AuthException(AuthResponseStatus.NOT_IMPLEMENTED); - } - - @Override - public String getRevokeUrl(String accessToken) { - throw new AuthException(AuthResponseStatus.NOT_IMPLEMENTED); - } -} diff --git a/src/main/java/me/zhyd/oauth/url/AuthGithubUrlBuilder.java b/src/main/java/me/zhyd/oauth/url/AuthGithubUrlBuilder.java deleted file mode 100644 index f2defbddcecd0a2e6297a6ed78dc16846a85f439..0000000000000000000000000000000000000000 --- a/src/main/java/me/zhyd/oauth/url/AuthGithubUrlBuilder.java +++ /dev/null @@ -1,47 +0,0 @@ -package me.zhyd.oauth.url; - -import me.zhyd.oauth.config.AuthSource; -import me.zhyd.oauth.exception.AuthException; -import me.zhyd.oauth.model.AuthResponseStatus; -import me.zhyd.oauth.url.entity.AuthUserInfoEntity; - -import java.text.MessageFormat; - -/** - * Github相关的URL构建类 - * - * @author yadong.zhang (yadong.zhang0415(a)gmail.com) - * @version 1.0 - * @since 1.8 - */ -public class AuthGithubUrlBuilder extends AuthDefaultUrlBuilder { - - private static final String GITHUB_ACCESS_TOKEN_PATTERN = "{0}?client_id={1}&client_secret={2}&code={3}&redirect_uri={4}"; - private static final String GITHUB_USER_INFO_PATTERN = "{0}?access_token={1}"; - private static final String GITHUB_AUTHORIZE_PATTERN = "{0}?client_id={1}&redirect_uri={2}&state={3}"; - - @Override - public String getAccessTokenUrl(String code) { - return MessageFormat.format(GITHUB_ACCESS_TOKEN_PATTERN, AuthSource.GITHUB.accessToken(), config.getClientId(), config.getClientSecret(), code, config.getRedirectUri()); - } - - @Override - public String getUserInfoUrl(AuthUserInfoEntity userInfoEntity) { - return MessageFormat.format(GITHUB_USER_INFO_PATTERN, AuthSource.GITHUB.userInfo(), userInfoEntity.getAccessToken()); - } - - @Override - public String getAuthorizeUrl() { - return MessageFormat.format(GITHUB_AUTHORIZE_PATTERN, AuthSource.GITHUB.authorize(), config.getClientId(), config.getRedirectUri(), this.getRealState(config.getState())); - } - - @Override - public String getRefreshUrl(String refreshToken) { - throw new AuthException(AuthResponseStatus.NOT_IMPLEMENTED); - } - - @Override - public String getRevokeUrl(String accessToken) { - throw new AuthException(AuthResponseStatus.NOT_IMPLEMENTED); - } -} diff --git a/src/main/java/me/zhyd/oauth/url/AuthGoogleUrlBuilder.java b/src/main/java/me/zhyd/oauth/url/AuthGoogleUrlBuilder.java deleted file mode 100644 index cc21750cad79c0db9a98cb06f49ac25073f1c6dd..0000000000000000000000000000000000000000 --- a/src/main/java/me/zhyd/oauth/url/AuthGoogleUrlBuilder.java +++ /dev/null @@ -1,47 +0,0 @@ -package me.zhyd.oauth.url; - -import me.zhyd.oauth.config.AuthSource; -import me.zhyd.oauth.exception.AuthException; -import me.zhyd.oauth.model.AuthResponseStatus; -import me.zhyd.oauth.url.entity.AuthUserInfoEntity; - -import java.text.MessageFormat; - -/** - * Google相关的URL构建类 - * - * @author yadong.zhang (yadong.zhang0415(a)gmail.com) - * @version 1.0 - * @since 1.8 - */ -public class AuthGoogleUrlBuilder extends AuthDefaultUrlBuilder { - - private static final String GOOGLE_AUTHORIZE_PATTERN = "{0}?client_id={1}&response_type=code&scope=openid%20email%20profile&redirect_uri={2}&state={3}"; - private static final String GOOGLE_ACCESS_TOKEN_PATTERN = "{0}?client_id={1}&client_secret={2}&code={3}&redirect_uri={4}&grant_type=authorization_code"; - private static final String GOOGLE_USER_INFO_PATTERN = "{0}?id_token={1}"; - - @Override - public String getAccessTokenUrl(String code) { - return MessageFormat.format(GOOGLE_ACCESS_TOKEN_PATTERN, AuthSource.GOOGLE.accessToken(), config.getClientId(), config.getClientSecret(), code, config.getRedirectUri()); - } - - @Override - public String getUserInfoUrl(AuthUserInfoEntity userInfoEntity) { - return MessageFormat.format(GOOGLE_USER_INFO_PATTERN, AuthSource.GOOGLE.userInfo(), userInfoEntity.getAccessToken()); - } - - @Override - public String getAuthorizeUrl() { - return MessageFormat.format(GOOGLE_AUTHORIZE_PATTERN, AuthSource.GOOGLE.authorize(), config.getClientId(), config.getRedirectUri(), this.getRealState(config.getState())); - } - - @Override - public String getRefreshUrl(String refreshToken) { - throw new AuthException(AuthResponseStatus.NOT_IMPLEMENTED); - } - - @Override - public String getRevokeUrl(String accessToken) { - throw new AuthException(AuthResponseStatus.NOT_IMPLEMENTED); - } -} diff --git a/src/main/java/me/zhyd/oauth/url/AuthLinkedinUrlBuilder.java b/src/main/java/me/zhyd/oauth/url/AuthLinkedinUrlBuilder.java deleted file mode 100644 index c8be794a487d9eb1240d4e0a96fdf8fd26aaef9d..0000000000000000000000000000000000000000 --- a/src/main/java/me/zhyd/oauth/url/AuthLinkedinUrlBuilder.java +++ /dev/null @@ -1,48 +0,0 @@ -package me.zhyd.oauth.url; - -import me.zhyd.oauth.config.AuthSource; -import me.zhyd.oauth.exception.AuthException; -import me.zhyd.oauth.model.AuthResponseStatus; -import me.zhyd.oauth.url.entity.AuthUserInfoEntity; - -import java.text.MessageFormat; - -/** - * Microsoft相关的URL构建类 - * - * @author yadong.zhang (yadong.zhang0415(a)gmail.com) - * @version 1.0 - * @since 1.8 - */ -public class AuthLinkedinUrlBuilder extends AuthDefaultUrlBuilder { - - private static final String LINKEDIN_AUTHORIZE_PATTERN = "{0}?client_id={1}&redirect_uri={2}&state={3}&response_type=code&scope=r_liteprofile%20r_emailaddress%20w_member_social"; - private static final String LINKEDIN_ACCESS_TOKEN_PATTERN = "{0}?client_id={1}&client_secret={2}&code={3}&redirect_uri={4}&grant_type=authorization_code"; - private static final String LINKEDIN_USER_INFO_PATTERN = "{0}?projection=(id,firstName,lastName,profilePicture(displayImage~:playableStreams))"; - private static final String LINKEDIN_REFRESH_TOKEN_PATTERN = "{0}?client_id={1}&client_secret={2}&refresh_token={3}&grant_type=refresh_token"; - - @Override - public String getAccessTokenUrl(String code) { - return MessageFormat.format(LINKEDIN_ACCESS_TOKEN_PATTERN, AuthSource.LINKEDIN.accessToken(), config.getClientId(), config.getClientSecret(), code, config.getRedirectUri()); - } - - @Override - public String getUserInfoUrl(AuthUserInfoEntity userInfoEntity) { - return MessageFormat.format(LINKEDIN_USER_INFO_PATTERN, AuthSource.LINKEDIN.userInfo()); - } - - @Override - public String getAuthorizeUrl() { - return MessageFormat.format(LINKEDIN_AUTHORIZE_PATTERN, AuthSource.LINKEDIN.authorize(), config.getClientId(), config.getRedirectUri(), this.getRealState(config.getState())); - } - - @Override - public String getRefreshUrl(String refreshToken) { - return MessageFormat.format(LINKEDIN_REFRESH_TOKEN_PATTERN, AuthSource.LINKEDIN.refresh(), config.getClientId(), config.getClientSecret(), refreshToken); - } - - @Override - public String getRevokeUrl(String accessToken) { - throw new AuthException(AuthResponseStatus.NOT_IMPLEMENTED); - } -} diff --git a/src/main/java/me/zhyd/oauth/url/AuthMiUrlBuilder.java b/src/main/java/me/zhyd/oauth/url/AuthMiUrlBuilder.java deleted file mode 100644 index deae372bbef685fbc09e1937356f8c837533d8da..0000000000000000000000000000000000000000 --- a/src/main/java/me/zhyd/oauth/url/AuthMiUrlBuilder.java +++ /dev/null @@ -1,48 +0,0 @@ -package me.zhyd.oauth.url; - -import me.zhyd.oauth.config.AuthSource; -import me.zhyd.oauth.exception.AuthException; -import me.zhyd.oauth.model.AuthResponseStatus; -import me.zhyd.oauth.url.entity.AuthUserInfoEntity; - -import java.text.MessageFormat; - -/** - * 小米相关的URL构建类 - * - * @author yadong.zhang (yadong.zhang0415(a)gmail.com) - * @version 1.0 - * @since 1.8 - */ -public class AuthMiUrlBuilder extends AuthDefaultUrlBuilder { - - private static final String MI_AUTHORIZE_PATTERN = "{0}?client_id={1}&redirect_uri={2}&response_type=code&scope=user/profile%20user/openIdV2%20user/phoneAndEmail&state={3}&skip_confirm=false"; - private static final String MI_ACCESS_TOKEN_PATTERN = "{0}?client_id={1}&client_secret={2}&redirect_uri={3}&code={4}&grant_type=authorization_code"; - private static final String MI_USER_INFO_PATTERN = "{0}?clientId={1}&token={2}"; - private static final String MI_REFRESH_TOKEN_PATTERN = "{0}?client_id={1}&client_secret={2}&redirect_uri={3}&refresh_token={4}&grant_type=refresh_token"; - - @Override - public String getAccessTokenUrl(String code) { - return MessageFormat.format(MI_ACCESS_TOKEN_PATTERN, AuthSource.MI.accessToken(), config.getClientId(), config.getClientSecret(), config.getRedirectUri(), code); - } - - @Override - public String getUserInfoUrl(AuthUserInfoEntity userInfoEntity) { - return MessageFormat.format(MI_USER_INFO_PATTERN, AuthSource.MI.userInfo(), userInfoEntity.getClientId(), userInfoEntity.getAccessToken()); - } - - @Override - public String getAuthorizeUrl() { - return MessageFormat.format(MI_AUTHORIZE_PATTERN, AuthSource.MI.authorize(), config.getClientId(), config.getRedirectUri(), this.getRealState(config.getState())); - } - - @Override - public String getRefreshUrl(String refreshToken) { - return MessageFormat.format(MI_REFRESH_TOKEN_PATTERN, AuthSource.MI.refresh(), config.getClientId(), config.getClientSecret(), config.getRedirectUri(), refreshToken); - } - - @Override - public String getRevokeUrl(String accessToken) { - throw new AuthException(AuthResponseStatus.NOT_IMPLEMENTED); - } -} diff --git a/src/main/java/me/zhyd/oauth/url/AuthMicrosoftUrlBuilder.java b/src/main/java/me/zhyd/oauth/url/AuthMicrosoftUrlBuilder.java deleted file mode 100644 index 0b87cfa80638a56adefc8b720a9c62fa797963ba..0000000000000000000000000000000000000000 --- a/src/main/java/me/zhyd/oauth/url/AuthMicrosoftUrlBuilder.java +++ /dev/null @@ -1,48 +0,0 @@ -package me.zhyd.oauth.url; - -import me.zhyd.oauth.config.AuthSource; -import me.zhyd.oauth.exception.AuthException; -import me.zhyd.oauth.model.AuthResponseStatus; -import me.zhyd.oauth.url.entity.AuthUserInfoEntity; - -import java.text.MessageFormat; - -/** - * Microsoft相关的URL构建类 - * - * @author yadong.zhang (yadong.zhang0415(a)gmail.com) - * @version 1.0 - * @since 1.8 - */ -public class AuthMicrosoftUrlBuilder extends AuthDefaultUrlBuilder { - - private static final String MICROSOFT_AUTHORIZE_PATTERN = "{0}?client_id={1}&response_type=code&redirect_uri={2}&response_mode=query&scope=offline_access%20user.read%20mail.read&state={3}"; - private static final String MICROSOFT_ACCESS_TOKEN_PATTERN = "{0}?client_id={1}&client_secret={2}&scope=user.read%20mail.read&redirect_uri={3}&code={4}&grant_type=authorization_code"; - private static final String MICROSOFT_USER_INFO_PATTERN = "{0}"; - private static final String MICROSOFT_REFRESH_TOKEN_PATTERN = "{0}?client_id={1}&client_secret={2}&scope=user.read%20mail.read&redirect_uri={3}&refresh_token={4}&grant_type=refresh_token"; - - @Override - public String getAccessTokenUrl(String code) { - return MessageFormat.format(MICROSOFT_ACCESS_TOKEN_PATTERN, AuthSource.MICROSOFT.accessToken(), config.getClientId(), config.getClientSecret(), config.getRedirectUri(), code); - } - - @Override - public String getUserInfoUrl(AuthUserInfoEntity userInfoEntity) { - return MessageFormat.format(MICROSOFT_USER_INFO_PATTERN, AuthSource.MICROSOFT.userInfo()); - } - - @Override - public String getAuthorizeUrl() { - return MessageFormat.format(MICROSOFT_AUTHORIZE_PATTERN, AuthSource.MICROSOFT.authorize(), config.getClientId(), config.getRedirectUri(), this.getRealState(config.getState())); - } - - @Override - public String getRefreshUrl(String refreshToken) { - return MessageFormat.format(MICROSOFT_REFRESH_TOKEN_PATTERN, AuthSource.MICROSOFT.refresh(), config.getClientId(), config.getClientSecret(), config.getRedirectUri(), refreshToken); - } - - @Override - public String getRevokeUrl(String accessToken) { - throw new AuthException(AuthResponseStatus.NOT_IMPLEMENTED); - } -} diff --git a/src/main/java/me/zhyd/oauth/url/AuthOschinaUrlBuilder.java b/src/main/java/me/zhyd/oauth/url/AuthOschinaUrlBuilder.java deleted file mode 100644 index 6e553310d47eb422af10e40645dd5b2a548a542a..0000000000000000000000000000000000000000 --- a/src/main/java/me/zhyd/oauth/url/AuthOschinaUrlBuilder.java +++ /dev/null @@ -1,47 +0,0 @@ -package me.zhyd.oauth.url; - -import me.zhyd.oauth.config.AuthSource; -import me.zhyd.oauth.exception.AuthException; -import me.zhyd.oauth.model.AuthResponseStatus; -import me.zhyd.oauth.url.entity.AuthUserInfoEntity; - -import java.text.MessageFormat; - -/** - * OSChina相关的URL构建类 - * - * @author yadong.zhang (yadong.zhang0415(a)gmail.com) - * @version 1.0 - * @since 1.8 - */ -public class AuthOschinaUrlBuilder extends AuthDefaultUrlBuilder { - - private static final String OSCHINA_ACCESS_TOKEN_PATTERN = "{0}?client_id={1}&client_secret={2}&grant_type=authorization_code&code={3}&redirect_uri={4}&dataType=json"; - private static final String OSCHINA_USER_INFO_PATTERN = "{0}?access_token={1}&dataType=json"; - private static final String OSCHINA_AUTHORIZE_PATTERN = "{0}?client_id={1}&response_type=code&redirect_uri={2}&state={3}"; - - @Override - public String getAccessTokenUrl(String code) { - return MessageFormat.format(OSCHINA_ACCESS_TOKEN_PATTERN, AuthSource.OSCHINA.accessToken(), config.getClientId(), config.getClientSecret(), code, config.getRedirectUri()); - } - - @Override - public String getUserInfoUrl(AuthUserInfoEntity userInfoEntity) { - return MessageFormat.format(OSCHINA_USER_INFO_PATTERN, AuthSource.OSCHINA.userInfo(), userInfoEntity.getAccessToken()); - } - - @Override - public String getAuthorizeUrl() { - return MessageFormat.format(OSCHINA_AUTHORIZE_PATTERN, AuthSource.OSCHINA.authorize(), config.getClientId(), config.getRedirectUri(), this.getRealState(config.getState())); - } - - @Override - public String getRefreshUrl(String refreshToken) { - throw new AuthException(AuthResponseStatus.NOT_IMPLEMENTED); - } - - @Override - public String getRevokeUrl(String accessToken) { - throw new AuthException(AuthResponseStatus.NOT_IMPLEMENTED); - } -} diff --git a/src/main/java/me/zhyd/oauth/url/AuthQqUrlBuilder.java b/src/main/java/me/zhyd/oauth/url/AuthQqUrlBuilder.java deleted file mode 100644 index 70633e274f38efaa81d4c294bdb53c3e013b4ea6..0000000000000000000000000000000000000000 --- a/src/main/java/me/zhyd/oauth/url/AuthQqUrlBuilder.java +++ /dev/null @@ -1,53 +0,0 @@ -package me.zhyd.oauth.url; - -import me.zhyd.oauth.config.AuthSource; -import me.zhyd.oauth.exception.AuthException; -import me.zhyd.oauth.model.AuthResponseStatus; -import me.zhyd.oauth.url.entity.AuthUserInfoEntity; - -import java.text.MessageFormat; - -/** - * QQ相关的URL构建类 - * - * @author yadong.zhang (yadong.zhang0415(a)gmail.com) - * @version 1.0 - * @since 1.8 - */ -public class AuthQqUrlBuilder extends AuthDefaultUrlBuilder { - - private static final String QQ_ACCESS_TOKEN_PATTERN = "{0}?client_id={1}&client_secret={2}&grant_type=authorization_code&code={3}&redirect_uri={4}"; - private static final String QQ_USER_INFO_PATTERN = "{0}?oauth_consumer_key={1}&access_token={2}&openid={3}"; - 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}"; - - @Override - public String getAccessTokenUrl(String code) { - return MessageFormat.format(QQ_ACCESS_TOKEN_PATTERN, AuthSource.QQ.accessToken(), config.getClientId(), config.getClientSecret(), code, config.getRedirectUri()); - } - - @Override - public String getUserInfoUrl(AuthUserInfoEntity userInfoEntity) { - return MessageFormat.format(QQ_USER_INFO_PATTERN, AuthSource.QQ.userInfo(), userInfoEntity.getClientId(), userInfoEntity.getAccessToken(), userInfoEntity.getOpenId()); - } - - @Override - public String getAuthorizeUrl() { - return MessageFormat.format(QQ_AUTHORIZE_PATTERN, AuthSource.QQ.authorize(), config.getClientId(), config.getRedirectUri(), this.getRealState(config.getState())); - } - - @Override - public String getRefreshUrl(String refreshToken) { - throw new AuthException(AuthResponseStatus.NOT_IMPLEMENTED); - } - - @Override - public String getRevokeUrl(String accessToken) { - throw new AuthException(AuthResponseStatus.NOT_IMPLEMENTED); - } - - @Override - public String getOpenIdUrl(String accessToken, boolean unionid) { - return MessageFormat.format(QQ_OPENID_PATTERN, "https://graph.qq.com/oauth2.0/me", accessToken, unionid ? 1 : 0); - } -} diff --git a/src/main/java/me/zhyd/oauth/url/AuthRenrenUrlBuilder.java b/src/main/java/me/zhyd/oauth/url/AuthRenrenUrlBuilder.java deleted file mode 100644 index 6417f114b98b65aabfac2b91de530a18d048659b..0000000000000000000000000000000000000000 --- a/src/main/java/me/zhyd/oauth/url/AuthRenrenUrlBuilder.java +++ /dev/null @@ -1,49 +0,0 @@ -package me.zhyd.oauth.url; - -import me.zhyd.oauth.exception.AuthException; -import me.zhyd.oauth.model.AuthResponseStatus; -import me.zhyd.oauth.url.entity.AuthUserInfoEntity; - -import java.text.MessageFormat; - -import static me.zhyd.oauth.config.AuthSource.RENREN; - -/** - * 人人网相关的URL构建类 - * - * @author hongwei.peng (pengisgood(at)gmail(dot)com) - * @version 1.8.1 - * @since 1.8.1 - */ -public class AuthRenrenUrlBuilder extends AuthDefaultUrlBuilder { - - private static final String RENREN_ACCESS_TOKEN_PATTERN = "{0}?client_id={1}&client_secret={2}&grant_type=authorization_code&code={3}&redirect_uri={4}"; - private static final String RENREN_USER_INFO_PATTERN = "{0}?access_token={1}&userId={2}"; - private static final String RENREN_AUTHORIZE_PATTERN = "{0}?client_id={1}&response_type=code&redirect_uri={2}&state={3}"; - private static final String RENREN_REFRESH_PATTERN = "{0}?refresh_token={1}&client_id={2}&client_secret={3}&grant_type=refresh_token"; - - @Override - public String getAccessTokenUrl(String code) { - return MessageFormat.format(RENREN_ACCESS_TOKEN_PATTERN, RENREN.accessToken(), config.getClientId(), config.getClientSecret(), code, config.getRedirectUri()); - } - - @Override - public String getUserInfoUrl(AuthUserInfoEntity userInfoEntity) { - return MessageFormat.format(RENREN_USER_INFO_PATTERN, RENREN.userInfo(), userInfoEntity.getAccessToken(), userInfoEntity.getOpenId()); - } - - @Override - public String getAuthorizeUrl() { - return MessageFormat.format(RENREN_AUTHORIZE_PATTERN, RENREN.authorize(), config.getClientId(), config.getRedirectUri(), this.getRealState(config.getState())); - } - - @Override - public String getRefreshUrl(String refreshToken) { - return MessageFormat.format(RENREN_REFRESH_PATTERN, RENREN.refresh(), refreshToken, config.getClientId(), config.getClientSecret()); - } - - @Override - public String getRevokeUrl(String accessToken) { - throw new AuthException(AuthResponseStatus.UNSUPPORTED); - } -} diff --git a/src/main/java/me/zhyd/oauth/url/AuthTaobaoUrlBuilder.java b/src/main/java/me/zhyd/oauth/url/AuthTaobaoUrlBuilder.java deleted file mode 100644 index f4a8cffb5190b95170611fa96c593551f8000219..0000000000000000000000000000000000000000 --- a/src/main/java/me/zhyd/oauth/url/AuthTaobaoUrlBuilder.java +++ /dev/null @@ -1,46 +0,0 @@ -package me.zhyd.oauth.url; - -import me.zhyd.oauth.config.AuthSource; -import me.zhyd.oauth.exception.AuthException; -import me.zhyd.oauth.model.AuthResponseStatus; -import me.zhyd.oauth.url.entity.AuthUserInfoEntity; - -import java.text.MessageFormat; - -/** - * 淘宝相关的URL构建类 - * - * @author yadong.zhang (yadong.zhang0415(a)gmail.com) - * @version 1.0 - * @since 1.8 - */ -public class AuthTaobaoUrlBuilder extends AuthDefaultUrlBuilder { - - 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"; - - @Override - public String getAccessTokenUrl(String code) { - return MessageFormat.format(TAOBAO_ACCESS_TOKEN_PATTERN, AuthSource.TAOBAO.accessToken(), config.getClientId(), config.getClientSecret(), code, config.getRedirectUri()); - } - - @Override - public String getUserInfoUrl(AuthUserInfoEntity userInfoEntity) { - throw new AuthException(AuthResponseStatus.NOT_IMPLEMENTED); - } - - @Override - public String getAuthorizeUrl() { - return MessageFormat.format(TAOBAO_AUTHORIZE_PATTERN, AuthSource.TAOBAO.authorize(), config.getClientId(), config.getRedirectUri(), this.getRealState(config.getState())); - } - - @Override - public String getRefreshUrl(String refreshToken) { - throw new AuthException(AuthResponseStatus.NOT_IMPLEMENTED); - } - - @Override - public String getRevokeUrl(String accessToken) { - throw new AuthException(AuthResponseStatus.NOT_IMPLEMENTED); - } -} diff --git a/src/main/java/me/zhyd/oauth/url/AuthTeambitionUrlBuilder.java b/src/main/java/me/zhyd/oauth/url/AuthTeambitionUrlBuilder.java deleted file mode 100644 index 7ab6ca549044804212e03216e104ae52f09a733e..0000000000000000000000000000000000000000 --- a/src/main/java/me/zhyd/oauth/url/AuthTeambitionUrlBuilder.java +++ /dev/null @@ -1,43 +0,0 @@ -package me.zhyd.oauth.url; - -import me.zhyd.oauth.config.AuthSource; -import me.zhyd.oauth.url.entity.AuthUserInfoEntity; - -import java.text.MessageFormat; - -/** - * @author yadong.zhang (yadong.zhang0415(a)gmail.com) - * @version 1.0 - * @website https://www.zhyd.me - * @date 2019/7/16 22:22 - * @since 1.8 - */ -public class AuthTeambitionUrlBuilder extends AuthDefaultUrlBuilder { - - private static final String TEAMBITION_AUTHORIZE_PATTERN = "{0}?client_id={1}&redirect_uri={2}&state={3}&response_type=code"; - - @Override - public String getAccessTokenUrl(String code) { - return AuthSource.TEAMBITION.accessToken(); - } - - @Override - public String getUserInfoUrl(AuthUserInfoEntity userInfoEntity) { - return AuthSource.TEAMBITION.userInfo(); - } - - @Override - public String getAuthorizeUrl() { - return MessageFormat.format(TEAMBITION_AUTHORIZE_PATTERN, AuthSource.TEAMBITION.authorize(), config.getClientId(), config.getRedirectUri(), this.getRealState(config.getState())); - } - - @Override - public String getRefreshUrl(String refreshToken) { - return AuthSource.TEAMBITION.refresh(); - } - - @Override - public String getRevokeUrl(String accessToken) { - return null; - } -} diff --git a/src/main/java/me/zhyd/oauth/url/AuthTencentCloudUrlBuilder.java b/src/main/java/me/zhyd/oauth/url/AuthTencentCloudUrlBuilder.java deleted file mode 100644 index 96c037949530b847819ef1ba23f34635c0316263..0000000000000000000000000000000000000000 --- a/src/main/java/me/zhyd/oauth/url/AuthTencentCloudUrlBuilder.java +++ /dev/null @@ -1,47 +0,0 @@ -package me.zhyd.oauth.url; - -import me.zhyd.oauth.config.AuthSource; -import me.zhyd.oauth.exception.AuthException; -import me.zhyd.oauth.model.AuthResponseStatus; -import me.zhyd.oauth.url.entity.AuthUserInfoEntity; - -import java.text.MessageFormat; - -/** - * 今日头条相关的URL构建类 - * - * @author yadong.zhang (yadong.zhang0415(a)gmail.com) - * @version 1.0 - * @since 1.8 - */ -public class AuthTencentCloudUrlBuilder extends AuthDefaultUrlBuilder { - - private static final String TENCENT_ACCESS_TOKEN_PATTERN = "{0}?client_id={1}&client_secret={2}&grant_type=authorization_code&code={3}"; - private static final String TENCENT_USER_INFO_PATTERN = "{0}?access_token={1}"; - private static final String TENCENT_AUTHORIZE_PATTERN = "{0}?client_id={1}&response_type=code&redirect_uri={2}&scope=user&state={3}"; - - @Override - public String getAccessTokenUrl(String code) { - return MessageFormat.format(TENCENT_ACCESS_TOKEN_PATTERN, AuthSource.TENCENT_CLOUD.accessToken(), config.getClientId(), config.getClientSecret(), code); - } - - @Override - public String getUserInfoUrl(AuthUserInfoEntity userInfoEntity) { - return MessageFormat.format(TENCENT_USER_INFO_PATTERN, AuthSource.TENCENT_CLOUD.userInfo(), userInfoEntity.getAccessToken()); - } - - @Override - public String getAuthorizeUrl() { - return MessageFormat.format(TENCENT_AUTHORIZE_PATTERN, AuthSource.TENCENT_CLOUD.authorize(), config.getClientId(), config.getRedirectUri(), this.getRealState(config.getState())); - } - - @Override - public String getRefreshUrl(String refreshToken) { - throw new AuthException(AuthResponseStatus.NOT_IMPLEMENTED); - } - - @Override - public String getRevokeUrl(String accessToken) { - throw new AuthException(AuthResponseStatus.NOT_IMPLEMENTED); - } -} diff --git a/src/main/java/me/zhyd/oauth/url/AuthToutiaoUrlBuilder.java b/src/main/java/me/zhyd/oauth/url/AuthToutiaoUrlBuilder.java deleted file mode 100644 index 595b7d8ef282bd5a41be29f75d6913539b3a443f..0000000000000000000000000000000000000000 --- a/src/main/java/me/zhyd/oauth/url/AuthToutiaoUrlBuilder.java +++ /dev/null @@ -1,47 +0,0 @@ -package me.zhyd.oauth.url; - -import me.zhyd.oauth.config.AuthSource; -import me.zhyd.oauth.exception.AuthException; -import me.zhyd.oauth.model.AuthResponseStatus; -import me.zhyd.oauth.url.entity.AuthUserInfoEntity; - -import java.text.MessageFormat; - -/** - * 今日头条相关的URL构建类 - * - * @author yadong.zhang (yadong.zhang0415(a)gmail.com) - * @version 1.0 - * @since 1.8 - */ -public class AuthToutiaoUrlBuilder extends AuthDefaultUrlBuilder { - - private static final String TOUTIAO_ACCESS_TOKEN_PATTERN = "{0}?client_key={1}&client_secret={2}&code={3}&grant_type=authorize_code"; - private static final String TOUTIAO_USER_INFO_PATTERN = "{0}?client_key={1}&access_token={2}"; - private static final String TOUTIAO_AUTHORIZE_PATTERN = "{0}?client_key={1}&redirect_uri={2}&state={3}&response_type=code&auth_only=1&display=0"; - - @Override - public String getAccessTokenUrl(String code) { - return MessageFormat.format(TOUTIAO_ACCESS_TOKEN_PATTERN, AuthSource.TOUTIAO.accessToken(), config.getClientId(), config.getClientSecret(), code); - } - - @Override - public String getUserInfoUrl(AuthUserInfoEntity userInfoEntity) { - return MessageFormat.format(TOUTIAO_USER_INFO_PATTERN, AuthSource.TOUTIAO.userInfo(), userInfoEntity.getClientId(), userInfoEntity.getAccessToken()); - } - - @Override - public String getAuthorizeUrl() { - return MessageFormat.format(TOUTIAO_AUTHORIZE_PATTERN, AuthSource.TOUTIAO.authorize(), config.getClientId(), config.getRedirectUri(), this.getRealState(config.getState())); - } - - @Override - public String getRefreshUrl(String refreshToken) { - throw new AuthException(AuthResponseStatus.NOT_IMPLEMENTED); - } - - @Override - public String getRevokeUrl(String accessToken) { - throw new AuthException(AuthResponseStatus.NOT_IMPLEMENTED); - } -} diff --git a/src/main/java/me/zhyd/oauth/url/AuthWechatUrlBuilder.java b/src/main/java/me/zhyd/oauth/url/AuthWechatUrlBuilder.java deleted file mode 100644 index 0b513a59085376c5bd0ee3b9118dca7484fbefb6..0000000000000000000000000000000000000000 --- a/src/main/java/me/zhyd/oauth/url/AuthWechatUrlBuilder.java +++ /dev/null @@ -1,48 +0,0 @@ -package me.zhyd.oauth.url; - -import me.zhyd.oauth.config.AuthSource; -import me.zhyd.oauth.exception.AuthException; -import me.zhyd.oauth.model.AuthResponseStatus; -import me.zhyd.oauth.url.entity.AuthUserInfoEntity; - -import java.text.MessageFormat; - -/** - * 微信相关的URL构建类 - * - * @author yadong.zhang (yadong.zhang0415(a)gmail.com) - * @version 1.0 - * @since 1.8 - */ -public class AuthWechatUrlBuilder extends AuthDefaultUrlBuilder { - - 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(String code) { - return MessageFormat.format(WECHAT_ACCESS_TOKEN_PATTERN, AuthSource.WECHAT.accessToken(), config.getClientId(), config.getClientSecret(), code); - } - - @Override - public String getUserInfoUrl(AuthUserInfoEntity userInfoEntity) { - return MessageFormat.format(WECHAT_USER_INFO_PATTERN, AuthSource.WECHAT.userInfo(), userInfoEntity.getAccessToken(), userInfoEntity.getOpenId()); - } - - @Override - public String getAuthorizeUrl() { - return MessageFormat.format(WECHAT_AUTHORIZE_PATTERN, AuthSource.WECHAT.authorize(), config.getClientId(), config.getRedirectUri(), this.getRealState(config.getState())); - } - - @Override - public String getRefreshUrl(String refreshToken) { - return MessageFormat.format(WECHAT_REFRESH_TOKEN_PATTERN, AuthSource.WECHAT.refresh(), config.getClientId(), refreshToken); - } - - @Override - public String getRevokeUrl(String accessToken) { - throw new AuthException(AuthResponseStatus.NOT_IMPLEMENTED); - } -} diff --git a/src/main/java/me/zhyd/oauth/url/AuthWeiboUrlBuilder.java b/src/main/java/me/zhyd/oauth/url/AuthWeiboUrlBuilder.java deleted file mode 100644 index 5da4aa164011e100f28617d41ee8c3c2572c7d06..0000000000000000000000000000000000000000 --- a/src/main/java/me/zhyd/oauth/url/AuthWeiboUrlBuilder.java +++ /dev/null @@ -1,47 +0,0 @@ -package me.zhyd.oauth.url; - -import me.zhyd.oauth.config.AuthSource; -import me.zhyd.oauth.exception.AuthException; -import me.zhyd.oauth.model.AuthResponseStatus; -import me.zhyd.oauth.url.entity.AuthUserInfoEntity; - -import java.text.MessageFormat; - -/** - * 微博相关的URL构建类 - * - * @author yadong.zhang (yadong.zhang0415(a)gmail.com) - * @version 1.0 - * @since 1.8 - */ -public class AuthWeiboUrlBuilder extends AuthDefaultUrlBuilder { - - private static final String WEIBO_ACCESS_TOKEN_PATTERN = "{0}?client_id={1}&client_secret={2}&grant_type=authorization_code&code={3}&redirect_uri={4}"; - private static final String WEIBO_USER_INFO_PATTERN = "{0}?{1}"; - private static final String WEIBO_AUTHORIZE_PATTERN = "{0}?client_id={1}&response_type=code&redirect_uri={2}&state={3}"; - - @Override - public String getAccessTokenUrl(String code) { - return MessageFormat.format(WEIBO_ACCESS_TOKEN_PATTERN, AuthSource.WEIBO.accessToken(), config.getClientId(), config.getClientSecret(), code, config.getRedirectUri()); - } - - @Override - public String getUserInfoUrl(AuthUserInfoEntity userInfoEntity) { - return MessageFormat.format(WEIBO_USER_INFO_PATTERN, AuthSource.WEIBO.userInfo(), userInfoEntity.getExtra()); - } - - @Override - public String getAuthorizeUrl() { - return MessageFormat.format(WEIBO_AUTHORIZE_PATTERN, AuthSource.WEIBO.authorize(), config.getClientId(), config.getRedirectUri(), this.getRealState(config.getState())); - } - - @Override - public String getRefreshUrl(String refreshToken) { - throw new AuthException(AuthResponseStatus.NOT_IMPLEMENTED); - } - - @Override - public String getRevokeUrl(String accessToken) { - throw new AuthException(AuthResponseStatus.NOT_IMPLEMENTED); - } -} diff --git a/src/main/java/me/zhyd/oauth/url/entity/AuthUserInfoEntity.java b/src/main/java/me/zhyd/oauth/url/entity/AuthUserInfoEntity.java deleted file mode 100644 index 54fb17ef6cb7b17849103782e8edc06f60f66990..0000000000000000000000000000000000000000 --- a/src/main/java/me/zhyd/oauth/url/entity/AuthUserInfoEntity.java +++ /dev/null @@ -1,38 +0,0 @@ -package me.zhyd.oauth.url.entity; - -import lombok.Builder; -import lombok.Getter; - -/** - * @author yadong.zhang (yadong.zhang0415(a)gmail.com) - * @version 1.0 - * @since 1.8 - */ -@Getter -@Builder -public class AuthUserInfoEntity { - /** - * 授权返回的token - */ - private String accessToken; - /** - * 用户openId - */ - private String openId; - /** - * client key - */ - private String clientId; - /** - * 额外的属性 - */ - private String extra; - /** - * 额外的属性 - */ - private String signature; - /** - * 额外的属性 - */ - private String timestamp; -} diff --git a/src/main/java/me/zhyd/oauth/utils/UrlBuilder.java b/src/main/java/me/zhyd/oauth/utils/UrlBuilder.java index 4757da2b3351f56eefb69d49d66bf9c8f5125e16..34a48bd12c73281f4552059969b1f688e66bec66 100644 --- a/src/main/java/me/zhyd/oauth/utils/UrlBuilder.java +++ b/src/main/java/me/zhyd/oauth/utils/UrlBuilder.java @@ -1,6 +1,7 @@ package me.zhyd.oauth.utils; import cn.hutool.core.lang.Assert; +import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.StrUtil; import lombok.Data; @@ -12,7 +13,7 @@ import java.util.Map; * 构造URL *

* - * @author yangkai.shen + * @author yangkai.shen (https://xkcoding.com) * @date Created in 2019-07-18 15:47 */ @Data @@ -63,6 +64,9 @@ public class UrlBuilder { * @return url */ public String build(boolean encode) { + if (MapUtil.isEmpty(this.params)) { + return this.baseUrl; + } 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 index 778a2040e9cf38ed5b4e1bf3015da2740a8cbc39..763ee297602f509d05851ee28acd8fdf5693cd43 100644 --- a/src/test/java/me/zhyd/oauth/utils/UrlBuilderTest.java +++ b/src/test/java/me/zhyd/oauth/utils/UrlBuilderTest.java @@ -11,7 +11,7 @@ import org.junit.Test; * UrlBuilder测试类 *

* - * @author yangkai.shen + * @author yangkai.shen (https://xkcoding.com) * @date Created in 2019-07-18 16:36 */ public class UrlBuilderTest { @@ -22,15 +22,13 @@ public class UrlBuilderTest { 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 + .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); AuthWeChatRequest request = new AuthWeChatRequest(config); String authorize = request.authorize(); Assert.assertEquals(build, authorize);