【问题标题】:New MicrosoftTeams.authentication.getAuthToken is not a MS Graph Bearer: token?新的 MicrosoftTeams.authentication.getAuthToken 不是 MS Graph Bearer:令牌?
【发布时间】:2020-01-28 10:35:44
【问题描述】:

Single Sign-On for Teams

我的电话microsoftTeams.authentication.getAuthToken(authTokenRequest); 正在工作;也就是说,它成功返回一个token,成功解析到我的 Azure Active Directory (AAD)。都好。出乎意料的容易。 JWT 以正确的受众和范围返回(正如我在租户的 AAD 中设置的那样)

然而当我解码 JWT 时得到的结果似乎只是一个身份验证令牌,而不是一个访问令牌。

查看Task Meow/teams.auth.service.js 的示例似乎没有显示如何将 Auth 交换为访问令牌。

我假设代码看起来像 getToken() 方法......但因为我已经在 auth 上花费了 10 多个工作日(老 ADAL 哦,我的天哪,这太可怕了)......

问题:

我想知道是否还有其他好的 MicrosoftTeams.js Authenticate / Auth Token / MSAL Access 令牌示例?

【问题讨论】:

标签: microsoft-teams msal


【解决方案1】:

无论如何,我确实通过以下方式解决了我的问题

  1. 通过auth.service.js > sso.auth.service.js > teams.auth.service.js的抽象来跟随TaskMeow示例
  2. 因为我想要额外的 AAD 范围(Files.ReadWrite.All 访问 Teams 中的 Sharepoint Online 文件和 Groups.ReadWrite.All - 添加选项卡)我在 teams.auth.service.js 中的 getToken() 方法类似于以下内容:
getToken() {
    if (!this.getTokenPromise) {
      this.getTokenPromise = new Promise((resolve, reject) => {
        this.ensureLoginHint().then(() => {
          this.authContext.acquireToken(
            'https://graph.microsoft.com',
            (reason, token, error) => {
              if (!error) {
                resolve(token);
              } else {
                reject({ error, reason });
              }
            }
          );
        });
      });
    }
    return this.getTokenPromise;
  }

社论评论

  1. Microsoft Teams 中的身份验证太难了
  2. 文档中似乎有很多“方法”
  3. 目前的“SSO”流程仍有缺陷,处于“开发者预览版”中

如果您是 SPA 开发人员,那就太难了。我(显然)不是身份验证专家——所以当前的“食谱”是必要的。

如果您想要的不仅仅是Single Sign-on 中所述的默认“范围”,则尤其如此……而且 Microsoft Graph 中的大多数“好东西”都在这些默认范围之外。

【讨论】:

    【解决方案2】:

    另外,这个 sn-p 可能会有所帮助。

    如果您在 Microsoft Teams 应用中遵循推荐的 Taskmeow,您将快速看到重定向 URI(又名 /tab/silent-start

    为了解决这个问题,adal.js 缓存了用户和访问令牌。

    所以你可以在login()添加签到

    login() {
        if (!this.loginPromise) {
          this.loginPromise = new Promise((resolve, reject) => {
            this.ensureLoginHint().then(() => {
              // Start the login flow
    
              let cachedUser = this.authContext.getCachedUser();
              let currentIdToken = this.authContext.getCachedToken(this.applicationConfig.clientId);
    
              if (cachedUser && currentIdToken) {
                resolve(this.getUser());
              } else {
                microsoftTeams.authentication.authenticate({
                  url: `${window.location.origin}/silent-start.html`,
                  width: 600,
                  height: 535,
                  successCallback: result => {
                    resolve(this.getUser());
                  },
                  failureCallback: reason => {
                    reject(reason);
                  }
                });
              } 
            });
          });
        }
        return this.loginPromise;
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多