【问题标题】:How to implement OpenID Connect with multiple providers in Django?如何在 Django 中实现与多个提供商的 OpenID Connect?
【发布时间】:2023-01-05 16:26:32
【问题描述】:

除了常规登录之外,我正在尝试在我的应用程序中实现多个 SSO (OpenID Connect) 登录。

当前的提供商请求是 Azure 和 Okta,但还会有更多。 对于每个使用我的应用程序的大客户,我希望能够为他们启用自定义 SSO 登录,他们可以在管理面板中设置该登录。

我为此尝试使用的所有库都使用 settings.py 和本地 django 身份验证,或者它们已被弃用。

流程是这样的:

用户选择他们的公司和 SSO 登录按钮 -> 被重定向到登录 -> 我发送客户端 ID、密码等(他们在注册 SSO 连接时在管理面板中输入的) -> 我得到一个令牌作为用户的回报姓名和电子邮件 -> 使用此信息(电子邮件)我在本地数据库中找到已经存在的用户并让他登录

【问题讨论】:

    标签: python django single-sign-on openid-connect openid


    【解决方案1】:

    您自己的应用程序通常更愿意只信任提供者,当您想要涉及多个提供者时,最好的方法是在本地添加您自己的 OIDC 提供者,这是您的应用程序和 API 信任的。然后您的 OIDC 提供商可以信任其他各种提供商。如下图所示:

    【讨论】:

    【解决方案2】:
    1. 用户选择他们的公司和 SSO 登录按钮

      好的,您只需将按钮放在您的网站上即可。

      1. 被重定向到登录

      您可以实现 /redirect 端点,并确保做一些准备从 OAuth2 提供商获取用户信息。

      1. 我发送客户端 ID、密码等(他们在注册 sso 连接时在管理面板中输入的)

      这也是第 2 步的继续。但我不知道如何连接 Django 管理面板。对不起。

      1. 我得到一个带有用户名和电子邮件的令牌作为回报

      使用 OAuth2 提供商的用户信息 API。因此,您可以随心所欲地获取用户的信息。

      1. 有了这个信息(电子邮件),我在我的本地数据库中找到了已经存在的用户并让他登录

      只需编写一个带有数据库的函数。这并不难。

      我认为这足以实现这一点。 但是that they can setup in the admin panel. 我不确定您是否可以自定义“已经制作好的”Django 管理面板。这可能很难做到。

    【讨论】:

      【解决方案3】:

      我有一个类似的问题,只是我需要支持 SAML 和 OIDC 的多个身份提供者,并按如下方式解决。

      • 我注意到 django-social-auth 包 SAML SSO 实现支持多个“idp”,基于 settings.py 中的配置。

      • 基于此,第一步是在我称为 IdentityProvider(掩盖 SAML 和 OIDC 之间的术语差异)的 Django 模型和称为 Idp 的纯 Python 模拟中进行抽象,这是一个薄包装围绕 saml.SAMLIdentityProvider。所以,在 models.py 中:

        class IdentityProvider(models.Model):
            """
            SAML or OIDC Identity Provider for SSO. Based on the model exposed by
            PSA/python3-saml to multiple db-defined SSO setups.
            """
            ...
            real_backend = models.CharField("See below for what this is!!!!")
        

        和其他地方:

        class IdP(saml.SAMLIdentityProvider):
            def get_display_name(self, lang):
               ...
               return display_name
        
            def get_logo(self):
               ...
               return logo
        
      • SAML 后端由 MultiBackendMixin 补充,以允许从 settings.py 中的配置或 IdentityProvider 实例中发现 idps:

        class SAMLSandboxAuth(MultiBackendMixin, saml.SAMLAuth):
           ...
        

        和 OIDC 的类似:

        class OIDCSandboxAuth(MultiBackendMixin, base.BaseAuth):
           ...content based loosely on saml.SAMLAuth... 
        

      从概念上讲,所有 SSO 都是通过这些“SandboxAuths”完成的,并且每个都遵循实际逻辑的“真实”后端:

      class SAMLAuth(saml.SAMLAuth):
         ...generic SAML backend...
      
      class SAMLAuthMicrosoftAzureAD(SAMLAuth):
         ...Microsoft Azure AD SAML hacks for login_hint...
      

      请注意,我有效地使用saml.SAMLAuth 一次作为 SandboxAuth,一次作为“真实”后端!!! OIDC 案例类似,除了 OIDCSandboxAuth 完全是我自己的,如上所述。

      我应该注意,我的流程与您的流程相同,只是第一步是让用户提供他们的登录名。我用它来查找他们需要使用的IdentityProvider(从而显示名称和徽标)。 “真正的”后端提供此名称作为另一端支持的 login_hint。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-16
        • 2021-03-10
        • 2020-12-16
        • 2013-06-11
        • 2017-10-14
        • 2021-11-01
        • 2015-02-05
        • 2019-02-06
        相关资源
        最近更新 更多