OpenID Connect + Django DRF + React:如何使用?

Gmo*_*naq 8 django rest django-rest-framework reactjs keycloak

我有一个由两部分组成的 Web 应用程序:使用 Django + Django Rest Framework (DRF) 实现的后端,以及作为 React App 项目的前端。对于身份验证和授权,我使用 Keycloak。

首先进行身份验证,前端应用程序将用户重定向到Keycloak登录页面,当Keycloak收到正确的用户名和密码组合后,将用户重定向回前端应用程序并为前端应用程序提供访问权限密钥和刷新密钥对。

现在,当用户想要调用后端的任何 API 时,它就拥有所需的访问密钥。我决定也让前端应用程序负责刷新访问令牌;但我期待任何更好的解决方案。

由于我的应用程序需要使用授权,因此Keycloak中的“访问类型”应设置为“机密”;因此,当我的前端应用程序想要进行身份验证时,它应该提供“客户端密钥”。

当我处于开发阶段时,这没有问题,因为我可以轻松更改代码中的客户端密钥。但是,当我想要构建用于生产的前端​​应用程序时,我会在生产环境(与开发实例分开)中对 Keycloak 实例的客户端密钥进行硬编码,然后构建应用程序。换句话说,对于密钥的任何更改,都需要进行新的构建,这确实是一个令人头疼的问题。

  1. 我是否使用了正确的身份验证步骤?
  2. 有没有办法让前端应用程序在不提供密钥的情况下进行身份验证?
  3. 如果上述问题的答案是“否”(我认为是这样),那么前端应用程序有没有办法在构建后使用客户端密钥作为配置值?

小智 1

我没有使用过 keycloak,所有这些 oidc 提供商都有自己的怪癖,因此里程可能会因这些答案而异。

  1. 假设您使用的是授权代码授予类型,这听起来大致正确 - 但有一个关于密钥使用的重要警告。

  2. 取决于实现,但您可以将授权代码与 PKSE 一起使用,并且在代码交换期间不提供客户端机密。如果您的提供商不支持此功能,您可以使用隐式授予类型。请参阅: https: //auth0.com/blog/oauth2-implicit-grant-and-spa/了解两者的详细分类,以及使用其中一种的含义。

  3. 不可以。客户端机密永远不应该进入浏览器。

作为 2 的补充,本文没有详细介绍 SPA 中访问、id 或刷新令牌的存储,以便在页面刷新之间保持身份验证。