在不使用登录页面的情况下访问Microsoft Graph API

时间:2016-04-27 12:36:01

标签: microsoft-graph

我想访问用户的一个驱动器来上传文档或使用Graph API检索文档。 我在网上看到过多个例子,需要使用标准登录页面供用户登录。您需要从登录页面获取授权代码,然后使用它来获取令牌,最终可以用来访问驱动器等资源。

我正在寻找一种方法,无需通过登录页面即可完成此操作。我可以拥有自己的登录页面,我可以请求用户登录。

简而言之,我想使用像Postman这样的REST客户端访问Graph API的驱动资源(从授权到访问资源)。这可能吗?

5 个答案:

答案 0 :(得分:10)

是的,如果您拥有正确的信息,则可能 - 您需要做的就是获得委派的访问令牌

说明:

在处理资源访问时,Microsoft Graph有两级访问令牌要求:

  • 大多数方法仅支持应用程序令牌,这意味着一旦OAuth应用程序获得同意,它就可以随时访问资源。
  • 但对于某些方法,这还不够(它们对自动化流程过于敏感)并且需要委托令牌,这意味着包含两者有效<的令牌strong>客户端和用户。您可以在每个方法文档中看到它需要哪个令牌。

通常,委派的访问令牌是需要用户互动的两个主要OAuth流程的结果(授权代码授予隐式授权),但您也可以从两个其他流程:资源所有者凭据授予代表授权,这些都是Microsoft支持的。

有关如何设置所需的一切以便使用这些流程(包括Postman示例)的完整指南,您可以查看我的文章:

Getting Access Token for Microsoft Graph Using OAuth REST API

答案 1 :(得分:3)

是的,这是可能的。实质上,您授予访问应用程序访问Graph API而不是用户的权限。

此类访问的文档位于:

https://developer.microsoft.com/en-us/graph/docs/concepts/auth_v2_service

您仍需要请求持有人令牌与您的所有REST请求一起发送,但持票人令牌将用于应用程序本身,而不是用户。

我使用Graph SDK for .NET为我的一个应用程序设置了这个,所以如果您需要Graph SDK for .NET的特定示例,请告诉我。

答案 2 :(得分:3)

虽然这是可能的,但强烈建议不要为个人用户访问执行此操作。 Microsoft Graph仅支持OAUTH 2.0作为其authZ协议,我们建议您使用OAUTH中的流,其中可信授权机构是直接处理登录凭据的流。允许应用程序代码提供登录凭据的表单UI将打开攻击媒介,您的应用程序可以直接访问用户的O365密码,这不是一种安全的方法。

答案 3 :(得分:1)

我发现文档没有帮助,特别是在尝试在应用程序上下文中访问Graph API时。但是,我设法在应用程序的上下文中获取访问令牌:

@Test
    public void pickContactButton_click_SelectsPhoneNumber() {
        // **Stub** all Intents to ContactsActivity to return VALID_PHONE_NUMBER. Note that the Activity
        // is never launched and result is stubbed.
        intending(hasComponent(hasShortClassName(".ContactsActivity")))
                .respondWith(new ActivityResult(Activity.RESULT_OK,
                        ContactsActivity.createResultData(VALID_PHONE_NUMBER)));

答案 4 :(得分:0)

是的,可以在没有用户登录的情况下借助共享 url 访问 onedrive 共享文件夹。

  1. 首先你需要获得一个访问令牌,要访问你需要访问令牌的任何微软图形 API。按照链接获取无需用户登录的访问令牌 access token

  2. 编码共享网址。

    stringsharingUrl = "https://onedrive.live.com/redir?resid=1231244193912!12&authKey=1201919!12921!1"; string base64Value = System.Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(sharingUrl)); string encodingUrl = "u!" + base64Value.TrimEnd('=').Replace('/','_').Replace('+','-');

  3. 发现端点 https://docs.microsoft.com/en-us/onedrive/developer/rest-api/concepts/direct-endpoint-differences?view=odsp-graph-online#discovering-an-endpoint

  4. -适用于 OneDrive 个人帐户 https://api.onedrive.com/v1.0/shares/{shareIdOrUrl}/driveItem?$expand=children

    OneDrive for Business 和 SharePoint https://graph.microsoft.com/v1.0/shares/{shareIdOrUrl}/driveItem?$expand=children