Django、mozilla-django-oidc 和管理员

标签 django openid-connect okta

我正在尝试使用 mozilla-django-oidc 将 Okta 与我正在编码的自定义 Django (v.3.0.2) 应用程序连接起来。图书馆。到目前为止,初始用户身份验证和帐户创建(使用 Django 的 user model )有效,但我不明白我需要做什么才能拥有 Django AdminSite工作。

在引入 mozilla-django-oidc 之前,Adminsite 按预期工作。我创建了一个名为“admin”的管理员用户,该用户能够登录。

要集成 mozilla-django-oidc 库,我按照此处的说明进行操作:https://mozilla-django-oidc.readthedocs.io/en/stable/installation.html .说明没有具体提及 AdminSite。

当我在库集成后访问 AdminSite 时,我有以下内容:

  1. AdminSite 使用默认模板 - 我的假设是 还将使用 Okta 进行身份验证。
  2. 以前能够登录 AdminSite 的管理员帐户“admin”不再起作用

我的目标是能够访问 AdminSite。我不介意它是通过 Okta 还是通过 vanilla 界面,只要我可以访问它。

以下是文件中的相关部分(为了整合):


urls.py

urlpatterns = [
    path('', static_site.site_index, name='site_index'),
    path('admin/', admin.site.urls),
    path('review/', include('review.urls')),
    path('oidc/', include('mozilla_django_oidc.urls')),
]

settings.py

# OICD
AUTHENTICATION_BACKENDS = (
    'mozilla_django_oidc.auth.OIDCAuthenticationBackend',
)

OIDC_RP_CLIENT_ID = 'xxxxx'
OIDC_RP_CLIENT_SECRET = 'xxxx'
OIDC_RP_SIGN_ALGO = 'RS256'
OIDC_OP_JWKS_ENDPOINT = 'https://dev-xxx.okta.com/oauth2/default/v1/keys'
OIDC_RP_SCOPES = 'openid email profile'

OIDC_OP_AUTHORIZATION_ENDPOINT = 'https://dev-xxx.okta.com/oauth2/default/v1/authorize'
OIDC_OP_TOKEN_ENDPOINT = 'https://dev-xxx.okta.com/oauth2/default/v1/token'
OIDC_OP_USER_ENDPOINT = 'https://dev-xxx.okta.com/oauth2/default/v1/userinfo'

# Provided by mozilla-django-oidc
LOGIN_URL = reverse_lazy('oidc_authentication_callback')

# App urls
LOGIN_REDIRECT_URL = reverse_lazy('review:dashboard')
LOGOUT_REDIRECT_URL = reverse_lazy('site_index')

欢迎任何想法或指点!

最佳答案

我想出了一个解决方案,可以通过 django 管理员使用 mozilla-django-oidc 登录。这有点 hacky,但重定向管理员登录页面比覆盖 AdminSite 要安全得多。

在我的顶级 urls.py 中有

class CustomLogin(View):
    def get(self, request, **kwargs):
        return HttpResponseRedirect(
            reverse('oidc_authentication_init') + (
                '?next={}'.format(request.GET['next']) if 'next' in request.GET else ''
            )
        )

urlpatterns = [
    path('oidc/', include("mozilla_django_oidc.urls")),
    path('admin/login/', CustomLogin.as_view()),
    path('admin/', admin.site.urls),
    # the rest of my urls...
]

如果您不关心是否正确传递 ?next= 值,您可以跳过 CustomLogin 类并改为执行以下操作

urlpatterns = [
    path('oidc/', include("mozilla_django_oidc.urls")),
]
# This only works if you break up urlpatterns so the reverse below can find what it needs
urlpatterns += [
    path('admin/login/', RedirectView.as_view(
        url=reverse('oidc_authentication_init') + ?next=/admin/,
        permanent=False
    )),
    path('admin/', admin.site.urls),
    # the rest of my urls...
]

我添加了 ?next=/admin/ 因为默认情况下,一旦您登录,您将被重定向到 settings.LOGIN_REDIRECT_URL 我已经将其用于其他用途

关于Django、mozilla-django-oidc 和管理员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59881651/

相关文章:

html - Django 如何仅对一个列表项发表评论

jquery - Django + GWT 或 Jquery

authentication - 拒绝在 asp.net MVC 应用程序的 <iframe> 中显示 "login.microsoftonline.com"

c# - 异常 : Correlation failed. 在 C# 中使用 Okta 的未知位置

asp.net-core - Nopcommerce Okta 集成

azure - Azure Active Directory 如何支持与 Okta 作为 IDP 联合?

javascript - 如何在 Django 模板中删除这些 '"'

Django channel 2.0 : call Consumer's channel by its name

asp.net-mvc - 同时使用 AspNet.Identity 和 OpenConnectId(用于 Azure AD 登录)

go - k8s oidc 问题与帮助程序包 (k8s-oidc-helper : command not found)