【问题标题】:Retrieve OAuth 2.0 authorization code without user interaction无需用户交互即可检索 OAuth 2.0 授权码
【发布时间】:2019-10-23 01:04:32
【问题描述】:

我正在尝试使用 Microsoft Flow 创建工作流。我的一些步骤是使用 Microsoft Graph API 执行 HTTP 请求。我遇到的问题是某些 API 不支持 Application Permission 类型,而是 Delegated。我正在尝试在 Microsoft Planner (see this link) 中创建计划。在这种情况下,我创建了将执行特定工作流的服务帐户,并且在 Azure AD 应用程序端,我以管理员身份代表用户授予了权限。

因为我必须以“用户”身份执行某些 HTTP 请求,所以我试图检索用户授权令牌,这里有两个步骤:

  1. 获取授权码
  2. 根据授权码获取Token

我无法通过第 1 步。我正在关注此文档:https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-auth-code-flow,并且每次尝试执行以下 HTTP 请求时:

GET https://login.microsoftonline.com/{my-tenant-id}/oauth2/v2.0/authorize?
client_id={my-client-id}
&response_type=code
&redirect_uri=https%3A%2F%2Flogin.microsoftonline.com%2Fcommon%2Foauth2%2Fnativeclient
&response_mode=query
&scope=Group.ReadWrite.All

我通过传递用户名和密码来使用基本身份验证。但我收到“我们无法让您登录,您的浏览器当前设置为阻止 cookie”的回复。那么没有浏览器它是服务帐户。我是否遗漏了某些东西,或者我想要实现的目标是不可能的,我必须拥有 Web 应用程序?微软制作了使用 Planner API 的连接器,但他们制作了除了连接器之外的所有东西来在 planner 中制定计划……

编辑:

我知道问题与to this topic here 类似,但本主题中的答案说要使用 Microsoft 在其文档中特别指出的“应用程序授权”,在这种情况下您不能。我知道我需要实际的用户权限,因为唯一允许的权限类型是

委派(工作或学校帐户)

这就是为什么特定主题没有回答我的问题的原因,因为该答案指出了在这种情况下不支持的应用程序权限。

【问题讨论】:

标签: azure azure-active-directory microsoft-graph-api power-automate


【解决方案1】:

我认为您遇到了问题,因为授权代码授予流程旨在与用户交互一起使用,即用户被重定向到登录页面以交互方式输入凭据.您可以在此相关 SO 帖子 OAuth2 - Authorize with no user interaction 中阅读更多关于它的信息(它不是特定于 Azure AD,而是关于一般的 OAuth 2.0 授权代码授予流程。

替代品

  1. Client Credentials Grant Flow

    这对于任何后台/守护进程来说都是理想和最佳选择,但它适用于应用程序权限。不幸的是,您尝试使用的 API 仅适用于您提到的委托权限,因此此授权不起作用。

  2. Resource Owner Password Grant Flow(这可能有效,但违反安全最佳实践并存在功能问题)

    ROPC 直接使用用户凭据(即您的代码可以直接访问用户名和密码,这无论如何都不是一个好的做法),并且不需要显式交互。尽管这可以解决,但请注意此授权违反了许多安全最佳实践,并且它也有功能限制(例如不适用于多因素身份验证或个人帐户)。

    请参阅相关的SO Post,我在其中更详细地介绍了这些内容。通常我会避免提及这笔赠款,但我没有看到任何其他赠款适用于您的情况,这是包含它的唯一原因。

    示例请求

     // Line breaks and spaces are for legibility only.
    
     POST {tenant}/oauth2/v2.0/token
     Host: login.microsoftonline.com
     Content-Type: application/x-www-form-urlencoded
    
     client_id=6731de76-14a6-49ae-97bc-6eba6914391e
     &scope=user.read%20openid%20profile%20offline_access
     &username=MyUsername@myTenant.com
     &password=SuperS3cret
     &grant_type=password
    
  3. Using Refresh Token(可以工作,但它也很脆弱,更像是一种解决方法)

    在这种方法中,您可以先使用服务帐户获取刷新令牌。您需要与应用程序的一般工作分开执行此操作,例如作为初始设置的一部分和用户交互。

    然后继续您可以根据此刷新令牌获取令牌。刷新令牌可能会被撤销或过期。因此,您需要了解刷新令牌的有效期以及可能失效的事件。密码更改之类的事件也可能使现有的刷新令牌无效。此外,您需要像敏感信息一样保护刷新令牌(几乎就像密码本身一样)

所以 AFAIK,我只建议几个不好的选择,即 2 和 3。不幸的是,不支持应用程序权限的 API 排除了好的选择。

【讨论】:

    猜你喜欢
    • 2017-11-04
    • 2019-05-23
    • 2016-10-17
    • 1970-01-01
    • 1970-01-01
    • 2017-01-10
    • 1970-01-01
    • 2016-06-17
    • 1970-01-01
    相关资源
    最近更新 更多