我目前正在编写Auth0教程,位于此处:
https://auth0.com/docs/quickstart/spa/react/04-authorization
我正努力在管理员用户的上下文中理解范围的概念。
具体来说,以下文字......
由于此范围表明用户具有对数据的只读访问权限, 可能会认为用户有某种“常规用户” 访问权限。
如果您希望某些用户具有对同一资源的写入权限, 因此,您可以使用某种“管理员”访问级别 考虑引入写作范围:消息。
通过在我的控制面板中将write:messages作为范围添加到api,可以为每个用户请求并设置它。
这根本感觉不对。所以我试图通过规则解决这个问题。
function (user, context, callback) {
if(user.app_metadata.roles.indexOf('admin') > -1) {
console.log(context);
context.accessToken.scope = 'write:messages';
}
callback(null, user, context);
}
在我的app_metadata对象中,我已经给了我的管理员用户,admin的角色。此规则有效,现在登录时,开发工具中显示的范围是“write:messages”。
但是,现在已删除了初始范围,例如“openid read:messages”等
我哪里错了?如果用户是管理员,我想分配添加到现有范围。
这是范围/声明的正确过程吗?
答案 0 :(得分:6)
了解范围概念及其存在原因的最佳方法是了解JWT的基本概念。 Auth0 jwt只是一个可以变成JSON的巨型哈希键。我可以真正接受任何jwt,转到他们网站上的debugger并将其放在那里并查看该令牌上的所有数据集。我可以对它进行编辑,哈希值也会改变。
范围是您可以在该JSON中拥有属性的想法,它可以告诉您的React应用程序他们可以或不可以去哪里。问题是任何人都可以使用他们的令牌并编辑范围以进入应用程序的某些部分。
让他们变得伟大的是,即使一个人这样做,他们也无能为力。第二个他们试图改变他们要求你的服务器的任何东西。这就是jwt的秘密所在。它会知道有人篡改了HTTP请求标头中发送的令牌,并且他们的请求将被拒绝。
什么是范围?
因此,当您登录时,Auth0会尝试简化一些事情,请求您想要获取该令牌的范围。范围只是JWT的属性。
requestedScopes = 'openid profile read:messages write:messages';
auth0 = new auth0.WebAuth({
// ...
scope: this.requestedScopes
});
在此示例中,您表示要从令牌中获取此信息。您需要他们的配置文件信息,并且您希望登录的用户使用这些范围。登录后,您将获得一个对象作为响应。它将有一个名为scopes的属性。如果scopes属性为空,则表示登录的用户具有分配给它们的所有范围。如果登录的用户的作用域多于您请求的作用域,则scopes属性将为其分配额外的标记。
它是以这种方式设计的,因为标准用户将拥有所有基本权限,但管理员将拥有其他填充在您获取的范围属性中的权限。
范围和应用元数据之间的差异
应用程序元数据的不同之处在于它是配置文件的一部分。 Check out this token I created with scopes attached to it。您可以看到它与配置文件不同。应用程序元数据只能使用管理API在令牌上设置。这意味着只有您的服务器才能更改该信息。
因此,范围和app_metadata为您提供了两种处理人们在您网站上拥有的权限的方法。您还可以在应用程序元数据中声明这是一个管理员,让他们在您的客户端上执行管理员工作。
与Management API相关的范围
有时您的服务器需要使用管理API,这意味着它也需要一个令牌。该令牌可以具有Auth0预定义的范围,以确定允许其访问的端点。 Check out the management API explorer and see how these scopes play a part.
Auth0使用范围作为api的方式应该可以让你很好地了解你可以用它们做些什么。
请记住: