优化 OneDrive/SharePoint 获取 token 体验,增加信息显示,并优化页面效果。

This commit is contained in:
zhaojun
2022-08-15 13:29:35 +08:00
parent b39360791f
commit ebbb33409f
8 changed files with 232 additions and 56 deletions

View File

@@ -1,6 +1,5 @@
package im.zhaojun.zfile.admin.model.dto;
import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data;
/**
@@ -10,11 +9,41 @@ import lombok.Data;
*/
@Data
public class OneDriveToken {
private String clientId;
private String clientSecret;
private String redirectUri;
@JSONField(name = "access_token")
private String accessToken;
@JSONField(name = "refresh_token")
private String refreshToken;
private boolean success;
private String body;
public static OneDriveToken success(String clientId, String clientSecret, String redirectUri, String accessToken, String refreshToken, String body) {
OneDriveToken token = new OneDriveToken();
token.setClientId(clientId);
token.setClientSecret(clientSecret);
token.setRedirectUri(redirectUri);
token.setSuccess(true);
token.setBody(body);
token.setAccessToken(accessToken);
token.setRefreshToken(refreshToken);
return token;
}
public static OneDriveToken fail(String clientId, String clientSecret, String redirectUri, String body) {
OneDriveToken token = new OneDriveToken();
token.setClientId(clientId);
token.setClientSecret(clientSecret);
token.setRedirectUri(redirectUri);
token.setSuccess(false);
token.setBody(body);
return token;
}
}

View File

@@ -8,6 +8,7 @@ import im.zhaojun.zfile.home.service.impl.OneDriveChinaServiceImpl;
import im.zhaojun.zfile.home.service.impl.OneDriveServiceImpl;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@@ -22,6 +23,7 @@ import javax.annotation.Resource;
*/
@Api(tags = "OneDrive 认证回调模块")
@Controller
@Slf4j
@RequestMapping(value = {"/onedrive", "/onedirve"})
public class OneDriveCallbackController {
@@ -36,19 +38,24 @@ public class OneDriveCallbackController {
@ApiOperationSupport(order = 1)
@ApiOperation(value = "生成 OAuth2 登陆 URL", notes = "生成 OneDrive OAuth2 登陆 URL用户国际版家庭版等非世纪互联运营的 OneDrive.")
public String authorize(String clientId, String clientSecret, String redirectUri) {
log.info("onedrive 国际版生成授权链接参数信息: clientId: {}, clientSecret: {}, redirectUri: {}", clientId, clientSecret, redirectUri);
if (StrUtil.isAllEmpty(clientId, clientSecret, redirectUri)) {
clientId = oneDriveServiceImpl.getClientId();
redirectUri = oneDriveServiceImpl.getRedirectUri();
clientSecret = oneDriveServiceImpl.getClientSecret();
}
String stateStr = "&state=" + Base64.encodeUrlSafe(StrUtil.join("::", clientId, clientSecret, redirectUri));
String authorizeUrl = "https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=" + clientId
+ "&response_type=code&redirect_uri=" + redirectUri
+ "&scope=" + oneDriveServiceImpl.getScope()
+ stateStr;
log.info("onedrive 国际版生成授权链接结果: {}", authorizeUrl);
return "redirect:" + authorizeUrl;
}
@@ -57,11 +64,15 @@ public class OneDriveCallbackController {
@ApiOperationSupport(order = 2)
@ApiOperation(value = "OAuth2 回调地址", notes = "根据 OAuth2 协议,登录成功后,会返回给网站一个 code用此 code 去换取 accessToken 和 refreshToken.oneDrive 会回调此接口)")
public String oneDriveCallback(String code, String state, Model model) {
log.info("onedrive 国际版授权回调参数信息: code: {}, state: {}", code, state);
String stateDecode = Base64.decodeStr(state);
String[] stateArr = stateDecode.split("::");
OneDriveToken oneDriveToken = oneDriveServiceImpl.getToken(code, stateArr[0], stateArr[1], stateArr[2]);
model.addAttribute("accessToken", oneDriveToken.getAccessToken());
model.addAttribute("refreshToken", oneDriveToken.getRefreshToken());
log.info("onedrive 国际版授权回调获取令牌结果: {}", oneDriveToken);
model.addAttribute("oneDriveToken", oneDriveToken);
return "callback";
}
@@ -70,6 +81,8 @@ public class OneDriveCallbackController {
@ApiOperationSupport(order = 3)
@ApiOperation(value = "生成 OAuth2 登陆 URL(世纪互联)", notes = "生成 OneDrive OAuth2 登陆 URL用于世纪互联版本.")
public String authorizeChina(String clientId, String clientSecret, String redirectUri) {
log.info("onedrive 世纪互联版生成授权链接参数信息: clientId: {}, clientSecret: {}, redirectUri: {}", clientId, clientSecret, redirectUri);
if (StrUtil.isAllEmpty(clientId, clientSecret, redirectUri)) {
clientId = oneDriveChinaServiceImpl.getClientId();
redirectUri = oneDriveChinaServiceImpl.getRedirectUri();
@@ -83,6 +96,9 @@ public class OneDriveCallbackController {
+ "&response_type=code&redirect_uri=" + redirectUri
+ "&scope=" + oneDriveChinaServiceImpl.getScope()
+ stateStr;
log.info("onedrive 世纪互联版生成授权链接结果: {}", authorizeUrl);
return "redirect:" + authorizeUrl;
}
@@ -91,11 +107,15 @@ public class OneDriveCallbackController {
@ApiOperationSupport(order = 4)
@ApiOperation(value = "OAuth2 回调地址(世纪互联)", notes = "根据 OAuth2 协议,登录成功后,会返回给网站一个 code用此 code 去换取 accessToken 和 refreshToken.oneDrive 会回调此接口)")
public String oneDriveChinaCallback(String code, String state, Model model) {
log.info("onedrive 世纪互联版授权回调参数信息: code: {}, state: {}", code, state);
String stateDecode = Base64.decodeStr(state);
String[] stateArr = stateDecode.split("::");
OneDriveToken oneDriveToken = oneDriveChinaServiceImpl.getToken(code, stateArr[0], stateArr[1], stateArr[2]);
model.addAttribute("accessToken", oneDriveToken.getAccessToken());
model.addAttribute("refreshToken", oneDriveToken.getRefreshToken());
log.info("onedrive 世纪互联版授权回调获取令牌结果: {}", oneDriveToken);
model.addAttribute("oneDriveToken", oneDriveToken);
return "callback";
}

View File

@@ -99,16 +99,26 @@ public abstract class MicrosoftDriveServiceBase<P extends MicrosoftDriveParam> e
"&client_secret=" + getClientSecret() +
"&refresh_token=" + refreshStorageSourceConfig.getValue() +
"&grant_type=refresh_token";
log.info("{} 尝试刷新令牌, 参数信息为: {}", this, param);
String fullAuthenticateUrl = AUTHENTICATE_URL.replace("{authenticateEndPoint}", getAuthenticateEndPoint());
HttpRequest post = HttpUtil.createPost(fullAuthenticateUrl);
post.body(param, "application/x-www-form-urlencoded");
HttpResponse response = post.execute();
String body = response.body();
log.info("{} 尝试刷新令牌成功, 响应信息为: {}", this, body);
JSONObject jsonBody = JSONObject.parseObject(body);
if (response.getStatus() != HttpStatus.OK.value()) {
throw new RuntimeException(response.body());
return OneDriveToken.fail(getClientId(), getClientSecret(), getRedirectUri(), body);
}
return JSONObject.parseObject(response.body(), OneDriveToken.class);
String accessToken = jsonBody.getString("access_token");
String refreshToken = jsonBody.getString("refresh_token");
return OneDriveToken.success(getClientId(), getClientSecret(), getRedirectUri(), accessToken, refreshToken, body);
}
/**
@@ -120,6 +130,7 @@ public abstract class MicrosoftDriveServiceBase<P extends MicrosoftDriveParam> e
* @return 获取的 Token 信息.
*/
public OneDriveToken getToken(String code, String clientId, String clientSecret, String redirectUri) {
log.info("{} 根据授权回调 code 获取令牌code: {}, clientId: {}, clientSecret: {}, redirectUri: {}", this, code, clientId, clientSecret, redirectUri);
String param = "client_id=" + clientId +
"&redirect_uri=" + redirectUri +
"&client_secret=" + clientSecret +
@@ -132,7 +143,17 @@ public abstract class MicrosoftDriveServiceBase<P extends MicrosoftDriveParam> e
post.body(param, "application/x-www-form-urlencoded");
HttpResponse response = post.execute();
return JSONObject.parseObject(response.body(), OneDriveToken.class);
String body = response.body();
log.info("{} 根据授权回调 code 获取令牌结果body: {}", this, body);
JSONObject jsonBody = JSONObject.parseObject(body);
if (response.getStatus() != HttpStatus.OK.value()) {
return OneDriveToken.fail(clientId, clientSecret, redirectUri, body);
}
String accessToken = jsonBody.getString("access_token");
String refreshToken = jsonBody.getString("refresh_token");
return OneDriveToken.success(clientId, clientSecret, redirectUri, accessToken, refreshToken, body);
}
@Override
@@ -365,7 +386,7 @@ public abstract class MicrosoftDriveServiceBase<P extends MicrosoftDriveParam> e
OneDriveToken refreshToken = getRefreshToken();
if (refreshToken.getAccessToken() == null || refreshToken.getRefreshToken() == null) {
return;
throw new StorageSourceRefreshTokenException("获取或刷新 AccessToken 失败, 获取到的令牌为空, 相关诊断信息为: " + refreshToken, storageId);
}
StorageSourceConfig accessTokenConfig =

View File

@@ -1,6 +1,5 @@
package im.zhaojun.zfile.home.service.impl;
import cn.hutool.core.util.ObjectUtil;
import im.zhaojun.zfile.admin.model.param.OneDriveChinaParam;
import im.zhaojun.zfile.home.model.enums.StorageTypeEnum;
import im.zhaojun.zfile.home.service.base.AbstractOneDriveServiceBase;
@@ -44,22 +43,31 @@ public class OneDriveChinaServiceImpl extends AbstractOneDriveServiceBase<OneDri
public String getAuthenticateEndPoint() {
return "login.partner.microsoftonline.cn";
}
@Override
public String getClientId() {
return ObjectUtil.defaultIfNull(param.getClientId(), clientId);
if (param == null || param.getClientId() == null) {
return clientId;
}
return param.getClientId();
}
@Override
public String getRedirectUri() {
return ObjectUtil.defaultIfNull(param.getRedirectUri(), redirectUri);
if (param == null || param.getRedirectUri() == null) {
return redirectUri;
}
return param.getRedirectUri();
}
@Override
public String getClientSecret() {
return ObjectUtil.defaultIfNull(param.getClientSecret(), clientSecret);
if (param == null || param.getClientSecret() == null) {
return clientSecret;
}
return param.getClientSecret();
}
@Override
public String getScope() {
return scope;

View File

@@ -1,8 +1,7 @@
package im.zhaojun.zfile.home.service.impl;
import cn.hutool.core.util.ObjectUtil;
import im.zhaojun.zfile.home.model.enums.StorageTypeEnum;
import im.zhaojun.zfile.admin.model.param.OneDriveParam;
import im.zhaojun.zfile.home.model.enums.StorageTypeEnum;
import im.zhaojun.zfile.home.service.base.AbstractOneDriveServiceBase;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
@@ -47,17 +46,26 @@ public class OneDriveServiceImpl extends AbstractOneDriveServiceBase<OneDrivePar
@Override
public String getClientId() {
return ObjectUtil.defaultIfNull(param.getClientId(), clientId);
if (param == null || param.getClientId() == null) {
return clientId;
}
return param.getClientId();
}
@Override
public String getRedirectUri() {
return ObjectUtil.defaultIfNull(param.getRedirectUri(), redirectUri);
if (param == null || param.getRedirectUri() == null) {
return redirectUri;
}
return param.getRedirectUri();
}
@Override
public String getClientSecret() {
return ObjectUtil.defaultIfNull(param.getClientSecret(), clientSecret);
if (param == null || param.getClientSecret() == null) {
return clientSecret;
}
return param.getClientSecret();
}
@Override

View File

@@ -1,8 +1,7 @@
package im.zhaojun.zfile.home.service.impl;
import cn.hutool.core.util.ObjectUtil;
import im.zhaojun.zfile.home.model.enums.StorageTypeEnum;
import im.zhaojun.zfile.admin.model.param.SharePointChinaParam;
import im.zhaojun.zfile.home.model.enums.StorageTypeEnum;
import im.zhaojun.zfile.home.service.base.AbstractSharePointServiceBase;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
@@ -47,19 +46,28 @@ public class SharePointChinaServiceImpl extends AbstractSharePointServiceBase<Sh
@Override
public String getClientId() {
return ObjectUtil.defaultIfNull(param.getClientId(), clientId);
if (param == null || param.getClientId() == null) {
return clientId;
}
return param.getClientId();
}
@Override
public String getRedirectUri() {
return ObjectUtil.defaultIfNull(param.getRedirectUri(), redirectUri);
if (param == null || param.getRedirectUri() == null) {
return redirectUri;
}
return param.getRedirectUri();
}
@Override
public String getClientSecret() {
return ObjectUtil.defaultIfNull(param.getClientSecret(), clientSecret);
if (param == null || param.getClientSecret() == null) {
return clientSecret;
}
return param.getClientSecret();
}
@Override
public String getScope() {
return scope;

View File

@@ -1,8 +1,7 @@
package im.zhaojun.zfile.home.service.impl;
import cn.hutool.core.util.ObjectUtil;
import im.zhaojun.zfile.home.model.enums.StorageTypeEnum;
import im.zhaojun.zfile.admin.model.param.SharePointParam;
import im.zhaojun.zfile.home.model.enums.StorageTypeEnum;
import im.zhaojun.zfile.home.service.base.AbstractSharePointServiceBase;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
@@ -47,19 +46,28 @@ public class SharePointServiceImpl extends AbstractSharePointServiceBase<SharePo
@Override
public String getClientId() {
return ObjectUtil.defaultIfNull(param.getClientId(), clientId);
if (param == null || param.getClientId() == null) {
return clientId;
}
return param.getClientId();
}
@Override
public String getRedirectUri() {
return ObjectUtil.defaultIfNull(param.getRedirectUri(), redirectUri);
if (param == null || param.getRedirectUri() == null) {
return redirectUri;
}
return param.getRedirectUri();
}
@Override
public String getClientSecret() {
return ObjectUtil.defaultIfNull(param.getClientSecret(), clientSecret);
if (param == null || param.getClientSecret() == null) {
return clientSecret;
}
return param.getClientSecret();
}
@Override
public String getScope() {
return scope;