gpt4 book ai didi

sharepoint - 通过 Office 插件 (Word JS) 使用 Microsoft Graph 访问 SharePoint

转载 作者:行者123 更新时间:2023-12-04 10:56:09 24 4
gpt4 key购买 nike

我已经开发了一个 Office.js Word 加载项,我正在使用 SSO 功能,如 here 所述.它使用 Office.Auth interface方法getAccessTokenAsync , 显示 here .这如所描述的那样工作,但是当我尝试使用更多范围来使用 Microsoft Graph 访问 SharePoint 时,问题就出现了。

TL;DR
我无法使用从 Office.Auth 界面生成的 token 成功调用 Microsoft Graph 来访问 SharePoint getAccessTokenAsync方法。

完整说明

我做了以下事情:

  • 添加了Sites.ReadWrite.AllSites.Manage.All权限在
    Azure AD 应用注册。
  • 在 Word 加载项 list 中添加了其他范围。
    <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>
  • 使用 Graph Explorer 确认我可以制作 SharePoint Graph
    调用,作为我的用户。
    GET https://graph.microsoft.com/v1.0/sites/{site-id}/lists/{list-id}/items/{item-id}
  • Authorize 中添加了额外的范围用户未登录 Word 时的方法,如 here 所述.
    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方法,我可以使用返回的 token 成功地进行我的 Graph 调用。

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

    问题
    我需要为 Office JS 做些什么吗 getAccessTokenAsync方法来返回授权 token 以用于我对 SharePoint 的 Graph 调用?

    编辑发布进一步调查
    我用了 jwt.io解码收到的 token 。
  • 与较旧的 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"
    }
  • 使用较新的 getAccessToken方法,都在登录时
    并提示登录,(同样不起作用的场景),我
    获取包含与上述相同的 token 。
  • 与年长者getAccessTokenAsync方法,当提示登录并被带到AzureADAuthController ,(确实有效的场景!),我得到一个
    包含以下内容的 token :
  • {
    "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": ...
    }


    请注意范围的差异,后者的旧版本已完全列出范围,我可以通过这种方式进行授权。

    这有什么可以解释的?

    最佳答案

    答案不多,但太长了,无法发表评论:

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

    检查您是否也将新范围添加到 graphScopes登录操作方法中的数组。 (除了像您已经完成的那样将它们添加到 Authorize 操作方法之外。)

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

    getAccessToken 返回什么错误(或 getAccessTokenAsync )?它通常有一个 13xxx 号码。

    2019 年 12 月 19 日更新:

    根据您在评论“澄清...”中的描述,您似乎包含了从 getAccessToken 获得的 token 。在您对 MS Graph 的调用中。这行不通。该 token 是“引导 token ”。它使 Office 可以访问加载项的 Web 应用程序。然后,Web 应用程序需要使用 代表流量将该 token 交换为允许 Web 应用程序访问 MS Graph 的 token 。然后将第二个标记作为 包含在内。授权对 Graph 的调用中的 header 。您在问题的第一句话中链接到的示例就是这样做的。另请参阅这些文章:

    Enable SSO in Office Add-ins

    Authorize to Microsoft Graph

    最后,请确保字符串“Bearer”和 Authorization header 中的 token 之间有一个空格。

    关于sharepoint - 通过 Office 插件 (Word JS) 使用 Microsoft Graph 访问 SharePoint,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59180166/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com