以编程方式登录 Microsoft Online

Spl*_*nes 7 authentication reverse-engineering ms-office single-sign-on office365

目标

给定公司电子邮件和相应的密码,我需要以编程方式登录login.microsoftonline.com并访问 Office 365 仪表板 ( office.com)。该图显示了我尝试找出相应端点的用户流程。

Microsoft 登录用户流程

研究成果

这就是我发现的有关端点的名称和方式的信息。请注意,如果您不使用公司帐户,端点可能会有所不同。

假设:

  • 始终遵循重定向。
  • 沿途收集 cookie 并在每个后续请求中传递它们。
  • 在请求正文中,我仅包含我认为相关的部分。我本可以遗漏我不知道的重要部分。

得到login.microsoftonline.com

按照重定向进行操作。生成的 HTML 包含一个封装在//<![CDATA[和中的配置 json 对象//]]>。搜索"sFT":并复制该值。搜索"sCtx":并复制该值。搜索"canary":并复制该值。搜索"sessionId":并复制该值。

邮政https://login.microsoftonline.com/common/GetCredentialType?mkt=en-US

我认为这个终点不是必需的。我仍然把它放在这里。

发送 JSON 正文如下:

{
    "username": "<your-company-email>",
    "flowToken": "<your-sFT-token>"
}
Run Code Online (Sandbox Code Playgroud)

邮政https://login.microsoftonline.com/common/login

作为正文中的表单数据发送:

login:<your-company-email>
passwd:<your-password>
flowToken:<your-sFT-token>
type:11
ctx:<your-sCtx-token>
canary:<your-canary-token>
hpgrequestid:<your-session-id>
Run Code Online (Sandbox Code Playgroud)

邮政https://login.microsoftonline.com/kmsi

“kmsi”代表“让我保持登录状态”。如果您不使用公司邮件登录,则这可能是不会被调用的端点。

作为正文中的表单数据发送:

LoginOptions:3
type:28
ctx:<your-sCtx-token>
flowToken:<your-sFT-token>
canary:<your-canary-token>
hpgrequestid:<your-session-id>
Run Code Online (Sandbox Code Playgroud)

按照此处显示的顺序调用这些端点,我能够成功检索这些 cookie:

来自login.microsoftonline.com(10 块饼干):

  • 埃斯特AUTH
  • 东方之光
  • ESTAUTH坚持
  • 环境科学与技术安全中心
  • 建造
  • ch
  • esctx
  • 软板
  • sts服务cookie
  • x-ms-网关-切片

来自office.com(1 块饼干):

  • 多用户识别码

来自www.office.com(2 块饼干):

  • OH.DC亲和力
  • 羟基SID

邮政https://www.office.com/landing

作为正文中的表单数据发送。???表明我不知道这些数据来自哪里。

code:<a code token ???>
id_token:<an id token ???>
state:<a state token ???>
session_state:<a session state token ???>
Run Code Online (Sandbox Code Playgroud)

该端点似乎至关重要,因为它返回以下 cookie:

  • Ohp代币
  • 用户索引
  • 奥普认证
  • Ajax会话密钥
  • 用户身份

得到https://www.office.com/

在上一个请求期间设置的 cookie 将在此处的请求标头中发送。这就是为什么这office.com/landing似乎至关重要。但是,我无法弄清楚如何为该主体构造表单数据,例如code,id_token等等。


也许相关问题?请注意,我在堆栈溢出上 看到了这个问题,但我发现它没有用,并且认为它与我的问题无关。

为什么我需要这一切? 主要目标是从另一个工具(SSO)自动登录用户。给出了电子邮件和密码。我的方法是在服务器端以编程方式使用这些端点登录,收集后续登录所需的 cookie,然后将它们发送到客户端。客户端使用这些 cookie 即可office.com立即访问和查看仪表板,而无需登录。

更好的方法?请注意,我有权访问管理中心 (Microsoft) 和 Azure Direct。如果您知道此解决方案的更简单方法,我很高兴了解它。我读过的大多数文章都涉及在登录 Microsoft 的情况下如何使用 Azure 登录另一个服务。但我需要相反的情况:登录到某些服务并自动访问 Microsoft Office 365 仪表板。

And*_*rey 2

你想做的事情是完全错误的 - 为什么要对前端应用程序进行逆向工程,有一天却发现一切都改变了?

有官方的 REST API 到 MS Outlook Online,并通过 Azure AD 进行身份验证机制 - 正是为了让第三方应用程序能够与 MS Online 应用程序一起使用。

尝试检查一下:

https://learn.microsoft.com/en-us/graph/overview-major-services

和这个:

https://learn.microsoft.com/en-us/graph/azuread-identity-access-management-concept-overview