diff --git a/README.md b/README.md
index e00b13e95e642987f2effe5f118a722bfce39c1c..169244ee65fb3a8775206af760660b4c9ac26ea8 100644
--- a/README.md
+++ b/README.md
@@ -6,7 +6,7 @@
-
+
@@ -15,7 +15,7 @@
-
+
@@ -68,7 +68,7 @@ JustAuth,如你所见,它仅仅是一个**第三方授权登录**的**工具
me.zhyd.oauth
JustAuth
- 1.7.1
+ 1.8.0
```
- 调用api
@@ -81,10 +81,12 @@ AuthRequest authRequest = new AuthGiteeRequest(AuthConfig.builder()
.build());
// 生成授权页面
authRequest.authorize();
-// 授权登录后会返回一个code,用这个code进行登录
-authRequest.login("code");
+// 授权登录后会返回code(auth_code(仅限支付宝))、state,1.8.0版本后,可以用AuthCallback类作为回调接口的参数
+authRequest.login(callback);
```
+注:`1.8.0`版本后,增加了`state`参数校验,用于防止[CSRF](https://zh.wikipedia.org/wiki/%E8%B7%A8%E7%AB%99%E8%AF%B7%E6%B1%82%E4%BC%AA%E9%80%A0)。强烈建议,保证单次流程内`state`的唯一性,且每个`state`只可用一次。
+
**配套Demo**:[JustAuth-demo](https://gitee.com/yadong.zhang/JustAuth-demo)
具体的例子可以参考:
@@ -99,12 +101,12 @@ authRequest.login("code");
|
| [AuthGithubRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthGiteeRequest.java) | 参考文档 |
|
| [AuthWeiboRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthGiteeRequest.java) | 参考文档 |
|
| [AuthDingTalkRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthDingTalkRequest.java) | 参考文档 |
-|
| [AuthBaiduRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthBaiduRequest.java) | 参考文档 |
+|
| [AuthBaiduRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthBaiduRequest.java) | 参考文档 |
|
| [AuthCodingRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthCodingRequest.java) | 参考文档 |
|
| [AuthTencentCloudRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthTencentCloudRequest.java) | 参考文档 |
-|
| [AuthOschinaRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthOschinaRequest.java) | 参考文档 |
+|
| [AuthOschinaRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthOschinaRequest.java) | 参考文档 |
|
| [AuthAlipayRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthAlipayRequest.java) | 参考文档 |
-|
| [AuthQqRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthQqRequest.java) | 参考文档 |
+|
| [AuthQqRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthQqRequest.java) | 参考文档 |
|
| [AuthWeChatRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthWeChatRequest.java) | 参考文档 |
|
| [AuthTaobaoRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthTaobaoRequest.java) | 参考文档 |
|
| [AuthGoogleRequest](https://gitee.com/yadong.zhang/JustAuth/blob/master/src/main/java/me/zhyd/oauth/request/AuthGoogleRequest.java) | 参考文档 |
diff --git a/src/main/java/me/zhyd/oauth/model/AuthUser.java b/src/main/java/me/zhyd/oauth/model/AuthUser.java
index aca19f1a632d328832b7dca5bb4d23b0d7ec8a14..1db92ec86b9477f555889ed7860432e55adaec27 100644
--- a/src/main/java/me/zhyd/oauth/model/AuthUser.java
+++ b/src/main/java/me/zhyd/oauth/model/AuthUser.java
@@ -17,6 +17,10 @@ import me.zhyd.oauth.config.AuthSource;
@Setter
@Builder
public class AuthUser {
+ /**
+ * 用户第三方系统的唯一id。在调用方集成改组件时,可以用uuid + source唯一确定一个用户
+ */
+ private String uuid;
/**
* 用户名
*/
@@ -61,8 +65,4 @@ public class AuthUser {
* 用户授权的token信息
*/
private AuthToken token;
- /**
- * 用户第三方系统的唯一id。在调用方集成改组件时,可以用uuid + source唯一确定一个用户
- */
- private String uuid;
}
diff --git a/src/main/java/me/zhyd/oauth/request/AuthAlipayRequest.java b/src/main/java/me/zhyd/oauth/request/AuthAlipayRequest.java
index 06196b0f5bcfd7df860354a61aee471b135456b1..fbcb95279e2ddca896227f6a204c72a592733670 100644
--- a/src/main/java/me/zhyd/oauth/request/AuthAlipayRequest.java
+++ b/src/main/java/me/zhyd/oauth/request/AuthAlipayRequest.java
@@ -38,12 +38,12 @@ public class AuthAlipayRequest extends BaseAuthRequest {
protected AuthToken getAccessToken(AuthCallback authCallback) {
AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest();
request.setGrantType("authorization_code");
- request.setCode(authCallback.getCode());
+ request.setCode(authCallback.getAuth_code());
AlipaySystemOauthTokenResponse response = null;
try {
response = this.alipayClient.execute(request);
} catch (Exception e) {
- throw new AuthException("Unable to get token from alipay using code [" + authCallback.getCode() + "]", e);
+ throw new AuthException("Unable to get token from alipay using code [" + authCallback.getAuth_code() + "]", e);
}
if (!response.isSuccess()) {
throw new AuthException(response.getSubMsg());
@@ -93,6 +93,6 @@ public class AuthAlipayRequest extends BaseAuthRequest {
*/
@Override
public String authorize() {
- return UrlBuilder.getAlipayAuthorizeUrl(config.getClientId(), config.getRedirectUri());
+ return UrlBuilder.getAlipayAuthorizeUrl(config.getClientId(), config.getRedirectUri(), config.getState());
}
}
diff --git a/src/main/java/me/zhyd/oauth/request/AuthBaiduRequest.java b/src/main/java/me/zhyd/oauth/request/AuthBaiduRequest.java
index 06f36bf7657a478cb7831ee40fc582fdbf9f6255..a9994282a63ce48f5fda0c06b8e891a35aa94bec 100644
--- a/src/main/java/me/zhyd/oauth/request/AuthBaiduRequest.java
+++ b/src/main/java/me/zhyd/oauth/request/AuthBaiduRequest.java
@@ -67,7 +67,7 @@ public class AuthBaiduRequest extends BaseAuthRequest {
*/
@Override
public String authorize() {
- return UrlBuilder.getBaiduAuthorizeUrl(config.getClientId(), config.getRedirectUri());
+ return UrlBuilder.getBaiduAuthorizeUrl(config.getClientId(), config.getRedirectUri(), config.getState());
}
@Override
diff --git a/src/main/java/me/zhyd/oauth/request/AuthCodingRequest.java b/src/main/java/me/zhyd/oauth/request/AuthCodingRequest.java
index 0ad822ad306d73c6415a6f0b5078fb1fb16c20ce..690a5eeceee1a7b0035b6d6c73b2b2cd9998b5a0 100644
--- a/src/main/java/me/zhyd/oauth/request/AuthCodingRequest.java
+++ b/src/main/java/me/zhyd/oauth/request/AuthCodingRequest.java
@@ -33,7 +33,11 @@ public class AuthCodingRequest extends BaseAuthRequest {
if (accessTokenObject.getIntValue("code") != 0) {
throw new AuthException("Unable to get token from coding using code [" + authCallback.getCode() + "]");
}
- return AuthToken.builder().accessToken(accessTokenObject.getString("access_token")).build();
+ return AuthToken.builder()
+ .accessToken(accessTokenObject.getString("access_token"))
+ .expireIn(accessTokenObject.getIntValue("expires_in"))
+ .refreshToken(accessTokenObject.getString("refresh_token"))
+ .build();
}
@Override
@@ -69,6 +73,6 @@ public class AuthCodingRequest extends BaseAuthRequest {
*/
@Override
public String authorize() {
- return UrlBuilder.getCodingAuthorizeUrl(config.getClientId(), config.getRedirectUri());
+ return UrlBuilder.getCodingAuthorizeUrl(config.getClientId(), config.getRedirectUri(), config.getState());
}
}
diff --git a/src/main/java/me/zhyd/oauth/request/AuthCsdnRequest.java b/src/main/java/me/zhyd/oauth/request/AuthCsdnRequest.java
index 9cee9a4c00ff6ad50f2ed202839a640982e9a681..43817c270804c92a951f9ed9e75ef1e1d988ed9e 100644
--- a/src/main/java/me/zhyd/oauth/request/AuthCsdnRequest.java
+++ b/src/main/java/me/zhyd/oauth/request/AuthCsdnRequest.java
@@ -63,6 +63,6 @@ public class AuthCsdnRequest extends BaseAuthRequest {
*/
@Override
public String authorize() {
- return UrlBuilder.getCsdnAuthorizeUrl(config.getClientId(), config.getRedirectUri());
+ return UrlBuilder.getCsdnAuthorizeUrl(config.getClientId(), config.getRedirectUri(), config.getState());
}
}
diff --git a/src/main/java/me/zhyd/oauth/request/AuthDingTalkRequest.java b/src/main/java/me/zhyd/oauth/request/AuthDingTalkRequest.java
index 15262d9459cf3ea4b5a0dc372c0bb0a5bf51a34f..6bd6fa0ea957ab6247b4bf988c6360eba4291b0c 100644
--- a/src/main/java/me/zhyd/oauth/request/AuthDingTalkRequest.java
+++ b/src/main/java/me/zhyd/oauth/request/AuthDingTalkRequest.java
@@ -67,6 +67,6 @@ public class AuthDingTalkRequest extends BaseAuthRequest {
*/
@Override
public String authorize() {
- return UrlBuilder.getDingTalkQrConnectUrl(config.getClientId(), config.getRedirectUri());
+ return UrlBuilder.getDingTalkQrConnectUrl(config.getClientId(), config.getRedirectUri(), config.getState());
}
}
diff --git a/src/main/java/me/zhyd/oauth/request/AuthDouyinRequest.java b/src/main/java/me/zhyd/oauth/request/AuthDouyinRequest.java
index c48c4022968c5ed1563993f9f5ef7e7b145b0ea1..cf29f19b119c9dc7f099427ef2421135691fe9be 100644
--- a/src/main/java/me/zhyd/oauth/request/AuthDouyinRequest.java
+++ b/src/main/java/me/zhyd/oauth/request/AuthDouyinRequest.java
@@ -58,7 +58,7 @@ public class AuthDouyinRequest extends BaseAuthRequest {
*/
@Override
public String authorize() {
- return UrlBuilder.getDouyinAuthorizeUrl(config.getClientId(), config.getRedirectUri());
+ return UrlBuilder.getDouyinAuthorizeUrl(config.getClientId(), config.getRedirectUri(), config.getState());
}
@Override
diff --git a/src/main/java/me/zhyd/oauth/request/AuthFacebookRequest.java b/src/main/java/me/zhyd/oauth/request/AuthFacebookRequest.java
index 014137bed5d67958f616c235f215a79fa4356dd6..bc8fcacaf5dd6383e48b24b7fdb2f74566f5063c 100644
--- a/src/main/java/me/zhyd/oauth/request/AuthFacebookRequest.java
+++ b/src/main/java/me/zhyd/oauth/request/AuthFacebookRequest.java
@@ -30,16 +30,16 @@ public class AuthFacebookRequest extends BaseAuthRequest {
String accessTokenUrl = UrlBuilder.getFacebookAccessTokenUrl(config.getClientId(), config.getClientSecret(),
authCallback.getCode(), config.getRedirectUri());
HttpResponse response = HttpRequest.post(accessTokenUrl).execute();
- JSONObject object = JSONObject.parseObject(response.body());
+ JSONObject accessTokenObject = JSONObject.parseObject(response.body());
- if (object.containsKey("error")) {
- throw new AuthException(object.getJSONObject("error").getString("message"));
+ if (accessTokenObject.containsKey("error")) {
+ throw new AuthException(accessTokenObject.getJSONObject("error").getString("message"));
}
return AuthToken.builder()
- .accessToken(object.getString("access_token"))
- .expireIn(object.getIntValue("expires_in"))
- .tokenType(object.getString("token_type"))
+ .accessToken(accessTokenObject.getString("access_token"))
+ .expireIn(accessTokenObject.getIntValue("expires_in"))
+ .tokenType(accessTokenObject.getString("token_type"))
.build();
}
@@ -80,6 +80,6 @@ public class AuthFacebookRequest extends BaseAuthRequest {
*/
@Override
public String authorize() {
- return UrlBuilder.getFacebookAuthorizeUrl(config.getClientId(), config.getRedirectUri());
+ return UrlBuilder.getFacebookAuthorizeUrl(config.getClientId(), config.getRedirectUri(), config.getState());
}
}
diff --git a/src/main/java/me/zhyd/oauth/request/AuthGoogleRequest.java b/src/main/java/me/zhyd/oauth/request/AuthGoogleRequest.java
index 1edcf91679df68af49dbe9ad34eceaf5f5b7ed31..dea8f541959485c80f6e4934a5f64d423272f33b 100644
--- a/src/main/java/me/zhyd/oauth/request/AuthGoogleRequest.java
+++ b/src/main/java/me/zhyd/oauth/request/AuthGoogleRequest.java
@@ -30,19 +30,19 @@ public class AuthGoogleRequest extends BaseAuthRequest {
String accessTokenUrl = UrlBuilder.getGoogleAccessTokenUrl(config.getClientId(), config.getClientSecret(), authCallback.getCode(), config
.getRedirectUri());
HttpResponse response = HttpRequest.post(accessTokenUrl).execute();
- JSONObject object = JSONObject.parseObject(response.body());
+ JSONObject accessTokenObject = JSONObject.parseObject(response.body());
- if (object.containsKey("error") || object.containsKey("error_description")) {
- throw new AuthException("get google access_token has error:[" + object.getString("error") + "], error_description:[" + object
+ 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") + "]");
}
return AuthToken.builder()
- .accessToken(object.getString("access_token"))
- .expireIn(object.getIntValue("expires_in"))
- .scope(object.getString("scope"))
- .tokenType(object.getString("token_type"))
- .idToken(object.getString("id_token"))
+ .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();
}
@@ -72,6 +72,6 @@ public class AuthGoogleRequest extends BaseAuthRequest {
*/
@Override
public String authorize() {
- return UrlBuilder.getGoogleAuthorizeUrl(config.getClientId(), config.getRedirectUri());
+ return UrlBuilder.getGoogleAuthorizeUrl(config.getClientId(), config.getRedirectUri(), config.getState());
}
}
diff --git a/src/main/java/me/zhyd/oauth/request/AuthLinkedinRequest.java b/src/main/java/me/zhyd/oauth/request/AuthLinkedinRequest.java
index 6115bda0a7785065454ad9af0f323779fbc16747..23cfa6b60cac1725b49512f1ff7a41bf60edcf23 100644
--- a/src/main/java/me/zhyd/oauth/request/AuthLinkedinRequest.java
+++ b/src/main/java/me/zhyd/oauth/request/AuthLinkedinRequest.java
@@ -93,7 +93,7 @@ public class AuthLinkedinRequest extends BaseAuthRequest {
*/
@Override
public String authorize() {
- return UrlBuilder.getLinkedinAuthorizeUrl(config.getClientId(), config.getRedirectUri());
+ return UrlBuilder.getLinkedinAuthorizeUrl(config.getClientId(), config.getRedirectUri(), config.getState());
}
private String getUserEmail(String accessToken) {
diff --git a/src/main/java/me/zhyd/oauth/request/AuthMiRequest.java b/src/main/java/me/zhyd/oauth/request/AuthMiRequest.java
index b0be7f37dedc807f7d1ee5bfe0dd4da23a18cfd4..6ca54037ee35594659675bdfda9a5b1b50ff01a3 100644
--- a/src/main/java/me/zhyd/oauth/request/AuthMiRequest.java
+++ b/src/main/java/me/zhyd/oauth/request/AuthMiRequest.java
@@ -35,21 +35,21 @@ public class AuthMiRequest extends BaseAuthRequest {
private AuthToken getToken(String accessTokenUrl) {
HttpResponse response = HttpRequest.get(accessTokenUrl).execute();
String jsonStr = StrUtil.replace(response.body(), PREFIX, StrUtil.EMPTY);
- JSONObject object = JSONObject.parseObject(jsonStr);
+ JSONObject accessTokenObject = JSONObject.parseObject(jsonStr);
- if (object.containsKey("error")) {
- throw new AuthException(object.getString("error_description"));
+ if (accessTokenObject.containsKey("error")) {
+ throw new AuthException(accessTokenObject.getString("error_description"));
}
return AuthToken.builder()
- .accessToken(object.getString("access_token"))
- .expireIn(object.getIntValue("expires_in"))
- .scope(object.getString("scope"))
- .tokenType(object.getString("token_type"))
- .refreshToken(object.getString("refresh_token"))
- .openId(object.getString("openId"))
- .macAlgorithm(object.getString("mac_algorithm"))
- .macKey(object.getString("mac_key"))
+ .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();
}
@@ -98,7 +98,7 @@ public class AuthMiRequest extends BaseAuthRequest {
*/
@Override
public String authorize() {
- return UrlBuilder.getMiAuthorizeUrl(config.getClientId(), config.getRedirectUri());
+ return UrlBuilder.getMiAuthorizeUrl(config.getClientId(), config.getRedirectUri(), config.getState());
}
/**
diff --git a/src/main/java/me/zhyd/oauth/request/AuthMicrosoftRequest.java b/src/main/java/me/zhyd/oauth/request/AuthMicrosoftRequest.java
index c394ff0d6633c2d5e717ba578547d125291411a9..cbf32521357d83a5a32e47774470aa1badd6dd0c 100644
--- a/src/main/java/me/zhyd/oauth/request/AuthMicrosoftRequest.java
+++ b/src/main/java/me/zhyd/oauth/request/AuthMicrosoftRequest.java
@@ -48,16 +48,16 @@ public class AuthMicrosoftRequest extends BaseAuthRequest {
.form(paramMap)
.execute();
String accessTokenStr = response.body();
- JSONObject object = JSONObject.parseObject(accessTokenStr);
+ JSONObject accessTokenObject = JSONObject.parseObject(accessTokenStr);
- this.checkResponse(object);
+ this.checkResponse(accessTokenObject);
return AuthToken.builder()
- .accessToken(object.getString("access_token"))
- .expireIn(object.getIntValue("expires_in"))
- .scope(object.getString("scope"))
- .tokenType(object.getString("token_type"))
- .refreshToken(object.getString("refresh_token"))
+ .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();
}
@@ -96,7 +96,7 @@ public class AuthMicrosoftRequest extends BaseAuthRequest {
*/
@Override
public String authorize() {
- return UrlBuilder.getMicrosoftAuthorizeUrl(config.getClientId(), config.getRedirectUri());
+ return UrlBuilder.getMicrosoftAuthorizeUrl(config.getClientId(), config.getRedirectUri(), config.getState());
}
/**
diff --git a/src/main/java/me/zhyd/oauth/request/AuthOschinaRequest.java b/src/main/java/me/zhyd/oauth/request/AuthOschinaRequest.java
index f81d1c4aed3a27c9fc41bad695741c4e3bf435a8..fe0110d70056c56eca9a92e34824d5ec8f303231 100644
--- a/src/main/java/me/zhyd/oauth/request/AuthOschinaRequest.java
+++ b/src/main/java/me/zhyd/oauth/request/AuthOschinaRequest.java
@@ -34,7 +34,12 @@ public class AuthOschinaRequest extends BaseAuthRequest {
if (accessTokenObject.containsKey("error")) {
throw new AuthException("Unable to get token from oschina using code [" + authCallback.getCode() + "]");
}
- return AuthToken.builder().accessToken(accessTokenObject.getString("access_token")).build();
+ return AuthToken.builder()
+ .accessToken(accessTokenObject.getString("access_token"))
+ .refreshToken(accessTokenObject.getString("refresh_token"))
+ .uid(accessTokenObject.getString("uid"))
+ .expireIn(accessTokenObject.getIntValue("expires_in"))
+ .build();
}
@Override
@@ -66,6 +71,6 @@ public class AuthOschinaRequest extends BaseAuthRequest {
*/
@Override
public String authorize() {
- return UrlBuilder.getOschinaAuthorizeUrl(config.getClientId(), config.getRedirectUri());
+ return UrlBuilder.getOschinaAuthorizeUrl(config.getClientId(), config.getRedirectUri(), config.getState());
}
}
diff --git a/src/main/java/me/zhyd/oauth/request/AuthQqRequest.java b/src/main/java/me/zhyd/oauth/request/AuthQqRequest.java
index 3472f29ef2fa5ed8f43355ddcadc5e19f93cb33d..e9bfffeba337da7012049806db7347a7b77546da 100644
--- a/src/main/java/me/zhyd/oauth/request/AuthQqRequest.java
+++ b/src/main/java/me/zhyd/oauth/request/AuthQqRequest.java
@@ -81,7 +81,7 @@ public class AuthQqRequest extends BaseAuthRequest {
*/
@Override
public String authorize() {
- return UrlBuilder.getQqAuthorizeUrl(config.getClientId(), config.getRedirectUri());
+ return UrlBuilder.getQqAuthorizeUrl(config.getClientId(), config.getRedirectUri(), config.getState());
}
private String getOpenId(AuthToken authToken) {
diff --git a/src/main/java/me/zhyd/oauth/request/AuthTaobaoRequest.java b/src/main/java/me/zhyd/oauth/request/AuthTaobaoRequest.java
index 0dadd39ce40843b43a2b380ba6548394f88907e3..8add7cdcdabee282f1f80f712111dea9953f0263 100644
--- a/src/main/java/me/zhyd/oauth/request/AuthTaobaoRequest.java
+++ b/src/main/java/me/zhyd/oauth/request/AuthTaobaoRequest.java
@@ -36,19 +36,19 @@ public class AuthTaobaoRequest extends BaseAuthRequest {
String accessCode = authToken.getAccessCode();
HttpResponse response = HttpRequest.post(UrlBuilder.getTaobaoAccessTokenUrl(this.config.getClientId(), this.config
.getClientSecret(), accessCode, this.config.getRedirectUri())).execute();
- JSONObject object = JSONObject.parseObject(response.body());
- if (object.containsKey("error")) {
- throw new AuthException(ResponseStatus.FAILURE + ":" + object.getString("error_description"));
+ JSONObject accessTokenObject = JSONObject.parseObject(response.body());
+ if (accessTokenObject.containsKey("error")) {
+ throw new AuthException(ResponseStatus.FAILURE + ":" + accessTokenObject.getString("error_description"));
}
- authToken.setAccessToken(object.getString("access_token"));
- authToken.setRefreshToken(object.getString("refresh_token"));
- authToken.setExpireIn(object.getIntValue("expires_in"));
- authToken.setUid(object.getString("taobao_user_id"));
- authToken.setOpenId(object.getString("taobao_open_uid"));
+ authToken.setAccessToken(accessTokenObject.getString("access_token"));
+ authToken.setRefreshToken(accessTokenObject.getString("refresh_token"));
+ authToken.setExpireIn(accessTokenObject.getIntValue("expires_in"));
+ authToken.setUid(accessTokenObject.getString("taobao_user_id"));
+ authToken.setOpenId(accessTokenObject.getString("taobao_open_uid"));
- String nick = GlobalAuthUtil.urlDecode(object.getString("taobao_user_nick"));
+ String nick = GlobalAuthUtil.urlDecode(accessTokenObject.getString("taobao_user_nick"));
return AuthUser.builder()
- .uuid(object.getString("taobao_user_id"))
+ .uuid(accessTokenObject.getString("taobao_user_id"))
.username(nick)
.nickname(nick)
.gender(AuthUserGender.UNKNOW)
@@ -64,6 +64,6 @@ public class AuthTaobaoRequest extends BaseAuthRequest {
*/
@Override
public String authorize() {
- return UrlBuilder.getTaobaoAuthorizeUrl(config.getClientId(), config.getRedirectUri());
+ return UrlBuilder.getTaobaoAuthorizeUrl(config.getClientId(), config.getRedirectUri(), config.getState());
}
}
diff --git a/src/main/java/me/zhyd/oauth/request/AuthTencentCloudRequest.java b/src/main/java/me/zhyd/oauth/request/AuthTencentCloudRequest.java
index 5daf48f6c0bc1cd9a7ca0c6bbe3a795a4738f7d3..4841115745588e2889236120adb50bcdafc1a648 100644
--- a/src/main/java/me/zhyd/oauth/request/AuthTencentCloudRequest.java
+++ b/src/main/java/me/zhyd/oauth/request/AuthTencentCloudRequest.java
@@ -29,11 +29,15 @@ public class AuthTencentCloudRequest extends BaseAuthRequest {
protected AuthToken getAccessToken(AuthCallback authCallback) {
String accessTokenUrl = UrlBuilder.getTencentCloudAccessTokenUrl(config.getClientId(), config.getClientSecret(), authCallback.getCode());
HttpResponse response = HttpRequest.get(accessTokenUrl).execute();
- JSONObject object = JSONObject.parseObject(response.body());
- if (object.getIntValue("code") != 0) {
- throw new AuthException("Unable to get token from tencent cloud using code [" + authCallback.getCode() + "]: " + object.get("msg"));
+ 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"));
}
- return AuthToken.builder().accessToken(object.getString("access_token")).build();
+ return AuthToken.builder()
+ .accessToken(accessTokenObject.getString("access_token"))
+ .expireIn(accessTokenObject.getIntValue("expires_in"))
+ .refreshToken(accessTokenObject.getString("refresh_token"))
+ .build();
}
@Override
@@ -68,6 +72,6 @@ public class AuthTencentCloudRequest extends BaseAuthRequest {
*/
@Override
public String authorize() {
- return UrlBuilder.getTencentCloudAuthorizeUrl(config.getClientId(), config.getRedirectUri());
+ return UrlBuilder.getTencentCloudAuthorizeUrl(config.getClientId(), config.getRedirectUri(), config.getState());
}
}
diff --git a/src/main/java/me/zhyd/oauth/request/AuthToutiaoRequest.java b/src/main/java/me/zhyd/oauth/request/AuthToutiaoRequest.java
index 41d4c76d104eae8b9a21666c03faf7a483424d1d..dd24abfa375b86a200574e4609ec31946a8e7c29 100644
--- a/src/main/java/me/zhyd/oauth/request/AuthToutiaoRequest.java
+++ b/src/main/java/me/zhyd/oauth/request/AuthToutiaoRequest.java
@@ -26,16 +26,16 @@ public class AuthToutiaoRequest extends BaseAuthRequest {
protected AuthToken getAccessToken(AuthCallback authCallback) {
String accessTokenUrl = UrlBuilder.getToutiaoAccessTokenUrl(config.getClientId(), config.getClientSecret(), authCallback.getCode());
HttpResponse response = HttpRequest.get(accessTokenUrl).execute();
- JSONObject object = JSONObject.parseObject(response.body());
+ JSONObject accessTokenObject = JSONObject.parseObject(response.body());
- if (object.containsKey("error_code")) {
- throw new AuthException(AuthToutiaoErrorCode.getErrorCode(object.getIntValue("error_code")).getDesc());
+ if (accessTokenObject.containsKey("error_code")) {
+ throw new AuthException(AuthToutiaoErrorCode.getErrorCode(accessTokenObject.getIntValue("error_code")).getDesc());
}
return AuthToken.builder()
- .accessToken(object.getString("access_token"))
- .expireIn(object.getIntValue("expires_in"))
- .openId(object.getString("open_id"))
+ .accessToken(accessTokenObject.getString("access_token"))
+ .expireIn(accessTokenObject.getIntValue("expires_in"))
+ .openId(accessTokenObject.getString("open_id"))
.build();
}
@@ -73,6 +73,6 @@ public class AuthToutiaoRequest extends BaseAuthRequest {
*/
@Override
public String authorize() {
- return UrlBuilder.getToutiaoAuthorizeUrl(config.getClientId(), config.getRedirectUri());
+ return UrlBuilder.getToutiaoAuthorizeUrl(config.getClientId(), config.getRedirectUri(), config.getState());
}
}
diff --git a/src/main/java/me/zhyd/oauth/request/AuthWeChatRequest.java b/src/main/java/me/zhyd/oauth/request/AuthWeChatRequest.java
index 6fc9b7a7cb81f031abb8b03de790ca2d03f8eb4c..e7ae78eb4799290405765c8d13cf4807db3fd827 100644
--- a/src/main/java/me/zhyd/oauth/request/AuthWeChatRequest.java
+++ b/src/main/java/me/zhyd/oauth/request/AuthWeChatRequest.java
@@ -24,7 +24,7 @@ public class AuthWeChatRequest extends BaseAuthRequest {
/**
* 微信的特殊性,此时返回的信息同时包含 openid 和 access_token
*
- * @param code 授权码
+ * @param authCallback 回调返回的参数
* @return 所有信息
*/
@Override
@@ -63,7 +63,7 @@ public class AuthWeChatRequest extends BaseAuthRequest {
*/
@Override
public String authorize() {
- return UrlBuilder.getWeChatAuthorizeUrl(config.getClientId(), config.getRedirectUri());
+ return UrlBuilder.getWeChatAuthorizeUrl(config.getClientId(), config.getRedirectUri(), config.getState());
}
@Override
@@ -94,15 +94,15 @@ public class AuthWeChatRequest extends BaseAuthRequest {
*/
private AuthToken getToken(String accessTokenUrl) {
HttpResponse response = HttpRequest.get(accessTokenUrl).execute();
- JSONObject object = JSONObject.parseObject(response.body());
+ JSONObject accessTokenObject = JSONObject.parseObject(response.body());
- this.checkResponse(object);
+ this.checkResponse(accessTokenObject);
return AuthToken.builder()
- .accessToken(object.getString("access_token"))
- .refreshToken(object.getString("refresh_token"))
- .expireIn(object.getIntValue("expires_in"))
- .openId(object.getString("openid"))
+ .accessToken(accessTokenObject.getString("access_token"))
+ .refreshToken(accessTokenObject.getString("refresh_token"))
+ .expireIn(accessTokenObject.getIntValue("expires_in"))
+ .openId(accessTokenObject.getString("openid"))
.build();
}
}
diff --git a/src/main/java/me/zhyd/oauth/request/BaseAuthRequest.java b/src/main/java/me/zhyd/oauth/request/BaseAuthRequest.java
index 52e1254b769b171ebcdf3dd93b11324586194238..8cf1fb186423898617e3c7e0090df47e82c64360 100644
--- a/src/main/java/me/zhyd/oauth/request/BaseAuthRequest.java
+++ b/src/main/java/me/zhyd/oauth/request/BaseAuthRequest.java
@@ -37,7 +37,7 @@ public abstract class BaseAuthRequest implements AuthRequest {
@Override
public AuthResponse login(AuthCallback authCallback) {
try {
- AuthChecker.checkCode(authCallback.getCode());
+ AuthChecker.checkCode(source == AuthSource.ALIPAY ? authCallback.getAuth_code() : authCallback.getCode());
AuthChecker.checkState(authCallback.getState(), config.getState());
AuthToken authToken = this.getAccessToken(authCallback);
diff --git a/src/main/java/me/zhyd/oauth/utils/UrlBuilder.java b/src/main/java/me/zhyd/oauth/utils/UrlBuilder.java
index 2f0492b655dbba4466b50f6b8f3c4deed2caac9f..70d8db7036927a939ae01371928401df16643d74 100644
--- a/src/main/java/me/zhyd/oauth/utils/UrlBuilder.java
+++ b/src/main/java/me/zhyd/oauth/utils/UrlBuilder.java
@@ -29,31 +29,31 @@ public class UrlBuilder {
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}";
- private static final String DING_TALK_QRCONNECT_PATTERN = "{0}?appid={1}&response_type=code&scope=snsapi_login&state=STATE&redirect_uri={2}";
+ 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}";
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";
+ 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}";
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}";
+ private static final String CSDN_AUTHORIZE_PATTERN = "{0}?client_id={1}&response_type=code&redirect_uri={2}&state={3}";
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";
+ private static final String CODING_AUTHORIZE_PATTERN = "{0}?client_id={1}&response_type=code&redirect_uri={2}&scope=user&state={3}";
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";
+ private static final String TENCENT_AUTHORIZE_PATTERN = "{0}?client_id={1}&response_type=code&redirect_uri={2}&scope=user&state={3}";
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}";
+ private static final String OSCHINA_AUTHORIZE_PATTERN = "{0}?client_id={1}&response_type=code&redirect_uri={2}&state={3}";
- private static final String ALIPAY_AUTHORIZE_PATTERN = "{0}?app_id={1}&scope=auth_user&redirect_uri={2}&state=init";
+ private static final String ALIPAY_AUTHORIZE_PATTERN = "{0}?app_id={1}&scope=auth_user&redirect_uri={2}&state={3}";
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}";
@@ -215,10 +215,11 @@ public class UrlBuilder {
*
* @param clientId 钉钉 应用的App Id
* @param redirectUrl 钉钉 应用授权成功后的回调地址
+ * @param state 随机字符串,用于保持会话状态,防止CSRF攻击
* @return full url
*/
- public static String getDingTalkQrConnectUrl(String clientId, String redirectUrl) {
- return MessageFormat.format(DING_TALK_QRCONNECT_PATTERN, AuthSource.DINGTALK.authorize(), clientId, redirectUrl);
+ public static String getDingTalkQrConnectUrl(String clientId, String redirectUrl, String state) {
+ return MessageFormat.format(DING_TALK_QRCONNECT_PATTERN, AuthSource.DINGTALK.authorize(), clientId, redirectUrl, getState(state));
}
/**
@@ -261,10 +262,11 @@ public class UrlBuilder {
*
* @param clientId baidu 应用的API Key
* @param redirectUrl baidu 应用授权成功后的回调地址
+ * @param state 随机字符串,用于保持会话状态,防止CSRF攻击
* @return json
*/
- public static String getBaiduAuthorizeUrl(String clientId, String redirectUrl) {
- return MessageFormat.format(BAIDU_AUTHORIZE_PATTERN, AuthSource.BAIDU.authorize(), clientId, redirectUrl);
+ public static String getBaiduAuthorizeUrl(String clientId, String redirectUrl, String state) {
+ return MessageFormat.format(BAIDU_AUTHORIZE_PATTERN, AuthSource.BAIDU.authorize(), clientId, redirectUrl, getState(state));
}
/**
@@ -305,10 +307,11 @@ public class UrlBuilder {
*
* @param clientId csdn 应用的Client ID
* @param redirectUrl csdn 应用授权成功后的回调地址
+ * @param state 随机字符串,用于保持会话状态,防止CSRF攻击
* @return full url
*/
- public static String getCsdnAuthorizeUrl(String clientId, String redirectUrl) {
- return MessageFormat.format(CSDN_AUTHORIZE_PATTERN, AuthSource.CSDN.authorize(), clientId, redirectUrl);
+ public static String getCsdnAuthorizeUrl(String clientId, String redirectUrl, String state) {
+ return MessageFormat.format(CSDN_AUTHORIZE_PATTERN, AuthSource.CSDN.authorize(), clientId, redirectUrl, getState(state));
}
/**
@@ -338,10 +341,11 @@ public class UrlBuilder {
*
* @param clientId coding 应用的Client ID
* @param redirectUrl coding 应用授权成功后的回调地址
+ * @param state 随机字符串,用于保持会话状态,防止CSRF攻击
* @return full url
*/
- public static String getCodingAuthorizeUrl(String clientId, String redirectUrl) {
- return MessageFormat.format(CODING_AUTHORIZE_PATTERN, AuthSource.CODING.authorize(), clientId, redirectUrl);
+ public static String getCodingAuthorizeUrl(String clientId, String redirectUrl, String state) {
+ return MessageFormat.format(CODING_AUTHORIZE_PATTERN, AuthSource.CODING.authorize(), clientId, redirectUrl, getState(state));
}
/**
@@ -371,10 +375,11 @@ public class UrlBuilder {
*
* @param clientId coding 应用的Client ID
* @param redirectUrl coding 应用授权成功后的回调地址
+ * @param state 随机字符串,用于保持会话状态,防止CSRF攻击
* @return full url
*/
- public static String getTencentCloudAuthorizeUrl(String clientId, String redirectUrl) {
- return MessageFormat.format(TENCENT_AUTHORIZE_PATTERN, AuthSource.TENCENT_CLOUD.authorize(), clientId, redirectUrl);
+ public static String getTencentCloudAuthorizeUrl(String clientId, String redirectUrl, String state) {
+ return MessageFormat.format(TENCENT_AUTHORIZE_PATTERN, AuthSource.TENCENT_CLOUD.authorize(), clientId, redirectUrl, getState(state));
}
/**
@@ -405,10 +410,11 @@ public class UrlBuilder {
*
* @param clientId oschina 应用的Client ID
* @param redirectUrl oschina 应用授权成功后的回调地址
+ * @param state 随机字符串,用于保持会话状态,防止CSRF攻击
* @return full url
*/
- public static String getOschinaAuthorizeUrl(String clientId, String redirectUrl) {
- return MessageFormat.format(OSCHINA_AUTHORIZE_PATTERN, AuthSource.OSCHINA.authorize(), clientId, redirectUrl);
+ public static String getOschinaAuthorizeUrl(String clientId, String redirectUrl, String state) {
+ return MessageFormat.format(OSCHINA_AUTHORIZE_PATTERN, AuthSource.OSCHINA.authorize(), clientId, redirectUrl, getState(state));
}
/**
@@ -441,10 +447,11 @@ public class UrlBuilder {
*
* @param clientId qq 应用的Client ID
* @param redirectUrl qq 应用授权成功后的回调地址
+ * @param state 随机字符串,用于保持会话状态,防止CSRF攻击
* @return full url
*/
- public static String getQqAuthorizeUrl(String clientId, String redirectUrl) {
- return MessageFormat.format(QQ_AUTHORIZE_PATTERN, AuthSource.QQ.authorize(), clientId, redirectUrl, System.currentTimeMillis());
+ public static String getQqAuthorizeUrl(String clientId, String redirectUrl, String state) {
+ return MessageFormat.format(QQ_AUTHORIZE_PATTERN, AuthSource.QQ.authorize(), clientId, redirectUrl, getState(state));
}
/**
@@ -464,10 +471,11 @@ public class UrlBuilder {
*
* @param clientId alipay 应用的Client ID
* @param redirectUrl alipay 应用授权成功后的回调地址
+ * @param state 随机字符串,用于保持会话状态,防止CSRF攻击
* @return full url
*/
- public static String getAlipayAuthorizeUrl(String clientId, String redirectUrl) {
- return MessageFormat.format(ALIPAY_AUTHORIZE_PATTERN, AuthSource.ALIPAY.authorize(), clientId, redirectUrl);
+ public static String getAlipayAuthorizeUrl(String clientId, String redirectUrl, String state) {
+ return MessageFormat.format(ALIPAY_AUTHORIZE_PATTERN, AuthSource.ALIPAY.authorize(), clientId, redirectUrl, getState(state));
}
/**
@@ -475,11 +483,11 @@ public class UrlBuilder {
*
* @param clientId 微信 应用的appid
* @param redirectUrl 微信 应用授权成功后的回调地址
+ * @param state 随机字符串,用于保持会话状态,防止CSRF攻击
* @return full url
*/
- public static String getWeChatAuthorizeUrl(String clientId, String redirectUrl) {
- return MessageFormat.format(WECHAT_AUTHORIZE_PATTERN, AuthSource.WECHAT.authorize(), clientId, redirectUrl, System
- .currentTimeMillis());
+ public static String getWeChatAuthorizeUrl(String clientId, String redirectUrl, String state) {
+ return MessageFormat.format(WECHAT_AUTHORIZE_PATTERN, AuthSource.WECHAT.authorize(), clientId, redirectUrl, getState(state));
}
/**
@@ -534,11 +542,11 @@ public class UrlBuilder {
*
* @param clientId Taobao 应用的Client ID
* @param redirectUrl Taobao 应用授权成功后的回调地址
+ * @param state 随机字符串,用于保持会话状态,防止CSRF攻击
* @return full url
*/
- public static String getTaobaoAuthorizeUrl(String clientId, String redirectUrl) {
- return MessageFormat.format(TAOBAO_AUTHORIZE_PATTERN, AuthSource.TAOBAO.authorize(), clientId, redirectUrl, System
- .currentTimeMillis());
+ public static String getTaobaoAuthorizeUrl(String clientId, String redirectUrl, String state) {
+ return MessageFormat.format(TAOBAO_AUTHORIZE_PATTERN, AuthSource.TAOBAO.authorize(), clientId, redirectUrl, getState(state));
}
/**
@@ -546,11 +554,11 @@ public class UrlBuilder {
*
* @param clientId google 应用的Client ID
* @param redirectUrl google 应用授权成功后的回调地址
+ * @param state 随机字符串,用于保持会话状态,防止CSRF攻击
* @return full url
*/
- public static String getGoogleAuthorizeUrl(String clientId, String redirectUrl) {
- return MessageFormat.format(GOOGLE_AUTHORIZE_PATTERN, AuthSource.GOOGLE.authorize(), clientId, redirectUrl, System
- .currentTimeMillis());
+ public static String getGoogleAuthorizeUrl(String clientId, String redirectUrl, String state) {
+ return MessageFormat.format(GOOGLE_AUTHORIZE_PATTERN, AuthSource.GOOGLE.authorize(), clientId, redirectUrl, getState(state));
}
/**
@@ -581,11 +589,11 @@ public class UrlBuilder {
*
* @param clientId Facebook 应用的Client ID
* @param redirectUrl Facebook 应用授权成功后的回调地址
+ * @param state 随机字符串,用于保持会话状态,防止CSRF攻击
* @return full url
*/
- public static String getFacebookAuthorizeUrl(String clientId, String redirectUrl) {
- return MessageFormat.format(FACEBOOK_AUTHORIZE_PATTERN, AuthSource.FACEBOOK.authorize(), clientId, redirectUrl, System
- .currentTimeMillis());
+ public static String getFacebookAuthorizeUrl(String clientId, String redirectUrl, String state) {
+ return MessageFormat.format(FACEBOOK_AUTHORIZE_PATTERN, AuthSource.FACEBOOK.authorize(), clientId, redirectUrl, getState(state));
}
/**
@@ -616,11 +624,11 @@ public class UrlBuilder {
*
* @param clientId Douyin 应用的Client ID
* @param redirectUrl Douyin 应用授权成功后的回调地址
+ * @param state 随机字符串,用于保持会话状态,防止CSRF攻击
* @return full url
*/
- public static String getDouyinAuthorizeUrl(String clientId, String redirectUrl) {
- return MessageFormat.format(DOUYIN_AUTHORIZE_PATTERN, AuthSource.DOUYIN.authorize(), clientId, redirectUrl, System
- .currentTimeMillis());
+ public static String getDouyinAuthorizeUrl(String clientId, String redirectUrl, String state) {
+ return MessageFormat.format(DOUYIN_AUTHORIZE_PATTERN, AuthSource.DOUYIN.authorize(), clientId, redirectUrl, getState(state));
}
/**
@@ -662,11 +670,11 @@ public class UrlBuilder {
*
* @param clientId Linkedin 应用的Client ID
* @param redirectUrl Linkedin 应用授权成功后的回调地址
+ * @param state 随机字符串,用于保持会话状态,防止CSRF攻击
* @return full url
*/
- public static String getLinkedinAuthorizeUrl(String clientId, String redirectUrl) {
- return MessageFormat.format(LINKEDIN_AUTHORIZE_PATTERN, AuthSource.LINKEDIN.authorize(), clientId, redirectUrl, System
- .currentTimeMillis());
+ public static String getLinkedinAuthorizeUrl(String clientId, String redirectUrl, String state) {
+ return MessageFormat.format(LINKEDIN_AUTHORIZE_PATTERN, AuthSource.LINKEDIN.authorize(), clientId, redirectUrl, state);
}
/**
@@ -708,11 +716,11 @@ public class UrlBuilder {
*
* @param clientId 微软 应用的Client ID
* @param redirectUrl 微软 应用授权成功后的回调地址
+ * @param state 随机字符串,用于保持会话状态,防止CSRF攻击
* @return full url
*/
- public static String getMicrosoftAuthorizeUrl(String clientId, String redirectUrl) {
- return MessageFormat.format(MICROSOFT_AUTHORIZE_PATTERN, AuthSource.MICROSOFT.authorize(), clientId, redirectUrl, System
- .currentTimeMillis());
+ public static String getMicrosoftAuthorizeUrl(String clientId, String redirectUrl, String state) {
+ return MessageFormat.format(MICROSOFT_AUTHORIZE_PATTERN, AuthSource.MICROSOFT.authorize(), clientId, redirectUrl, getState(state));
}
/**
@@ -755,10 +763,11 @@ public class UrlBuilder {
*
* @param clientId 小米 应用的Client ID
* @param redirectUrl 小米 应用授权成功后的回调地址
+ * @param state 随机字符串,用于保持会话状态,防止CSRF攻击
* @return full url
*/
- public static String getMiAuthorizeUrl(String clientId, String redirectUrl) {
- return MessageFormat.format(MI_AUTHORIZE_PATTERN, AuthSource.MI.authorize(), clientId, redirectUrl, System.currentTimeMillis());
+ public static String getMiAuthorizeUrl(String clientId, String redirectUrl, String state) {
+ return MessageFormat.format(MI_AUTHORIZE_PATTERN, AuthSource.MI.authorize(), clientId, redirectUrl, getState(state));
}
/**
@@ -803,11 +812,11 @@ public class UrlBuilder {
*
* @param clientId 今日头条 应用的Client ID
* @param redirectUrl 今日头条 应用授权成功后的回调地址
+ * @param state 随机字符串,用于保持会话状态,防止CSRF攻击
* @return full url
*/
- public static String getToutiaoAuthorizeUrl(String clientId, String redirectUrl) {
- return MessageFormat.format(TOUTIAO_AUTHORIZE_PATTERN, AuthSource.TOUTIAO.authorize(), clientId, redirectUrl, System
- .currentTimeMillis());
+ public static String getToutiaoAuthorizeUrl(String clientId, String redirectUrl, String state) {
+ return MessageFormat.format(TOUTIAO_AUTHORIZE_PATTERN, AuthSource.TOUTIAO.authorize(), clientId, redirectUrl, getState(state));
}
/**
diff --git a/src/test/java/me/zhyd/oauth/AuthRequestTest.java b/src/test/java/me/zhyd/oauth/AuthRequestTest.java
index 0bd0df6743047fd50fba374c91789f5a1ec302b3..713210eab85b4ca4c179acd10a26c81dfd92c9d2 100644
--- a/src/test/java/me/zhyd/oauth/AuthRequestTest.java
+++ b/src/test/java/me/zhyd/oauth/AuthRequestTest.java
@@ -1,6 +1,7 @@
package me.zhyd.oauth;
import me.zhyd.oauth.config.AuthConfig;
+import me.zhyd.oauth.model.AuthCallback;
import me.zhyd.oauth.model.AuthResponse;
import me.zhyd.oauth.request.*;
import org.junit.Test;
@@ -18,11 +19,12 @@ public class AuthRequestTest {
.clientId("clientId")
.clientSecret("clientSecret")
.redirectUri("redirectUri")
+ .state("state")
.build());
// 返回授权页面,可自行调整
authRequest.authorize();
// 授权登录后会返回一个code,用这个code进行登录
- authRequest.login("code");
+ authRequest.login(new AuthCallback());
}
@Test
@@ -31,11 +33,12 @@ public class AuthRequestTest {
.clientId("clientId")
.clientSecret("clientSecret")
.redirectUri("redirectUri")
+ .state("state")
.build());
// 返回授权页面,可自行调整
authRequest.authorize();
// 授权登录后会返回一个code,用这个code进行登录
- authRequest.login("code");
+ authRequest.login(new AuthCallback());
}
@Test
@@ -48,7 +51,7 @@ public class AuthRequestTest {
// 返回授权页面,可自行调整
authRequest.authorize();
// 授权登录后会返回一个code,用这个code进行登录
- authRequest.login("code");
+ authRequest.login(new AuthCallback());
}
@Test
@@ -57,11 +60,12 @@ public class AuthRequestTest {
.clientId("clientId")
.clientSecret("clientSecret")
.redirectUri("redirectUri")
+ .state("state")
.build());
// 返回授权页面,可自行调整
String url = authRequest.authorize();
// 授权登录后会返回一个code,用这个code进行登录
- authRequest.login("code");
+ authRequest.login(new AuthCallback());
}
@Test
@@ -70,11 +74,12 @@ public class AuthRequestTest {
.clientId("clientId")
.clientSecret("clientSecret")
.redirectUri("redirectUri")
+ .state("state")
.build());
// 返回授权页面,可自行调整
String url = authRequest.authorize();
// 授权登录后会返回一个code,用这个code进行登录
- authRequest.login("code");
+ authRequest.login(new AuthCallback());
}
@Test
@@ -83,11 +88,12 @@ public class AuthRequestTest {
.clientId("clientId")
.clientSecret("clientSecret")
.redirectUri("redirectUri")
+ .state("state")
.build());
// 返回授权页面,可自行调整
String url = authRequest.authorize();
// 授权登录后会返回一个code,用这个code进行登录
- authRequest.login("code");
+ authRequest.login(new AuthCallback());
}
@Test
@@ -96,11 +102,12 @@ public class AuthRequestTest {
.clientId("clientId")
.clientSecret("clientSecret")
.redirectUri("redirectUri")
+ .state("state")
.build());
// 返回授权页面,可自行调整
String url = authRequest.authorize();
// 授权登录后会返回一个code,用这个code进行登录
- authRequest.login("code");
+ authRequest.login(new AuthCallback());
}
@Test
@@ -109,11 +116,26 @@ public class AuthRequestTest {
.clientId("clientId")
.clientSecret("clientSecret")
.redirectUri("redirectUri")
+ .state("state")
.build());
// 返回授权页面,可自行调整
String url = authRequest.authorize();
// 授权登录后会返回一个code,用这个code进行登录
- authRequest.login("code");
+ authRequest.login(new AuthCallback());
+ }
+
+ @Test
+ public void alipayTest() {
+ AuthRequest authRequest = new AuthAlipayRequest(AuthConfig.builder()
+ .clientId("clientId")
+ .clientSecret("clientSecret")
+ .redirectUri("redirectUri")
+ .state("state")
+ .build());
+ // 返回授权页面,可自行调整
+ String url = authRequest.authorize();
+ // 授权登录后会返回一个code,用这个code进行登录
+ AuthResponse login = authRequest.login(new AuthCallback());
}
@Test
@@ -122,11 +144,12 @@ public class AuthRequestTest {
.clientId("clientId")
.clientSecret("clientSecret")
.redirectUri("redirectUri")
+ .state("state")
.build());
// 返回授权页面,可自行调整
String url = authRequest.authorize();
// 授权登录后会返回一个code,用这个code进行登录
- AuthResponse login = authRequest.login("code");
+ AuthResponse login = authRequest.login(new AuthCallback());
}
@Test
@@ -135,11 +158,26 @@ public class AuthRequestTest {
.clientId("clientId")
.clientSecret("clientSecret")
.redirectUri("redirectUri")
+ .state("state")
.build());
// 返回授权页面,可自行调整
String url = authRequest.authorize();
// 授权登录后会返回一个code,用这个code进行登录
- AuthResponse login = authRequest.login("code");
+ AuthResponse login = authRequest.login(new AuthCallback());
+ }
+
+ @Test
+ public void taobaoTest() {
+ AuthRequest authRequest = new AuthTaobaoRequest(AuthConfig.builder()
+ .clientId("clientId")
+ .clientSecret("clientSecret")
+ .redirectUri("redirectUri")
+ .state("state")
+ .build());
+ // 返回授权页面,可自行调整
+ String url = authRequest.authorize();
+ // 授权登录后会返回一个code,用这个code进行登录
+ AuthResponse login = authRequest.login(new AuthCallback());
}
@Test
@@ -148,11 +186,12 @@ public class AuthRequestTest {
.clientId("clientId")
.clientSecret("clientSecret")
.redirectUri("redirectUri")
+ .state("state")
.build());
// 返回授权页面,可自行调整
String url = authRequest.authorize();
// 授权登录后会返回一个code,用这个code进行登录
- AuthResponse login = authRequest.login("code");
+ AuthResponse login = authRequest.login(new AuthCallback());
}
@Test
@@ -161,11 +200,40 @@ public class AuthRequestTest {
.clientId("clientId")
.clientSecret("clientSecret")
.redirectUri("redirectUri")
+ .state("state")
+ .build());
+ // 返回授权页面,可自行调整
+ String url = authRequest.authorize();
+ // 授权登录后会返回一个code,用这个code进行登录
+ AuthResponse login = authRequest.login(new AuthCallback());
+ }
+
+ @Test
+ public void douyinTest() {
+ AuthRequest authRequest = new AuthDouyinRequest(AuthConfig.builder()
+ .clientId("clientId")
+ .clientSecret("clientSecret")
+ .redirectUri("redirectUri")
+ .state("state")
.build());
// 返回授权页面,可自行调整
String url = authRequest.authorize();
// 授权登录后会返回一个code,用这个code进行登录
- AuthResponse login = authRequest.login("code");
+ AuthResponse login = authRequest.login(new AuthCallback());
+ }
+
+ @Test
+ public void linkedinTest() {
+ AuthRequest authRequest = new AuthLinkedinRequest(AuthConfig.builder()
+ .clientId("clientId")
+ .clientSecret("clientSecret")
+ .redirectUri("redirectUri")
+ .state("state")
+ .build());
+ // 返回授权页面,可自行调整
+ String url = authRequest.authorize();
+ // 授权登录后会返回一个code,用这个code进行登录
+ AuthResponse login = authRequest.login(new AuthCallback());
}
@Test
@@ -174,11 +242,12 @@ public class AuthRequestTest {
.clientId("clientId")
.clientSecret("clientSecret")
.redirectUri("redirectUri")
+ .state("state")
.build());
// 返回授权页面,可自行调整
String url = authRequest.authorize();
// 授权登录后会返回一个code,用这个code进行登录
- AuthResponse login = authRequest.login("code");
+ AuthResponse login = authRequest.login(new AuthCallback());
}
@Test
@@ -187,10 +256,25 @@ public class AuthRequestTest {
.clientId("clientId")
.clientSecret("clientSecret")
.redirectUri("redirectUri")
+ .state("state")
+ .build());
+ // 返回授权页面,可自行调整
+ String url = authRequest.authorize();
+ // 授权登录后会返回一个code,用这个code进行登录
+ AuthResponse login = authRequest.login(new AuthCallback());
+ }
+
+ @Test
+ public void toutiaoTest() {
+ AuthRequest authRequest = new AuthToutiaoRequest(AuthConfig.builder()
+ .clientId("clientId")
+ .clientSecret("clientSecret")
+ .redirectUri("redirectUri")
+ .state("state")
.build());
// 返回授权页面,可自行调整
String url = authRequest.authorize();
// 授权登录后会返回一个code,用这个code进行登录
- AuthResponse login = authRequest.login("code");
+ AuthResponse login = authRequest.login(new AuthCallback());
}
}
diff --git a/update.md b/update.md
index 785a3d7ab362401e1c906ebcffd72bd2cac9f29d..f875c77bb546e1e89b78e88df11189c0a8c2284f 100644
--- a/update.md
+++ b/update.md
@@ -1,6 +1,6 @@
### 2019/06/28
1. 修复百度登录获取不到token失效时间的问题
-2. gitee增加state参数校验
+2. 增加state参数校验,预防CSRF。强烈建议启用state!
### 2019/06/27
1. 修改login方法的参数为AuthCallback,封装回调返回的参数