Conan
Conan
发布于 2024-01-30 / 208 阅读
0
0

Microsoft Graph API请求 oauth2 Token获取-世纪互联

使用Microsoft的服务产品,比如Outlook,SharePoint,用API的oauth2方式进行开发调用,操作步骤:

  1. 需要先购买相关产品:比较所有 Microsoft 365 计划(以前称为 Office 365)- Microsoft Store

  2. 勾选许可证给相关用户:活动用户 - Microsoft 365 admin center

  3. 订阅Azure服务,需要VISA借记卡或信用卡:【秘钥管理、角色权限管理类似】主页 - Microsoft Azure

  4. 订阅完成后:前往:主页 - Microsoft Azure 点击Mirsoft Entra ID,应用注册,完成后刷新,讲客户端凭据、重定向URI(这个随便设置一个即可)设置一下,记录一下,租户ID,clientId,clientSecretId等;

  5. 设置相关权限:API权限菜单,添加权限,选择,Microsoft Graph,选择权限,已委托还是应用程序,根据文档要求选择即可:SP - Microsoft Azure

  6. 世纪互联文档站点:Office 365 的中国 API 端点 | Microsoft Learn

  7. 个人感觉文档有点乱,看错请求不到的话,就换个文档看吧。

代码相关:

配置:

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;
  }


评论