OIDC 与 Keycloak 和 Django - 缺失状态
OIDC with Keycloak and Django - Missing States
我正在尝试使用 Keycloak 作为我的 IdP 并使用 Django(使用 Django Rest Framework 和 mozilla-django-oidc)作为我的客户端服务器来设置 OIDC。我已经安装了 keycloak,一个粗略的 Django 应用程序成功重定向到 keycloak,然后我可以在那里成功验证(到 keycloak),但是当我被重定向回 django 时,我缺少信息,特别是 oidc_states
。
重定向到 django 触发此日志条目:
[12/Oct/2021 08:28:06] "GET /api/oidc/callback/?state=QGsO26esqdtHZcsfRfYoXvUy0QWcGdZv&session_state=493887a4-600e-4dd2-aaaf-4134ea671c9a&code=dfe1573e-cf8e-4829-8874-a3500ba63712.493887a4-600e-4dd2-aaaf-4134ea671c9a.c1dfdb46-140c-4ccd-8308-6db3b468346a HTTP/1.1" 302 0
这包含三个键:state
、session_state
和 code
。
mozilla-django-oidc 提供的默认回调视图包含:
def get(self, request):
"""Callback handler for OIDC authorization code flow"""
if request.GET.get('error'):
if request.user.is_authenticated:
auth.logout(request)
assert not request.user.is_authenticated
elif 'code' in request.GET and 'state' in request.GET:
if 'oidc_states' not in request.session:
return self.login_failure()
# ...
因为 keycloak 没有在添加 oidc_states
的情况下进行重定向,所以这立即失败了,我一直无法弄清楚原因。我猜问题出在我的 keycloak 客户端配置上?
对于任何任性的旅行者,祝你好运。最终,我通过重新配置我的 mozilla-django-oidc 设置解决了我的问题。具体来说,我错过了:
AUTHENTICATION_BACKENDS = (
"django.contrib.auth.backends.ModelBackend", # default
"mozilla_django_oidc.auth.OIDCAuthenticationBackend",
)
这允许我的应用程序使用现有流程和使用新的 OIDC 流程来验证两者。在 OIDC 回调视图中对 authenticate
的调用失败,因为我没有指定此身份验证后端,所以它试图只使用默认值。
我正在尝试使用 Keycloak 作为我的 IdP 并使用 Django(使用 Django Rest Framework 和 mozilla-django-oidc)作为我的客户端服务器来设置 OIDC。我已经安装了 keycloak,一个粗略的 Django 应用程序成功重定向到 keycloak,然后我可以在那里成功验证(到 keycloak),但是当我被重定向回 django 时,我缺少信息,特别是 oidc_states
。
重定向到 django 触发此日志条目:
[12/Oct/2021 08:28:06] "GET /api/oidc/callback/?state=QGsO26esqdtHZcsfRfYoXvUy0QWcGdZv&session_state=493887a4-600e-4dd2-aaaf-4134ea671c9a&code=dfe1573e-cf8e-4829-8874-a3500ba63712.493887a4-600e-4dd2-aaaf-4134ea671c9a.c1dfdb46-140c-4ccd-8308-6db3b468346a HTTP/1.1" 302 0
这包含三个键:state
、session_state
和 code
。
mozilla-django-oidc 提供的默认回调视图包含:
def get(self, request):
"""Callback handler for OIDC authorization code flow"""
if request.GET.get('error'):
if request.user.is_authenticated:
auth.logout(request)
assert not request.user.is_authenticated
elif 'code' in request.GET and 'state' in request.GET:
if 'oidc_states' not in request.session:
return self.login_failure()
# ...
因为 keycloak 没有在添加 oidc_states
的情况下进行重定向,所以这立即失败了,我一直无法弄清楚原因。我猜问题出在我的 keycloak 客户端配置上?
对于任何任性的旅行者,祝你好运。最终,我通过重新配置我的 mozilla-django-oidc 设置解决了我的问题。具体来说,我错过了:
AUTHENTICATION_BACKENDS = (
"django.contrib.auth.backends.ModelBackend", # default
"mozilla_django_oidc.auth.OIDCAuthenticationBackend",
)
这允许我的应用程序使用现有流程和使用新的 OIDC 流程来验证两者。在 OIDC 回调视图中对 authenticate
的调用失败,因为我没有指定此身份验证后端,所以它试图只使用默认值。