基于声明的身份验证和用户圈子
Claims-based auth and circles of users
让我们考虑一个简单的基于 REST 的 Web 服务来存储和检索 JSON 对象。无需任何身份验证,每个用户都可以访问任何数据。
现在让我们添加 JWT 的使用来验证用户。当然,因为我们没有做授权,所以每个用户仍然可以访问任何东西,但至少现在我们知道谁访问了什么。
下一步:存储对象时,将用户的sub
声明与对象一起保存,并验证用户的sub
声明是否与请求的对象匹配,如果是,则交付它。现在我们在每个用户的基础上获得授权。到目前为止,很简单。
现在让我们添加让用户与其他用户共享对象的可能性。例如,为了简单起见,我们希望拥有预定义的组(即角色),并且我们希望让用户选择哪个组(角色)可以访问他们创建的对象。这仍然很容易,因为您有一个预定义的组列表,所以您可以让用户选择一个或多个,并将它们附加到对象。此外,身份提供者需要配置为将 groups
声明放入每个用户的令牌中,以便我们可以匹配它们。从本段的长度我们已经可以看出,事情变得更加复杂。
问题 1:到目前为止,我是否正确,以这种方式处理 "static" 组?
现在,让我们让用户有机会自行创建群组。这仍然不复杂,但是我们如何让身份提供者使用动态创建的组呢?当然,我们不想让管理员每天更新身份提供者的配置 ;-)。
问题 2:我们如何处理动态创建的组?
现在,最后,让我们忘记组,假设我们希望允许用户能够简单地与其他用户共享他们的对象。这应该可以为每个对象单独配置。我们如何做到这一点?我们是否保存对象的用户列表?如果是这样,我们到底节省了什么? sub
声明?如果是这样,所有者用户如何知道适当的值?或者...?
并且:假设用户想将他们的朋友动态地放入动态生成的圈子中,我们该怎么做?
问题 3:令牌和具有动态分配用户的动态创建的组如何相互协作?
在我看来,令牌应该只包含身份信息(-声明),你需要在你的资源服务器上识别用户,或者刷新时不会改变,因为你不希望你的用户(或你的应用程序)每次他的权限更改时都必须刷新他的访问令牌(因为访问令牌授予特定时间的访问权限,您不希望您的用户访问他失去访问权限的某些资源自从他的最后一个令牌通过不刷新令牌并简单地使用旧令牌来刷新)。您附加到令牌的安全相关信息越多,您可能给系统添加的漏洞就越多(取决于您的令牌生命周期)。
这么说,我会(并且总是这样做)通过资源服务器上的用户 ID(包含在 jwt-token 中)来识别用户角色或组。为实现这一点,我总是将用户身份信息附加到我的资源服务器上的当前请求,并将用户角色或组等声明附加到身份。
通过仅添加我需要在我的资源服务器上识别用户和用户权限的身份信息,我倾向于在多个应用程序中使用我的身份提供者而不处理身份提供者的应用程序范围,因此我可以使用多个独立资源服务器的访问令牌完全相同。
让我们考虑一个简单的基于 REST 的 Web 服务来存储和检索 JSON 对象。无需任何身份验证,每个用户都可以访问任何数据。
现在让我们添加 JWT 的使用来验证用户。当然,因为我们没有做授权,所以每个用户仍然可以访问任何东西,但至少现在我们知道谁访问了什么。
下一步:存储对象时,将用户的sub
声明与对象一起保存,并验证用户的sub
声明是否与请求的对象匹配,如果是,则交付它。现在我们在每个用户的基础上获得授权。到目前为止,很简单。
现在让我们添加让用户与其他用户共享对象的可能性。例如,为了简单起见,我们希望拥有预定义的组(即角色),并且我们希望让用户选择哪个组(角色)可以访问他们创建的对象。这仍然很容易,因为您有一个预定义的组列表,所以您可以让用户选择一个或多个,并将它们附加到对象。此外,身份提供者需要配置为将 groups
声明放入每个用户的令牌中,以便我们可以匹配它们。从本段的长度我们已经可以看出,事情变得更加复杂。
问题 1:到目前为止,我是否正确,以这种方式处理 "static" 组?
现在,让我们让用户有机会自行创建群组。这仍然不复杂,但是我们如何让身份提供者使用动态创建的组呢?当然,我们不想让管理员每天更新身份提供者的配置 ;-)。
问题 2:我们如何处理动态创建的组?
现在,最后,让我们忘记组,假设我们希望允许用户能够简单地与其他用户共享他们的对象。这应该可以为每个对象单独配置。我们如何做到这一点?我们是否保存对象的用户列表?如果是这样,我们到底节省了什么? sub
声明?如果是这样,所有者用户如何知道适当的值?或者...?
并且:假设用户想将他们的朋友动态地放入动态生成的圈子中,我们该怎么做?
问题 3:令牌和具有动态分配用户的动态创建的组如何相互协作?
在我看来,令牌应该只包含身份信息(-声明),你需要在你的资源服务器上识别用户,或者刷新时不会改变,因为你不希望你的用户(或你的应用程序)每次他的权限更改时都必须刷新他的访问令牌(因为访问令牌授予特定时间的访问权限,您不希望您的用户访问他失去访问权限的某些资源自从他的最后一个令牌通过不刷新令牌并简单地使用旧令牌来刷新)。您附加到令牌的安全相关信息越多,您可能给系统添加的漏洞就越多(取决于您的令牌生命周期)。
这么说,我会(并且总是这样做)通过资源服务器上的用户 ID(包含在 jwt-token 中)来识别用户角色或组。为实现这一点,我总是将用户身份信息附加到我的资源服务器上的当前请求,并将用户角色或组等声明附加到身份。
通过仅添加我需要在我的资源服务器上识别用户和用户权限的身份信息,我倾向于在多个应用程序中使用我的身份提供者而不处理身份提供者的应用程序范围,因此我可以使用多个独立资源服务器的访问令牌完全相同。