Skip to content

Commit ebbb334

Browse files
committed
✨ 优化 OneDrive/SharePoint 获取 token 体验,增加信息显示,并优化页面效果。
1 parent b393607 commit ebbb334

File tree

8 files changed

+231
-55
lines changed

8 files changed

+231
-55
lines changed
Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package im.zhaojun.zfile.admin.model.dto;
22

3-
import com.alibaba.fastjson.annotation.JSONField;
43
import lombok.Data;
54

65
/**
@@ -10,11 +9,41 @@
109
*/
1110
@Data
1211
public class OneDriveToken {
12+
13+
private String clientId;
14+
15+
private String clientSecret;
16+
17+
private String redirectUri;
1318

14-
@JSONField(name = "access_token")
1519
private String accessToken;
1620

17-
@JSONField(name = "refresh_token")
1821
private String refreshToken;
22+
23+
private boolean success;
24+
25+
private String body;
26+
27+
public static OneDriveToken success(String clientId, String clientSecret, String redirectUri, String accessToken, String refreshToken, String body) {
28+
OneDriveToken token = new OneDriveToken();
29+
token.setClientId(clientId);
30+
token.setClientSecret(clientSecret);
31+
token.setRedirectUri(redirectUri);
32+
token.setSuccess(true);
33+
token.setBody(body);
34+
token.setAccessToken(accessToken);
35+
token.setRefreshToken(refreshToken);
36+
return token;
37+
}
38+
39+
public static OneDriveToken fail(String clientId, String clientSecret, String redirectUri, String body) {
40+
OneDriveToken token = new OneDriveToken();
41+
token.setClientId(clientId);
42+
token.setClientSecret(clientSecret);
43+
token.setRedirectUri(redirectUri);
44+
token.setSuccess(false);
45+
token.setBody(body);
46+
return token;
47+
}
1948

2049
}

src/main/java/im/zhaojun/zfile/common/controller/callback/OneDriveCallbackController.java

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import im.zhaojun.zfile.home.service.impl.OneDriveServiceImpl;
99
import io.swagger.annotations.Api;
1010
import io.swagger.annotations.ApiOperation;
11+
import lombok.extern.slf4j.Slf4j;
1112
import org.springframework.stereotype.Controller;
1213
import org.springframework.ui.Model;
1314
import org.springframework.web.bind.annotation.GetMapping;
@@ -22,6 +23,7 @@
2223
*/
2324
@Api(tags = "OneDrive 认证回调模块")
2425
@Controller
26+
@Slf4j
2527
@RequestMapping(value = {"/onedrive", "/onedirve"})
2628
public class OneDriveCallbackController {
2729

@@ -36,19 +38,24 @@ public class OneDriveCallbackController {
3638
@ApiOperationSupport(order = 1)
3739
@ApiOperation(value = "生成 OAuth2 登陆 URL", notes = "生成 OneDrive OAuth2 登陆 URL,用户国际版,家庭版等非世纪互联运营的 OneDrive.")
3840
public String authorize(String clientId, String clientSecret, String redirectUri) {
41+
log.info("onedrive 国际版生成授权链接参数信息: clientId: {}, clientSecret: {}, redirectUri: {}", clientId, clientSecret, redirectUri);
42+
3943
if (StrUtil.isAllEmpty(clientId, clientSecret, redirectUri)) {
4044
clientId = oneDriveServiceImpl.getClientId();
4145
redirectUri = oneDriveServiceImpl.getRedirectUri();
4246
clientSecret = oneDriveServiceImpl.getClientSecret();
4347
}
48+
4449

4550
String stateStr = "&state=" + Base64.encodeUrlSafe(StrUtil.join("::", clientId, clientSecret, redirectUri));
4651

47-
4852
String authorizeUrl = "https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=" + clientId
4953
+ "&response_type=code&redirect_uri=" + redirectUri
5054
+ "&scope=" + oneDriveServiceImpl.getScope()
5155
+ stateStr;
56+
57+
log.info("onedrive 国际版生成授权链接结果: {}", authorizeUrl);
58+
5259
return "redirect:" + authorizeUrl;
5360
}
5461

@@ -57,11 +64,15 @@ public String authorize(String clientId, String clientSecret, String redirectUri
5764
@ApiOperationSupport(order = 2)
5865
@ApiOperation(value = "OAuth2 回调地址", notes = "根据 OAuth2 协议,登录成功后,会返回给网站一个 code,用此 code 去换取 accessToken 和 refreshToken.(oneDrive 会回调此接口)")
5966
public String oneDriveCallback(String code, String state, Model model) {
67+
log.info("onedrive 国际版授权回调参数信息: code: {}, state: {}", code, state);
68+
6069
String stateDecode = Base64.decodeStr(state);
6170
String[] stateArr = stateDecode.split("::");
71+
6272
OneDriveToken oneDriveToken = oneDriveServiceImpl.getToken(code, stateArr[0], stateArr[1], stateArr[2]);
63-
model.addAttribute("accessToken", oneDriveToken.getAccessToken());
64-
model.addAttribute("refreshToken", oneDriveToken.getRefreshToken());
73+
log.info("onedrive 国际版授权回调获取令牌结果: {}", oneDriveToken);
74+
75+
model.addAttribute("oneDriveToken", oneDriveToken);
6576
return "callback";
6677
}
6778

@@ -70,6 +81,8 @@ public String oneDriveCallback(String code, String state, Model model) {
7081
@ApiOperationSupport(order = 3)
7182
@ApiOperation(value = "生成 OAuth2 登陆 URL(世纪互联)", notes = "生成 OneDrive OAuth2 登陆 URL,用于世纪互联版本.")
7283
public String authorizeChina(String clientId, String clientSecret, String redirectUri) {
84+
log.info("onedrive 世纪互联版生成授权链接参数信息: clientId: {}, clientSecret: {}, redirectUri: {}", clientId, clientSecret, redirectUri);
85+
7386
if (StrUtil.isAllEmpty(clientId, clientSecret, redirectUri)) {
7487
clientId = oneDriveChinaServiceImpl.getClientId();
7588
redirectUri = oneDriveChinaServiceImpl.getRedirectUri();
@@ -83,6 +96,9 @@ public String authorizeChina(String clientId, String clientSecret, String redire
8396
+ "&response_type=code&redirect_uri=" + redirectUri
8497
+ "&scope=" + oneDriveChinaServiceImpl.getScope()
8598
+ stateStr;
99+
100+
log.info("onedrive 世纪互联版生成授权链接结果: {}", authorizeUrl);
101+
86102
return "redirect:" + authorizeUrl;
87103
}
88104

@@ -91,11 +107,15 @@ public String authorizeChina(String clientId, String clientSecret, String redire
91107
@ApiOperationSupport(order = 4)
92108
@ApiOperation(value = "OAuth2 回调地址(世纪互联)", notes = "根据 OAuth2 协议,登录成功后,会返回给网站一个 code,用此 code 去换取 accessToken 和 refreshToken.(oneDrive 会回调此接口)")
93109
public String oneDriveChinaCallback(String code, String state, Model model) {
110+
log.info("onedrive 世纪互联版授权回调参数信息: code: {}, state: {}", code, state);
111+
94112
String stateDecode = Base64.decodeStr(state);
95113
String[] stateArr = stateDecode.split("::");
114+
96115
OneDriveToken oneDriveToken = oneDriveChinaServiceImpl.getToken(code, stateArr[0], stateArr[1], stateArr[2]);
97-
model.addAttribute("accessToken", oneDriveToken.getAccessToken());
98-
model.addAttribute("refreshToken", oneDriveToken.getRefreshToken());
116+
log.info("onedrive 世纪互联版授权回调获取令牌结果: {}", oneDriveToken);
117+
118+
model.addAttribute("oneDriveToken", oneDriveToken);
99119
return "callback";
100120
}
101121

src/main/java/im/zhaojun/zfile/home/service/base/MicrosoftDriveServiceBase.java

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -99,16 +99,26 @@ public OneDriveToken getRefreshToken() {
9999
"&client_secret=" + getClientSecret() +
100100
"&refresh_token=" + refreshStorageSourceConfig.getValue() +
101101
"&grant_type=refresh_token";
102-
102+
103+
log.info("{} 尝试刷新令牌, 参数信息为: {}", this, param);
104+
103105
String fullAuthenticateUrl = AUTHENTICATE_URL.replace("{authenticateEndPoint}", getAuthenticateEndPoint());
104106
HttpRequest post = HttpUtil.createPost(fullAuthenticateUrl);
105107

106108
post.body(param, "application/x-www-form-urlencoded");
107109
HttpResponse response = post.execute();
110+
String body = response.body();
111+
log.info("{} 尝试刷新令牌成功, 响应信息为: {}", this, body);
112+
113+
JSONObject jsonBody = JSONObject.parseObject(body);
114+
108115
if (response.getStatus() != HttpStatus.OK.value()) {
109-
throw new RuntimeException(response.body());
116+
return OneDriveToken.fail(getClientId(), getClientSecret(), getRedirectUri(), body);
110117
}
111-
return JSONObject.parseObject(response.body(), OneDriveToken.class);
118+
119+
String accessToken = jsonBody.getString("access_token");
120+
String refreshToken = jsonBody.getString("refresh_token");
121+
return OneDriveToken.success(getClientId(), getClientSecret(), getRedirectUri(), accessToken, refreshToken, body);
112122
}
113123

114124
/**
@@ -120,6 +130,7 @@ public OneDriveToken getRefreshToken() {
120130
* @return 获取的 Token 信息.
121131
*/
122132
public OneDriveToken getToken(String code, String clientId, String clientSecret, String redirectUri) {
133+
log.info("{} 根据授权回调 code 获取令牌:code: {}, clientId: {}, clientSecret: {}, redirectUri: {}", this, code, clientId, clientSecret, redirectUri);
123134
String param = "client_id=" + clientId +
124135
"&redirect_uri=" + redirectUri +
125136
"&client_secret=" + clientSecret +
@@ -132,7 +143,17 @@ public OneDriveToken getToken(String code, String clientId, String clientSecret,
132143

133144
post.body(param, "application/x-www-form-urlencoded");
134145
HttpResponse response = post.execute();
135-
return JSONObject.parseObject(response.body(), OneDriveToken.class);
146+
String body = response.body();
147+
log.info("{} 根据授权回调 code 获取令牌结果:body: {}", this, body);
148+
JSONObject jsonBody = JSONObject.parseObject(body);
149+
150+
if (response.getStatus() != HttpStatus.OK.value()) {
151+
return OneDriveToken.fail(clientId, clientSecret, redirectUri, body);
152+
}
153+
154+
String accessToken = jsonBody.getString("access_token");
155+
String refreshToken = jsonBody.getString("refresh_token");
156+
return OneDriveToken.success(clientId, clientSecret, redirectUri, accessToken, refreshToken, body);
136157
}
137158

138159
@Override
@@ -365,7 +386,7 @@ public void refreshAccessToken() {
365386
OneDriveToken refreshToken = getRefreshToken();
366387

367388
if (refreshToken.getAccessToken() == null || refreshToken.getRefreshToken() == null) {
368-
return;
389+
throw new StorageSourceRefreshTokenException("获取或刷新 AccessToken 失败, 获取到的令牌为空, 相关诊断信息为: " + refreshToken, storageId);
369390
}
370391

371392
StorageSourceConfig accessTokenConfig =

src/main/java/im/zhaojun/zfile/home/service/impl/OneDriveChinaServiceImpl.java

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package im.zhaojun.zfile.home.service.impl;
22

3-
import cn.hutool.core.util.ObjectUtil;
43
import im.zhaojun.zfile.admin.model.param.OneDriveChinaParam;
54
import im.zhaojun.zfile.home.model.enums.StorageTypeEnum;
65
import im.zhaojun.zfile.home.service.base.AbstractOneDriveServiceBase;
@@ -44,22 +43,31 @@ public String getGraphEndPoint() {
4443
public String getAuthenticateEndPoint() {
4544
return "login.partner.microsoftonline.cn";
4645
}
47-
46+
4847
@Override
4948
public String getClientId() {
50-
return ObjectUtil.defaultIfNull(param.getClientId(), clientId);
49+
if (param == null || param.getClientId() == null) {
50+
return clientId;
51+
}
52+
return param.getClientId();
5153
}
52-
54+
5355
@Override
5456
public String getRedirectUri() {
55-
return ObjectUtil.defaultIfNull(param.getRedirectUri(), redirectUri);
57+
if (param == null || param.getRedirectUri() == null) {
58+
return redirectUri;
59+
}
60+
return param.getRedirectUri();
5661
}
57-
62+
5863
@Override
5964
public String getClientSecret() {
60-
return ObjectUtil.defaultIfNull(param.getClientSecret(), clientSecret);
65+
if (param == null || param.getClientSecret() == null) {
66+
return clientSecret;
67+
}
68+
return param.getClientSecret();
6169
}
62-
70+
6371
@Override
6472
public String getScope() {
6573
return scope;

src/main/java/im/zhaojun/zfile/home/service/impl/OneDriveServiceImpl.java

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
package im.zhaojun.zfile.home.service.impl;
22

3-
import cn.hutool.core.util.ObjectUtil;
4-
import im.zhaojun.zfile.home.model.enums.StorageTypeEnum;
53
import im.zhaojun.zfile.admin.model.param.OneDriveParam;
4+
import im.zhaojun.zfile.home.model.enums.StorageTypeEnum;
65
import im.zhaojun.zfile.home.service.base.AbstractOneDriveServiceBase;
76
import lombok.extern.slf4j.Slf4j;
87
import org.springframework.beans.factory.annotation.Value;
@@ -47,17 +46,26 @@ public String getAuthenticateEndPoint() {
4746

4847
@Override
4948
public String getClientId() {
50-
return ObjectUtil.defaultIfNull(param.getClientId(), clientId);
49+
if (param == null || param.getClientId() == null) {
50+
return clientId;
51+
}
52+
return param.getClientId();
5153
}
5254

5355
@Override
5456
public String getRedirectUri() {
55-
return ObjectUtil.defaultIfNull(param.getRedirectUri(), redirectUri);
57+
if (param == null || param.getRedirectUri() == null) {
58+
return redirectUri;
59+
}
60+
return param.getRedirectUri();
5661
}
5762

5863
@Override
5964
public String getClientSecret() {
60-
return ObjectUtil.defaultIfNull(param.getClientSecret(), clientSecret);
65+
if (param == null || param.getClientSecret() == null) {
66+
return clientSecret;
67+
}
68+
return param.getClientSecret();
6169
}
6270

6371
@Override

src/main/java/im/zhaojun/zfile/home/service/impl/SharePointChinaServiceImpl.java

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
package im.zhaojun.zfile.home.service.impl;
22

3-
import cn.hutool.core.util.ObjectUtil;
4-
import im.zhaojun.zfile.home.model.enums.StorageTypeEnum;
53
import im.zhaojun.zfile.admin.model.param.SharePointChinaParam;
4+
import im.zhaojun.zfile.home.model.enums.StorageTypeEnum;
65
import im.zhaojun.zfile.home.service.base.AbstractSharePointServiceBase;
76
import lombok.extern.slf4j.Slf4j;
87
import org.springframework.beans.factory.annotation.Value;
@@ -47,19 +46,28 @@ public String getAuthenticateEndPoint() {
4746

4847
@Override
4948
public String getClientId() {
50-
return ObjectUtil.defaultIfNull(param.getClientId(), clientId);
49+
if (param == null || param.getClientId() == null) {
50+
return clientId;
51+
}
52+
return param.getClientId();
5153
}
5254

5355
@Override
5456
public String getRedirectUri() {
55-
return ObjectUtil.defaultIfNull(param.getRedirectUri(), redirectUri);
57+
if (param == null || param.getRedirectUri() == null) {
58+
return redirectUri;
59+
}
60+
return param.getRedirectUri();
5661
}
5762

5863
@Override
5964
public String getClientSecret() {
60-
return ObjectUtil.defaultIfNull(param.getClientSecret(), clientSecret);
65+
if (param == null || param.getClientSecret() == null) {
66+
return clientSecret;
67+
}
68+
return param.getClientSecret();
6169
}
62-
70+
6371
@Override
6472
public String getScope() {
6573
return scope;

src/main/java/im/zhaojun/zfile/home/service/impl/SharePointServiceImpl.java

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
package im.zhaojun.zfile.home.service.impl;
22

3-
import cn.hutool.core.util.ObjectUtil;
4-
import im.zhaojun.zfile.home.model.enums.StorageTypeEnum;
53
import im.zhaojun.zfile.admin.model.param.SharePointParam;
4+
import im.zhaojun.zfile.home.model.enums.StorageTypeEnum;
65
import im.zhaojun.zfile.home.service.base.AbstractSharePointServiceBase;
76
import lombok.extern.slf4j.Slf4j;
87
import org.springframework.beans.factory.annotation.Value;
@@ -47,19 +46,28 @@ public String getAuthenticateEndPoint() {
4746

4847
@Override
4948
public String getClientId() {
50-
return ObjectUtil.defaultIfNull(param.getClientId(), clientId);
49+
if (param == null || param.getClientId() == null) {
50+
return clientId;
51+
}
52+
return param.getClientId();
5153
}
5254

5355
@Override
5456
public String getRedirectUri() {
55-
return ObjectUtil.defaultIfNull(param.getRedirectUri(), redirectUri);
57+
if (param == null || param.getRedirectUri() == null) {
58+
return redirectUri;
59+
}
60+
return param.getRedirectUri();
5661
}
5762

5863
@Override
5964
public String getClientSecret() {
60-
return ObjectUtil.defaultIfNull(param.getClientSecret(), clientSecret);
65+
if (param == null || param.getClientSecret() == null) {
66+
return clientSecret;
67+
}
68+
return param.getClientSecret();
6169
}
62-
70+
6371
@Override
6472
public String getScope() {
6573
return scope;

0 commit comments

Comments
 (0)