【问题标题】:Active Directory OAuth 2.0 - Request an Authorization Code through PHP different than browser requestActive Directory OAuth 2.0 - 通过 PHP 请求授权码,不同于浏览器请求
【发布时间】:2017-11-07 17:57:04
【问题描述】:

我正在关注此文档:https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-protocols-oauth-code

请求授权代码下,它提供了涉及OAuth 2.0 端点的示例代码。我已经按照这个结构来建立我自己的请求,类似于:

https://login.microsoftonline.com/{tenant}/oauth2/authorize?
client_id=6731de76-14a6-49ae-97bc-6eba6914391e
&response_type=code
&redirect_uri=https://example.com
&response_mode=query
&resource=6731de76-14a6-49ae-97bc-6eba6914391e
&state=12345

在我的测试期间,我什至尝试过(让请求尽可能裸露):

https://login.microsoftonline.com/{tenant}/oauth2/authorize?
client_id=6731de76-14a6-49ae-97bc-6eba6914391e
&response_type=code

有趣的是:如果我通过浏览器访问这些域,它们会返回“成功”调用,如下所示:

https://example.com/?code=AOA...................................

但是,我似乎无法通过PHP 解决方法获得相同的结果(获取代码)。

我试过了:

file_get_contents($my_url);

但返回的只是错误和 Microsoft 的登录页面。

我也尝试在cURL 中这样做,但没有运气。

谁能建议如何复制获取这样的代码(自动)?

【问题讨论】:

    标签: php azure oauth-2.0 azure-active-directory


    【解决方案1】:

    您可以通过使用 header() 函数发送 HTTP Location 标头将用户重定向到 Microsoft 登录页面:

    header("Location: https://login.microsoftonline.com/xxxxxx/oauth2/authorize?client_id=xxxxxx&response_type=code&redirect_uri=http%3A%2F%2Flocalhost:8088/testauth.php%2F&response_mode=query&resource=https%3A%2F%2Fgraph.windows.net%2F&state=12345"); 
    

    用户输入用户名/密码后,天蓝色广告将重定向到带有代码的重定向网址,您可以通过以下方式获取代码:

    echo $_GET['code']; 
    

    【讨论】:

      【解决方案2】:

      这里需要稍后也以用户身份访问 API。

      当您兑换授权码时,您会获得一个访问令牌和一个刷新令牌。您附加到 API 调用的访问令牌,默认在 1 小时后过期。但是刷新令牌默认14天过期,可以用来获取新的访问令牌和刷新令牌。因此,只要您始终在 14 天内使用刷新令牌获取新令牌,您就可以拥有永久访问权限。

      每次刷新时都会检查用户的访问权限,因此如果他们的帐户被禁用或访问权限被删除,您将收到错误而不是新令牌。


      简短的回答:你不能。要获取授权码,您必须重定向浏览器,以便用户可以登录,必要时通过 MFA,登录到他们的组织本地 AD ...最终结果,用户将被发送回您的应用程序,并带有代码,然后您可以兑换访问令牌以访问受 Azure AD 保护的要调用的 API。

      【讨论】:

      • 是否有传入用户/密码凭据以自动登录,然后重定向到带有代码的页面?
      • 重定向时可以传入用户名作为参数,但不能传入密码。
      • 实际上,更好的问题 - 当请求 access_token 时,refresh_token 附带它。有人不能继续使用refresh_token 来不断获得访问权限吗?
      • 当然,当您使用刷新令牌时,您将获得一个新的刷新令牌和访问令牌。
      • 没错,技术上刷新令牌默认在 14 天后过期(通过自定义策略最多 90 天)。但是,只要始终在 2 周内完成,您就可以获得新的刷新令牌。
      猜你喜欢
      • 2017-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-20
      • 1970-01-01
      • 2019-07-03
      • 2012-11-12
      • 1970-01-01
      相关资源
      最近更新 更多