中央身份验证和授权服务

时间:2020-08-10 07:33:36

标签: python django authentication authorization single-sign-on

我想设计一些“中央身份验证和授权服务”,并且我知道已经有一个couple。我担心的不是标准。在以下几行中,我将尝试对其进行解释。

我创建了两个具有自己的身份验证和授权机制的Django客户端应用程序。这两个应用程序具有不同的设计,因此具有不同的权限和角色。但是用户是相同的。

现在,我必须创建第三个应用程序,前两个应用程序必须通过该应用程序进行身份验证,并且可以(例如使用OAuth)。但是第三个应用程序还负责授权,即,角色,权限(包括许多对象级权限)由第三个应用程序存储和管理。

问题是:

  1. 如何实现第三个应用程序,使其能够支持非特定的自由样式权限?

  2. 如何存储这些权限?

  3. 我应该如何将权限转移到客户端应用程序?

  4. 如何查询一些权限?

  5. 我应该将所有权限存储在第三个应用程序中,并在每次用户请求某些资源时查询它们,还是应该在本地保存它们并在某些时候更新它们?

我看过OpenID ConnectSAMLXACML等。 SAML和XACML看起来很有希望,但是我仍然感到困惑,并且上述问题仍然没有答案。

我知道这个问题涵盖了广泛的领域,但是拥有一些启动资源和一些示例项目将大有帮助。

致谢。

1 个答案:

答案 0 :(得分:1)

可能的解决方案如下:

如何实现第三个应用程序,使其能够支持非特定的自由样式权限? 使用包含用户权限作为范围的JWT令牌。

如何存储这些权限?

  • 将用户模型以及每个用户的权限/角色存储在第三个应用程序上。
  • 用户登录后,他们将被重定向到您的第三个应用程序。成功进行身份验证后,第三个应用程序可以生成JWT令牌形式的access_token,其中包含用户作为范围的权限。
  • 然后,您可以让您的前端在对客户端应用程序的API请求中包含此access_token。客户端应用程序可以验证access_token并检查用户的范围/权限,以确定用户是否可以访问某些数据。

如何将权限转移到客户端应用程序? 您的客户端应用程序可以在每个API请求上验证/读取JWT令牌中包含的范围

如何查询某些权限? 不知道这意味着什么,我可以解释2种不同的东西:

  1. 以Github为例,Github应用程序可以指定他们需要read访问权限和email访问权限(但不需要write访问权限),并且用户可以进行身份​​验证并仅批准reademail访问。在这种情况下,即使用户具有其他可用权限,授权服务器(Github)也会生成仅包含reademail范围的JWT。
  2. 如果您要谈论的是客户端应用程序想要了解用户是否具有特定权限,那么它可以仅查看JWT中包含的范围。您可能需要为客户端应用程序中的每个端点定义所需的范围。

我应将所有权限存储在第三个应用程序中,并在每次用户请求某些资源时查询它们,还是应该将其保存在本地并在某些时候进行更新?

每个用户的权限可以存储在第三个应用程序中,而客户端应用程序仅信任JWT中包含的范围。由于access_token应该是短暂的(例如,它会在1小时后过期),因此可以通过更新access_token来处理用户权限级别的更改。