中央认证和授权服务

Central Authentication and authorization service

我想设计一些“中央认证和授权服务”,我知道已经有一个couple。我担心的不是标准。在接下来的几行中,我将尝试解释它。

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

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

问题是:

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

  2. 如何存储这些权限?

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

  4. 如何查询一些权限?

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

我看过 OpenID Connect, SAML, XACML 和其他人。 SAML 和 XACML 看起来很有前途,但我仍然感到困惑,上述问题仍未得到解答。

我知道这个问题涵盖的范围很广,但是有一些入门资源和一些示例项目会有很大帮助。

此致。

可能的解决方案如下:

如何实现第三个应用程序,使其支持non-specific、free-style权限? 使用包含用户权限作为范围的 JWT 令牌。

如何存储这些权限?

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

我应该如何将权限转移到客户端应用程序? 您的客户端应用程序可以 validate/read 每个 API 请求中包含在 JWT 令牌中的范围

如何查询一些权限? 不确定这意味着什么,我可以解释 2 个不同的东西:

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

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

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

来处理用户权限级别的更改