Auth0管理员/用户范围

Har*_*lue 0 javascript authentication scope auth0

我目前正在编写Auth0教程,位于此处:

https://auth0.com/docs/quickstart/spa/react/04-authorization

并且我正努力在管理员用户的上下文中理解范围的概念.

具体来说,以下文字......

由于此范围表示用户具有对数据的只读访问权限,因此可能认为用户具有某种"常规用户"访问级别.

如果您希望某些用户具有对同一资源的写访问权限,从而具有某种"管理员"访问级别,您可以考虑引入write:messages范围.

通过将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);
}
Run Code Online (Sandbox Code Playgroud)

在我的app_metadata对象中,我给了我的管理员用户,admin的角色.此规则有效,现在登录时,开发工具中显示的范围是"write:messages".

但是,现在已删除了初始范围,例如"openid read:messages"等

我哪里错了?如果用户是管理员,我想分配添加到现有范围.

这是范围/索赔的正确过程吗?

EJ *_*son 6

了解范围概念及其存在原因的最佳方法是了解JWT的基本概念.Auth0 jwt只是一个可以变成JSON的巨型哈希键.我可以真正接受任何jwt,转到他们网站上的调试器并将其放在那里并查看该令牌上的所有数据集.我可以对它进行编辑,哈希值也会改变.

范围是您可以在该JSON中拥有属性的想法,它可以告诉您的React应用程序它们可以或不可以去哪里.问题是任何人都可以使用他们的令牌并编辑范围以进入应用程序的某些部分.

让他们变得伟大的是,即使一个人这样做,他们也无能为力.第二个他们试图改变他们要求你的服务器的任何东西.这就是jwt的秘密所在.它会知道有人篡改了HTTP请求标头中发送的令牌,并且他们的请求将被拒绝.

什么是范围?

那么Auth0做什么来尝试简化一些事情就是当你登录时请求你想要回来的那个令牌的范围.范围只是JWT的属性.

requestedScopes = 'openid profile read:messages write:messages';

auth0 = new auth0.WebAuth({
  // ...
  scope: this.requestedScopes
});
Run Code Online (Sandbox Code Playgroud)

在此示例中,您表示要从令牌中获取此信息.您需要他们的配置文件信息,并且您希望登录的用户使用这些范围.登录后,您将获得一个对象作为响应.它将有一个名为scopes的属性.如果scopes属性为空,则表示登录的用户具有分配给它们的所有范围.如果登录的用户的范围超出您的请求范围,则scopes属性将为其分配额外的标记.

它是以这种方式设计的,因为标准用户将拥有所有基本权限,但管理员将拥有其他填充在您获取的范围属性中的权限.

范围和应用程序元数据之间的差异

应用程序元数据的不同之处在于它是配置文件的一部分.查看我创建的带有附加范围的令牌.您可以看到它与配置文件不同.只能使用管理API在令牌上设置应用程序元数据.这意味着只有您的服务器才能更改该信息.

因此,范围和app_metadata为您提供了两种处理人们在您网站上拥有的权限的方法.您还可以在应用程序元数据中声明这是一个管理员,让他们在您的客户端上执行管理员工作.

与Managment API相关的范围

有时您的服务器需要使用管理API,这意味着它也需要一个令牌.该令牌可以具有Auth0预定义的范围,以确定允许其访问的端点.查看管理API资源管理器,了解这些范围如何发挥作用.

Auth0为api使用范围的方式应该可以让你很好地了解你可以用它们做些什么.

只记得:

  • 可以更改jwt但签名无效.
  • 没有办法(完全)保护用户在您的客户端上所做的事情.
  • 范围和应用程序元数据可帮助您保护用户可以在服务器上执行的操作.
  • 保守客户的秘密