如何在 oauth2 身份验证之上实现用户权限
How to implement user permissions on top of oauth2 authentication
在使用 oauth2
通过 IdP 对其用户进行身份验证的 Web 应用程序中,还有哪些 standard/recommended 选项可用于实现用户权限(客户端和服务器端)?
"user permissions" 我指的是允许或不允许用户在应用程序内执行的操作。
例如,假设应用程序有一个 "admin" 页面,用于管理应用程序的某些设置,只允许特定用户进入。其中一些用户只允许查看当前设置,而其他用户也可以更改设置(可能只有其中一些)。
据我所知,oauth2 中 "scopes" 的概念可能用于实现这样的要求,例如,仅允许查看 "admin" 页面的用户将具有 app:admin:view
范围,而还可以编辑设置的用户还具有 app:admin:some-setting:edit
范围。
但是,在大多数大型身份提供者服务中,管理这些范围并将其分配给用户的任务似乎是一项非常乏味的任务。
这是一个好的解决方案吗?如果是这样,是否有任何 products/services 与 oauth2 IdP 集成并有助于更轻松地管理权限和将权限分配给用户(例如,使用直观的 UI)?如果没有,是否有处理此类情况的既定方法?
范围
我不会将 OAuth2 scopes 用于此目的。原因是 OAuth2 范围是为了限制 应用程序 可以对用户的 资源 做什么,而不是限制 用户可以做什么可以在申请.
例如,如果我编写了一个 Web 应用程序向用户显示他们在 Google 文档中使用的语言,它需要 Google 委托的权限才能读取用户的 Google 文档,而不是,例如,阅读他们的日历。因此,该应用程序将从 Google 获得一个 OAuth2 令牌,该令牌在 范围内 具有读取文档权限,但没有读取日历权限或任何其他不必要的权限。
使用范围来携带有关用户权限(相对于应用程序权限)的信息的具体缺点是,如果你想实现类似上面的内容,应用程序在你的范围内获得对用户资源的不同级别的访问权限应用程序,尝试同时以多种方式使用 OAuth2 范围可能会造成混淆。如果您想通过 API 向客户公开应用程序中的功能以集成到他们自己的应用程序中,这可能会成为一个问题。
OAuth2 授权与 OpenID Connect 身份验证
您提到您正在使用 OAuth2 进行身份验证。 OAuth2 用于委派授权,not for authentication. OAuth2 access tokens do not represent authenticated users. OpenId Connect ID 令牌。
AWS Cognito 用户组
我喜欢用 AWS Cognito for authentication. It keeps track of your users for you, so you don't need a user database, and handles authenticating them. It integrates with external identity providers like Google and Facebook. For your use case of keeping track of different kinds of users, you can use Cognito Groups. Here 是一个博客 post 有一个例子。
基本上您将从 Cognito 获得一个 ID 令牌,您的客户端或服务器可以读取 ID 令牌以确定用户的组(管理员、普通用户等),并采取相应的行动。 是从令牌中读取组的示例。
OAuth2 实现中的授权服务器return是一个 JWT(作为访问令牌)。您可以让授权服务器 return 在某些自定义 "claims" 中获取用户访问信息。 Spring 安全 OAuth2 支持这一点。教程是 here.
但是,如果用户有很长的访问信息列表,使 JWT 大小超过 4KB,您将无法将令牌存储在 cookie 中(这通常被认为是一种安全选项)正如我在其他答案 and 中解释的那样,将令牌存储在客户端。在这种情况下,您可以拥有一个单独的微服务,该服务将 return 给定用户名的用户访问信息,并且您可以在其他服务中本地缓存该信息。
在使用 oauth2
通过 IdP 对其用户进行身份验证的 Web 应用程序中,还有哪些 standard/recommended 选项可用于实现用户权限(客户端和服务器端)?
"user permissions" 我指的是允许或不允许用户在应用程序内执行的操作。
例如,假设应用程序有一个 "admin" 页面,用于管理应用程序的某些设置,只允许特定用户进入。其中一些用户只允许查看当前设置,而其他用户也可以更改设置(可能只有其中一些)。
据我所知,oauth2 中 "scopes" 的概念可能用于实现这样的要求,例如,仅允许查看 "admin" 页面的用户将具有 app:admin:view
范围,而还可以编辑设置的用户还具有 app:admin:some-setting:edit
范围。
但是,在大多数大型身份提供者服务中,管理这些范围并将其分配给用户的任务似乎是一项非常乏味的任务。
这是一个好的解决方案吗?如果是这样,是否有任何 products/services 与 oauth2 IdP 集成并有助于更轻松地管理权限和将权限分配给用户(例如,使用直观的 UI)?如果没有,是否有处理此类情况的既定方法?
范围
我不会将 OAuth2 scopes 用于此目的。原因是 OAuth2 范围是为了限制 应用程序 可以对用户的 资源 做什么,而不是限制 用户可以做什么可以在申请.
例如,如果我编写了一个 Web 应用程序向用户显示他们在 Google 文档中使用的语言,它需要 Google 委托的权限才能读取用户的 Google 文档,而不是,例如,阅读他们的日历。因此,该应用程序将从 Google 获得一个 OAuth2 令牌,该令牌在 范围内 具有读取文档权限,但没有读取日历权限或任何其他不必要的权限。
使用范围来携带有关用户权限(相对于应用程序权限)的信息的具体缺点是,如果你想实现类似上面的内容,应用程序在你的范围内获得对用户资源的不同级别的访问权限应用程序,尝试同时以多种方式使用 OAuth2 范围可能会造成混淆。如果您想通过 API 向客户公开应用程序中的功能以集成到他们自己的应用程序中,这可能会成为一个问题。
OAuth2 授权与 OpenID Connect 身份验证
您提到您正在使用 OAuth2 进行身份验证。 OAuth2 用于委派授权,not for authentication. OAuth2 access tokens do not represent authenticated users. OpenId Connect ID 令牌。
AWS Cognito 用户组
我喜欢用 AWS Cognito for authentication. It keeps track of your users for you, so you don't need a user database, and handles authenticating them. It integrates with external identity providers like Google and Facebook. For your use case of keeping track of different kinds of users, you can use Cognito Groups. Here 是一个博客 post 有一个例子。
基本上您将从 Cognito 获得一个 ID 令牌,您的客户端或服务器可以读取 ID 令牌以确定用户的组(管理员、普通用户等),并采取相应的行动。
OAuth2 实现中的授权服务器return是一个 JWT(作为访问令牌)。您可以让授权服务器 return 在某些自定义 "claims" 中获取用户访问信息。 Spring 安全 OAuth2 支持这一点。教程是 here.
但是,如果用户有很长的访问信息列表,使 JWT 大小超过 4KB,您将无法将令牌存储在 cookie 中(这通常被认为是一种安全选项)正如我在其他答案