Python 请求 - 如何执行 SAML SSO 登录(例如登录到 login.microsoft.com)?

Sta*_*Kit 5 python saml single-sign-on

首先,我用谷歌搜索了这个问题,但发现了一些通用的解释,这些解释并没有让我很好地理解如何做事情。

其次 - 我是有效的系统用户(不是管理员)并且有权访问数据。即,我拥有有效的用户凭据,并且可以手动下载文件,但对于小型自动化,我希望通过 python 脚本从我的 PC 下载文件。

下载本身很简单,唯一的事情是 - 我需要在请求中提供有效的会话 ID cookie。即最后我需要通过最简单的方式获取这个cookie。

如果我对 SAML 的理解是正确的,我是一个用户代理,想要从服务提供商下载一个文件,该文件需要通过身份提供商(Microsoft)对我进行身份验证。通常我通过浏览器执行此操作,现在我可以在 PySide6 (QWebEngineView) 的帮助下模拟它。我首先在 QWebEngineView 中加载目标 URL。实际上,它是一个小型嵌入式 Web 浏览器,它将我重定向到 login.microsoft.com,询问凭据,然后将我重定向回服务提供商站点并设置会话 ID cookie。然后我就可以在我的请求中使用这个 cookie。它有效,但如果可能的话我想摆脱 GUI (PySide)。

我决定复制浏览器的流程,但几乎一开始就失败了。会发生什么:

  1. 我正在使用通常的获取请求从我的服务提供商端请求文件。
  2. 由于我未经过身份验证,服务提供商使用 HTML 页面(而不是目标文件)进行回复。
  3. 此 HTML 页面包含由 onPageLoad 事件触发的 Java 脚本 - 此 Java 脚本只是将浏览器重定向到 login.microsoft.com(带有一些参数的长 URL)。
  4. 使用此长 URL 的 login.microsoft.com 的下一个请求以“302 Moved Temporarily”结尾,“Location”标头中具有相同的 URL。当我使用这个 URL 时,它再次给出具有相同 URL 的 302。在相同的情况下,浏览器仅获得两次重定向,并最终收到来自 microsoft.com 的带有登录名/密码请求的网页 URL。

我知道当我再次使用 302 响应的“位置”标头中提供的 URL 时,我应该添加更多标头/cookie。但是...我不知道login.microsoft.com 在这里期望什么。所以我的问题是 - 是否有任何描述此消息流的来源?或者也许有人已经这样做了,可以给我如何继续的建议?

我发现了一些与 SAML 相关的 python 库,但我发现 x509 证书和更多内容的配置非常复杂 - 看起来它们更适合在服务提供商端实现,而不是外部登录。