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

Accessing Microsoft Graph API without using login page

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

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

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

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

此类访问的文档在此处:

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

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

我使用适用于 .NET 的 Graph SDK 为我的一个应用程序设置了此功能,因此如果您需要适用于 .NET 的 Graph SDK 的特定示例,请告诉我。

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

是的,如果您有正确的信息,这是可能的 - 您需要做的就是获得一个委托访问令牌

说明:

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

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

通常委托的访问令牌是需要用户交互的两个主要 OAuth 流程的结果(授权码授予隐式授予)但您也可以从其他两个流程中获取它们:Resource Owner Credentials GrantOn-Behalf-Of Grant,它们均受 Microsoft 支持。

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

Getting Access Token for Microsoft Graph Using OAuth REST API

我发现文档没有帮助,尤其是在尝试访问应用程序上下文中的图 API 方面。但是,我设法在此处的应用程序上下文中获取访问令牌:

private static async Task<string> AcquireToken()
{
    var tenant = "yourtenant.onmicrosoft.com";
    var resource = "https://graph.microsoft.com/";
    var instance = "https://login.microsoftonline.com/";
    var clientID = "YourappID";
    var secret = "YourAppSecret";
    var authority = $"{instance}{tenant}";
    var authContext = new AuthenticationContext(authority);
    var credentials = new ClientCredential(clientID, secret);
    var authResult = await authContext.AcquireTokenAsync(resource, credentials);
    return authResult.AccessToken;
}

是的,无需用户登录就可以借助 shared url 访问 onedrive 共享文件夹。

  1. 首先您需要获得一个访问令牌,要访问任何 Microsoft 图 API 您需要访问令牌。按照 link 获取无需用户登录的访问令牌 access token

  2. 编码共享url。

    string sharingUrl = "https://onedrive.live.com/redir?resid=1231244193912!12&authKey=1201919!12921!1"; string base64Value = System.Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(sharingUrl)); 字符串 encodedUrl = “你!” + base64Value.TrimEnd('=').替换('/','_').替换('+','-');

  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