如何在oauth2身份验证之上实现用户权限

时间:2019-12-17 00:52:36

标签: security permissions authorization user-permissions

在使用oauth2通过IdP对其用户进行身份验证的Web应用程序中,用于实现用户权限(客户端和服务器端)的更标准/推荐的选项是什么?

通过“用户权限”,我指的是允许或不允许用户在应用程序内部执行的操作。
例如,假设应用程序有一个“管理员”页面,用于管理应用程序的某些设置,只允许特定用户输入。这些用户中的某些仅被允许查看当前设置,而其他用户也被允许更改设置(可能只有其中一些)。

据我所知,oauth2中的“作用域”概念可能可以用于实现这样的要求,例如,仅允许查看“ admin”页面的用户会有一个{{1} }范围,而同时还可以编辑设置的用户将拥有app:admin:view范围。
但是,似乎在大多数大型身份提供者服务中,管理这些范围并将其分配给用户的任务将是一件非常乏味的事情。

这将是一个好的解决方案吗?如果是这样,是否有任何产品/服务可以与oauth2 IdP集成,并有助于更轻松地管理权限及其向用户的分配(例如,具有直观的UI)?如果没有,是否有任何成熟的方法可以处理这种情况?

2 个答案:

答案 0 :(得分:0)

范围

我不会为此目的使用OAuth2 scopes。原因是OAuth2范围用于限制应用对用户的资源可以执行的操作,而不是用于限制用户在用户的资源中可以执行的操作。 应用程序

例如,如果我编写了一个Web应用程序,向用户显示他们在Google Docs中使用的语言,则它需要Google委派的特权才能读取用户的Google Docs,而不必例如读取其日历。因此,应用程序将从Google获得一个具有作用域的OAuth2令牌,该令牌具有read-Docs特权,但没有read-calendar特权或任何其他不必要的特权。

使用范围来携带有关用户权限(而不是应用程序权限)的信息的具体缺点是,如果您要实现上述类似的功能,则应用程序可以对应用程序中的用户资源进行不同级别的访问,尝试同时以多种方式使用OAuth2范围可能会造成混淆。如果您想通过API向您的客户公开应用程序中的功能以集成到他们自己的应用程序中,那么这可能会成为问题。

OAuth2委托与OpenID Connect身份验证

您提到您正在使用OAuth2进行身份验证。 OAuth2用于委派授权not for authentication。 OAuth2访问令牌do not represent authenticated usersOpenId Connect个ID令牌即可。

AWS Cognito用户组

我喜欢使用AWS Cognito进行身份验证。它为您跟踪用户,因此您不需要用户数据库,并处理对它们的身份验证。它与Google和Facebook等外部身份提供商集成。对于跟踪不同类型用户的用例,可以使用Cognito GroupsHere是带有示例的博客文章。

基本上,您会从Cognito获得一个ID令牌,并且您的客户端或服务器可以读取该ID令牌以找出用户的组(管理员,常规用户等),并采取相应的措施。 Here是从令牌中读取组的示例。

答案 1 :(得分:0)

OAuth2实现中的授权服务器返回JWT(作为访问令牌)。您可以让授权服务器以某些自定义“声明”返回用户访问信息。 Spring Security OAuth2支持这一点。教程是Parcelables

但是,如果用户的访问信息列表过长,使得JWT的大小超过4KB,则您将无法将令牌存储在cookie中(通常使用cookie,并且该cookie被视为安全的选项来存储正如我在其他答案herehere中所解释的那样,在客户端使用令牌。在这种情况下,您可以有一个单独的微服务,该微服务将在给定用户名的情况下返回用户访问信息,并且可以将该信息本地缓存在其他服务中。