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

这包含三个键:statesession_statecode

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 的调用失败,因为我没有指定此身份验证后端,所以它试图只使用默认值。