中央身份验证和授权服务



我想设计一些"中央认证和授权服务";我知道已经有一对了。我关心的不是标准。在下面的几行中,我将尝试解释它。

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

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

问题是:

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

  2. 如何存储这些权限?

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

  4. 如何查询某些权限?

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

我已经了解了OpenIDConnect、SAML、XACML等。SAML和XACML看起来很有前景,但我仍然感到困惑,上述问题仍未得到解答。

我知道这个问题涉及的范围很广,但有一些启动资源和一些示例项目将有很大帮助。

谨致问候。

一个可能的解决方案如下:

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

如何存储这些权限

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

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

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

  1. 以Github为例,Github应用程序可以指定他们需要reademail访问(但不能指定write访问(,用户可以进行身份验证,并且只能批准reademail访问。在这种情况下,授权服务器(Github(将生成一个JWT,该JWT仅包括reademail的作用域,即使用户具有其他可用权限
  2. 如果你说的是客户端应用程序想知道用户是否有特定的权限,那么它可以只查看JWT中包含的范围。您可能需要为客户端应用程序中的每个端点定义所需的范围

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

每个用户的权限都可以存储在第三个应用程序中,客户端应用程序只信任JWT中包含的作用域。由于access_token应该是短期的(例如,它将在1小时后过期(,因此可以通过续订access_toke来处理用户权限级别的更改。

最新更新