带有十进制数的 OAuth 2 范围以使用按位掩码

Posted

技术标签:

【中文标题】带有十进制数的 OAuth 2 范围以使用按位掩码【英文标题】:OAuth 2 scopes with decimal number to use bitwise mask 【发布时间】:2017-03-13 07:50:26 【问题描述】:

我的应用程序使用基于角色的访问控制并检查它使用按位运算的权限。伪代码类似于:

function HasPermission(userPermission, permissionBitMask) 
    return (userPermission& permissionBitMask) != 0;

现在,我决定切换到使用 JWT 的 OAuth 2。根据 OAuth 2 的规范:

范围表示为一组区分大小写并以空格分隔的 字符串。

但我想将范围指定为数字,所以不是:


    scope: ["item:create", "item:view", "product:view"]
    // or an object based structure

我想使用:


    scope : 7

这种设计是否可以接受,如果我改用区分大小写的字符串,我会错过什么。我想按位运算符方法应该比字符串比较和搜索更有效,后者在后一种情况下需要。

【问题讨论】:

【参考方案1】:

从 JWT 的角度来看,这种方法很好,因为声明值可以是任何 JSON 类型,所以数字很好。

对于 JWT,虽然声明名称是字符串,但声明值可以是任何 JSON 类型。

(来源:JSON Web Token (JWT)

但是,如果您要求遵守 OAuth2,那么您的提案将不被接受。如果您想从自己的授权服务器开始,但希望保持选项开放并轻松切换到您托管的第三方授权服务器或Auth0 等云身份验证提供商,那么保持合规可能会有所帮助。 (披露:我在 Auth0 工作)

如果我是你,即使我没有切换实现的计划,我也会保持 OAuth2 兼容。应该很容易实现从多个string 值到用于表示权限的整数的转换。在一般情况下,这种简单的转换永远不会成为应用程序的性能瓶颈,但如果您确实有非常具体的性能要求,您始终可以将整数作为 string 包含在 JWT 中:

 scope: "7" 

这样,您将符合 OAuth2 标准,并且只需简单的解析操作即可转换为可用于按位比较的值。

【讨论】:

如果它符合要求,我可以使用整数作为字符串。顺便说一句,我将 Auth0 用于我的一个项目,但如果您提供 Web 应用程序的本地安装,则无法使用它

以上是关于带有十进制数的 OAuth 2 范围以使用按位掩码的主要内容,如果未能解决你的问题,请参考以下文章

奇怪的知识——位掩码

这个按位汉明(31,26)编码器如何在 C 中工作? (位掩码)

什么是位掩码?

按位计数递增顺序遍历整数的每个位掩码[重复]

如何记录位掩码

位掩码是不是可以与位中的“访问数组”相媲美?