在 OAuth2 中使用用户拥有的资源保护 URL
Securing URL with user owned resources in OAuth2
我知道 OAuth2 和 OIDC 如何使用自定义范围和令牌内省来保护 URL,如下所示:
/users/me/documents
我可以给这个 URL documents:view
范围,当从经过身份验证的用户收到令牌时,我可以询问授权服务器该用户是否具有正确的权限。然后我可以使用 preferred_username
声明或类似的声明来查看 /me
到底是谁。
但是如果我有一个可供多个用户访问的资源怎么办?假设用户有文档,但他的直接经理可以查看这些文档。要以经理的身份检索员工的文件,我需要像这样的 url:
/users/${userId}/documents
我如何才能以只有资源所有者和直接管理者才能查看此资源的方式实施它?我不希望每个人都通过知道 userId
来访问每个人的文档。我可以将访问权作为一个整体授予所有具有 manager
角色的用户,但这还不够具体。
我知道有 UMA
扩展,用户可以在其中代表他向其他用户授予对资源的访问权限,但授予权限的不是用户。在这种情况下,系统规定经理可以访问其员工文档。
编写提取 ${userId}
并执行检查的自定义策略是否有意义?或者这根本不应该由授权服务器完成,而应该由资源服务器完成?也许不同的方法可以达到相同的目标?
像这样更细粒度的授权是通过声明而不是范围完成的。可能存在用户可以查看哪些文档的业务规则,例如:
- 用户可以访问自己的文档
- 管理员可以查看所有文档
- 经理可以查看他们管理的人员的文档
在访问令牌中,这可能由以下声明表示:
- 用户名
- 角色
声明通常像这样特定于域,首选选项是在令牌发行期间将它们添加到令牌中。在 Curity,我们有一些关于这个主题的好资源:
声明和授权
授权服务器颁发访问令牌,然后 APIs(资源服务器)验证访问令牌并使用令牌数据对每个请求应用授权规则(通常是域特定的)。
声明通常在需要动态行为时使用 - 它们是从用户身份派生的运行时值,而范围是固定的设计时值。在您的示例中,API 可能还需要改变 SQL 以根据用户身份检索文档。
此主题有更复杂的变体,例如 API 调用 Open Policy Agent 等系统,以便返回的文档由安全管理员配置的规则确定。不过,该政策仍将涉及使用来自访问令牌的声明。
示例代码
如果有帮助,这里 some sample code of mine 显示了执行域特定授权规则时的方法类型。通常,您需要过滤集合并检查对单个项目的访问权限。
我知道 OAuth2 和 OIDC 如何使用自定义范围和令牌内省来保护 URL,如下所示:
/users/me/documents
我可以给这个 URL documents:view
范围,当从经过身份验证的用户收到令牌时,我可以询问授权服务器该用户是否具有正确的权限。然后我可以使用 preferred_username
声明或类似的声明来查看 /me
到底是谁。
但是如果我有一个可供多个用户访问的资源怎么办?假设用户有文档,但他的直接经理可以查看这些文档。要以经理的身份检索员工的文件,我需要像这样的 url:
/users/${userId}/documents
我如何才能以只有资源所有者和直接管理者才能查看此资源的方式实施它?我不希望每个人都通过知道 userId
来访问每个人的文档。我可以将访问权作为一个整体授予所有具有 manager
角色的用户,但这还不够具体。
我知道有 UMA
扩展,用户可以在其中代表他向其他用户授予对资源的访问权限,但授予权限的不是用户。在这种情况下,系统规定经理可以访问其员工文档。
编写提取 ${userId}
并执行检查的自定义策略是否有意义?或者这根本不应该由授权服务器完成,而应该由资源服务器完成?也许不同的方法可以达到相同的目标?
像这样更细粒度的授权是通过声明而不是范围完成的。可能存在用户可以查看哪些文档的业务规则,例如:
- 用户可以访问自己的文档
- 管理员可以查看所有文档
- 经理可以查看他们管理的人员的文档
在访问令牌中,这可能由以下声明表示:
- 用户名
- 角色
声明通常像这样特定于域,首选选项是在令牌发行期间将它们添加到令牌中。在 Curity,我们有一些关于这个主题的好资源:
声明和授权
授权服务器颁发访问令牌,然后 APIs(资源服务器)验证访问令牌并使用令牌数据对每个请求应用授权规则(通常是域特定的)。
声明通常在需要动态行为时使用 - 它们是从用户身份派生的运行时值,而范围是固定的设计时值。在您的示例中,API 可能还需要改变 SQL 以根据用户身份检索文档。
此主题有更复杂的变体,例如 API 调用 Open Policy Agent 等系统,以便返回的文档由安全管理员配置的规则确定。不过,该政策仍将涉及使用来自访问令牌的声明。
示例代码
如果有帮助,这里 some sample code of mine 显示了执行域特定授权规则时的方法类型。通常,您需要过滤集合并检查对单个项目的访问权限。