通过Office加载项(Word JS)使用Microsoft Graph访问SharePoint

凯沙W

我已经开发了一个Office.js Word加载和我使用SSO功能描述这里它采用的Office.Auth interface方法getAccessTokenAsync,显示在这里它可以按说明的方式工作,但是当我尝试使用更多范围使用Microsoft Graph访问SharePoint时,问题就来了。

TL; DR我无法成功进行Microsoft Graph调用,以使用从Office.Auth接口getAccessTokenAsync方法生成的令牌访问SharePoint

详细描述

我已经完成以下工作:

  1. 在Azure AD应用程序注册中添加Sites.ReadWrite.AllSites.Manage.All权限。
  2. 在Word加载项清单中添加了其他作用域。

    <WebApplicationInfo>
      <Id>$application_GUID here$</Id>
      <Resource>api://localhost:44355/$application_GUID here$</Resource>
      <Scopes>
          <Scope>Files.Read.All</Scope>
          <Scope>Sites.ReadWrite.All</Scope>
          <Scope>Sites.Manage.All</Scope>
          <Scope>offline_access</Scope>
          <Scope>openid</Scope>
          <Scope>profile</Scope>
      </Scopes>
    </WebApplicationInfo>
    
  3. 使用图形资源管理器确认可以以用户身份进行SharePoint图形调用。

    GET https://graph.microsoft.com/v1.0/sites/{site-id}/lists/{list-id}/items/{item-id}
    
  4. 在所添加的附加的范围Authorize,当用户未登录到话语,如所描述的方法用于这里

    ConfidentialClientApplicationBuilder clientBuilder = ConfidentialClientApplicationBuilder.Create(Settings.AzureADClientId);
    clientBuilder.WithClientSecret(Settings.AzureADClientSecret);
    clientBuilder.WithRedirectUri(loginRedirectUri.ToString());
    clientBuilder.WithAuthority(Settings.AzureADAuthority);
    
    ConfidentialClientApplication clientApp = (ConfidentialClientApplication) clientBuilder.Build();
    string[] graphScopes = { "Files.Read.All", "User.Read", "Sites.ReadWrite.All", "Sites.Manage.All" };
    
    // Get and save the token.
    var authResultBuilder = clientApp.AcquireTokenByAuthorizationCode(
        graphScopes,
        Request.Params["code"] // The auth 'code' parameter from the Azure redirect.
    );
    
    try
    {
        var authResult = await authResultBuilder.ExecuteAsync();
        ViewBag.AccessToken = authResult.AccessToken;
    }
    catch (Exception e)
    {
        ViewBag.Error = e.Message;
    }
    
    return View();
    

有效的方法当用户未登录Word且必须调用该Authorize方法时,我可以使用返回的令牌成功进行我的Graph调用。

什么不起作用当用户已经登录到Word并且加载项JS使用该getAccessTokenAsync方法生成令牌时,当尝试使用返回的图进行相同的Graph调用时,我得到了“未授权”

问题我还需要为Office JSgetAccessTokenAsync方法做一些额外的事情,以将授权的令牌返回以便与我的Graph调用一起用于SharePoint?

编辑进一步调查后,
我使用jwt.io解码了收到的令牌。

  1. 使用较旧的getAccessTokenAsync方法登录时(不起作用的情况),我得到一个包含以下内容的令牌:
{
  "aud": $application_GUID$,
  "iss": "https://login.microsoftonline.com/$tenant_GUID$/v2.0",
  "iat": ...,
  "nbf": ...,
  "exp": ...,
  "aio": ...,
  "azp": ...,
  "azpacr": "0",
  "name": $user_full_name$,
  "oid": $GUID$,
  "preferred_username": $user_email$,
  "scp": "access_as_user",
  "sub": ...,
  "tid": $tenant_GUID$,
  "uti": ...,
  "ver": "2.0"
}
  1. 使用更新的getAccessToken方法,无论是在登录时还是在提示登录时(同样不起作用的情况),我都会得到一个包含与上面相同的令牌。
  2. 使用较旧的getAccessTokenAsync方法时,当系统提示您登录并转到AzureADAuthController时(有效的情况!),我得到一个包含以下内容的令牌:
{
  "aud": "00000003-0000-0000-c000-000000000000",
  "iss": "https://sts.windows.net/$tenant_GUID$/",
  "iat": ...,
  "nbf": ...,
  "exp": ...,
  "acct": 0,
  "acr": "1",
  "aio": ...,
  "amr": [
    "pwd"
  ],
  "app_displayname": "Office-Add-in-ASPNET-SSO",
  "appid": $application_GUID$,
  "appidacr": "1",
  "deviceid": $GUID$,
  "family_name": $user_last_name$,
  "given_name": $user_first_name$,
  "ipaddr": ...,
  "name": $user_full_name$,
  "oid": $GUID$,
  "platf": "3",
  "puid": ...,
  "scp": "Files.Read.All openid profile Sites.Manage.All Sites.ReadWrite.All User.Read email",
  "sub": ...,
  "tid": $tenant_GUID$,
  "unique_name": $user_email$,
  "upn": $user_email$,
  "uti": ...,
  "ver": "1.0",
  "xms_st": {
    "sub": ...
  },
  "xms_tcdt": ...
}

请注意作用域的差异,后者(较旧的版本)具有完整列出的作用域,我可以通过这种方式进行授权。

有什么可以解释的?

里克·柯汉(Rick Kirkham)

答案不多,但评论太久:

该样本最近更改为使用新样本OfficeRuntime.auth.getAccessToken您似乎正在使用的旧版本Office.auth.getAccessTokenAsync那应该仍然有效,但是它是一个预览API,并且可能会在某些时候停止工作。考虑克隆较新的版本。但是要等几天。我将对新版本进行一些修复。

检查是否还graphScopes通过“登录”操作方法将新作用域添加到了数组中。(除了像已经将它们添加到“授权”操作方法中一样。)

究竟哪个HTTP调用返回了“未经授权”?

正在从getAccessToken(或getAccessTokenAsync)重调出什么错误它通常有一个13xxx号码。

更新12/19/19:

根据注释“为澄清...”中的描述,您似乎getAccessToken在对MS Graph的调用中包括从中获取的令牌这是行不通的。该令牌是“引导令牌”。它使Office可以访问外接程序的Web应用程序。然后,Web应用程序需要使用“代表流量”将该令牌交换为令牌,以使Web应用程序可以访问MS Graph。然后,在对Graph的调用中,将第二个令牌作为Authorization标头。您在问题的第一句话中链接到的样本即可完成此操作。另请参阅以下文章:

在Office加载项中启用SSO

授权使用Microsoft Graph

最后,请确保字符串“ Bearer”与Authorization标头中的令牌之间存在空格。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Microsoft Graph API-Office 365访问SharePoint嵌套文件夹项目

Outlook加载项中单个用户的Microsoft Graph访问令牌

新的Microsoft Word Office加载项在功能区中未显示加载项按钮

使用访问令牌通过Microsoft Graph API与OneDrive进行交互

使用 Nodejs 通过 Microsoft Graph 访问日历事件

使用 Word 2013 的 office.js 加载项中未定义“Word”

Office JS加载项

使用Office.js在MS Word加载项中加载Excel文件

使用Microsoft Graph列出Microsoft Sharepoint网站

如何通过Microsoft Graph中的Created筛选SharePoint列表项?

通过Microsoft Graph API检索SharePoint Online对象权限

通过 Microsoft Graph API 从 SharePoint 获取所有网站

office.js中开发的Microsoft Word加载项可以支持Mobile Word应用程序吗?(我知道Outlook加载项支持移动设备)

如何使用Microsoft Graph API通过自定义列值查找SharePoint文档

使用 Azure AD 企业应用程序通过 Microsoft Graph API 管理 Sharepoint 站点

如何使用 Office.JS 在 MS Word 加载项中设置作者姓名、添加时间?

使用Microsoft Graph创建SharePoint文档库

无法调试Word加载项项目,未安装所需的Microsoft Office版本

Office Word加载项中的JavaScript可以访问Outlook联系人吗?

通过Office.js API将customXmlParts与Excel加载项一起使用

使用Graph Api创建团队时无法访问Microsoft Teams频道的电子邮件地址,SharePoint和文件

Word Offic.js 加载项运行另一个 Office.js

使用MS Graph通过Sharepoint读取Excel内容

使用Java通过Microsoft图形访问Office 365规划器

从Word Web加载项(Office.Js)进行的API调用不起作用:CORS问题?

带有Angular 6的基于MS Office JS的Word加载项

Office.js无法在Angular的Word加载项中初始化

Word Web App强制使用Office加载项打开文档

使用Office JS API的Office VSTO加载项与Office加载项