十进制数的 OAuth 2 范围使用按位掩码
OAuth 2 scopes with decimal number to use bitwise mask
我的应用程序使用基于角色的访问控制,并使用按位运算来检查权限。伪代码是这样的:
function HasPermission(userPermission, permissionBitMask) {
return (userPermission& permissionBitMask) != 0;
}
现在,我决定切换到 OAuth 2,将使用 JWT。根据 OAuth 2 规范:
Scope is expressed as a set of case-sensitive and space-delimited
strings.
但我想将范围指定为数字,所以不是:
{
scope: ["item:create", "item:view", "product:view"]
// or an object based structure
}
我想使用:
{
scope : 7
}
这种设计可以接受吗,如果我改用区分大小写的字符串,我会错过什么。我想按位运算符方法应该比后一种情况下需要的字符串比较和搜索更高效。
从 JWT 的角度来看,这种方法很好,因为声明值可以是任何 JSON 类型,所以数字很好。
For JWTs, while claim names are strings, claim values can be any JSON type.
但是,如果您要求遵守 OAuth2,那么您的提议将不会被接受。如果您想从自己的授权服务器开始,但又想保持您的选择开放并轻松切换到由您托管的第三方授权服务器或像 Auth0 这样的云身份验证提供商,那么保持合规性可能是有益的。 (披露:我在 Auth0 工作)
如果我是你,即使我没有切换实现的计划,我也会保持 OAuth2 兼容。实现从多个 string
值到用于表示权限的整数的转换应该很容易。在一般情况下,这种简单的转换永远不会成为应用程序的性能瓶颈,但如果您确实有非常具体的性能要求,您始终可以将整数作为 string
:
包含在 JWT 中
{ scope: "7" }
这样您就符合 OAuth2 标准,并且可以使用简单的解析操作来转换为可用于按位比较的值。
我的应用程序使用基于角色的访问控制,并使用按位运算来检查权限。伪代码是这样的:
function HasPermission(userPermission, permissionBitMask) {
return (userPermission& permissionBitMask) != 0;
}
现在,我决定切换到 OAuth 2,将使用 JWT。根据 OAuth 2 规范:
Scope is expressed as a set of case-sensitive and space-delimited strings.
但我想将范围指定为数字,所以不是:
{
scope: ["item:create", "item:view", "product:view"]
// or an object based structure
}
我想使用:
{
scope : 7
}
这种设计可以接受吗,如果我改用区分大小写的字符串,我会错过什么。我想按位运算符方法应该比后一种情况下需要的字符串比较和搜索更高效。
从 JWT 的角度来看,这种方法很好,因为声明值可以是任何 JSON 类型,所以数字很好。
For JWTs, while claim names are strings, claim values can be any JSON type.
但是,如果您要求遵守 OAuth2,那么您的提议将不会被接受。如果您想从自己的授权服务器开始,但又想保持您的选择开放并轻松切换到由您托管的第三方授权服务器或像 Auth0 这样的云身份验证提供商,那么保持合规性可能是有益的。 (披露:我在 Auth0 工作)
如果我是你,即使我没有切换实现的计划,我也会保持 OAuth2 兼容。实现从多个 string
值到用于表示权限的整数的转换应该很容易。在一般情况下,这种简单的转换永远不会成为应用程序的性能瓶颈,但如果您确实有非常具体的性能要求,您始终可以将整数作为 string
:
{ scope: "7" }
这样您就符合 OAuth2 标准,并且可以使用简单的解析操作来转换为可用于按位比较的值。