我正在尝试使用 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 时,我有以下内容:
- AdminSite 使用默认模板 - 我的假设是 还将使用 Okta 进行身份验证。
- 以前能够登录 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/