使用Microsoft的服务产品,比如Outlook,SharePoint,用API的oauth2方式进行开发调用,操作步骤:
需要先购买相关产品:比较所有 Microsoft 365 计划(以前称为 Office 365)- Microsoft Store
勾选许可证给相关用户:活动用户 - Microsoft 365 admin center
订阅Azure服务,需要VISA借记卡或信用卡:【秘钥管理、角色权限管理类似】主页 - Microsoft Azure
订阅完成后:前往:主页 - Microsoft Azure 点击Mirsoft Entra ID,应用注册,完成后刷新,讲客户端凭据、重定向URI(这个随便设置一个即可)设置一下,记录一下,租户ID,clientId,clientSecretId等;
设置相关权限:API权限菜单,添加权限,选择,Microsoft Graph,选择权限,已委托还是应用程序,根据文档要求选择即可:SP - Microsoft Azure
个人感觉文档有点乱,看错请求不到的话,就换个文档看吧。
代码相关:
配置:
xxx:
outlook:
tenant-id: ea51c20f-xxx
client-id: 05cfbd44-xx
secret-id: 341598b5-9xx
client-secret: V_MUtQ_xx
host: https://microsoftgraph.chinacloudapi.cn
login-url: https://login.chinacloudapi.cn/${xxx.outlook.tenant-id}/oauth2/v2.0/token
scope: ${xxx.outlook.host}/.default
resp-prefer-text: 'outlook.body-content-type="text"'
scope:是你需要登陆后请求相关域名的host;
登陆:
private String outlookLogin() {
HttpRequest request =
HttpUtil.createPost(xxx.getOutlook().getLoginUrl())
.setConnectionTimeout(10000)
.setConnectionTimeout(20000);
Map<String, Object> bodyMap = Maps.newHashMapWithExpectedSize(4);
bodyMap.put("client_id", xxx.getOutlook().getClientId());
bodyMap.put("client_secret", xxx.getOutlook().getClientSecret());
bodyMap.put("scope", xxx.getOutlook().getScope());
bodyMap.put("grant_type", "client_credentials");
request.form(bodyMap);
String token;
try (HttpResponse response = request.execute()) {
if (response.getStatus() == HttpStatus.HTTP_OK) {
JSONObject obj = JSONUtil.parseObj(response.body());
token = obj.getStr("access_token");
redisTemplate
.opsForValue()
.set(OUTLOOK_REDIS_KEY, token, obj.getLong("expires_in"), TimeUnit.SECONDS);
} else {
log.error("xxxoutlook登陆失败,请检查:\n{}\n{}", request, response);
throw new BusinessException(ErrorCodeMsgEnums.SYSTEM_ERROR, "outlook登陆失败,请稍后再试");
}
}
return token;
}