【问题标题】:Create different JWT authoriser in Auth0 and attach permissions based on the permitted roles在 Auth0 中创建不同的 JWT 授权者,并根据允许的角色附加权限
【发布时间】:2020-07-06 16:11:12
【问题描述】:

我的 Auth0 租户中有三种用户:

  1. 普通用户(无角色)
  2. 版主用户(分配了“Mod”角色)
  3. 管理员用户(分配了“管理员”角色)

我在 Auth0 中创建了一个 API,并通过新 AWS API Gateway HTTP API 中的 JWT 授权器附加到端点。

有些端点允许的业务逻辑只允许普通用户和管理员,而有些则允许 Mod 和管理员。例如:

  1. 端点 1:允许普通用户和管理员
  2. 端点 2:允许 Mod 和管理员
  3. 端点 3:仅允许 Mod

目前,授权者允许Auth0中用户数据库中的任何用户,我通过几个Auth0的管理API在应用程序中检查用户的身份:

  1. /userInfo 确保令牌与 :user_id 匹配。
  2. /oauth/token 获取 Auth0 管理 API 访问令牌。
  3. /api/v2/users/:user_id 获取用户资料。
  4. /api/v2/users/:user_id/roles 获取角色。

我相信应该有更好的方法来处理身份检查。是否可以创建具有不同角色/权限范围的多个授权者(例如,允许普通用户和管理员)并相应地附加到相关端点?

【问题讨论】:

    标签: oauth-2.0 jwt aws-api-gateway auth0 httpapi


    【解决方案1】:

    根据AWS API Gateway Doc,我意识到来自Lambda的event.requestContext.authorizer.claims中有一个claims对象。

    1. 因此,额外的/userInfo 调用是不必要的。
    2. 我添加了 2 个Auth0 rules 以将用户角色合并到user.app_metadata 和claims 对象。

    #2 的代码示例:

    function assignRoleToAppMetadata (user, context, callback) {
      const ManagementClient = require('auth0@2.19.0').ManagementClient
      const management = new ManagementClient({
        domain: '{YOUR_ACCOUNT}.auth0.com',
        clientId: '{YOUR_NON_INTERACTIVE_CLIENT_ID}',
        clientSecret: '{YOUR_NON_INTERACTIVE_CLIENT_SECRET}'
      })
      const params = { id: user.user_id }
      management.getUserRoles(params)
        .then(roles => {
          user.app_metadata = user.app_metadata || {}
          user.app_metadata.roles = roles
          return auth0.users.updateAppMetadata(user.user_id, user.app_metadata)
        })
        .then(() => callback(null, user, context))
        .catch(err => {
          console.error(err.message)
          callback(null, user, context)
        })
    }
    

    此外,以下规则将角色信息附加到/userInfo:

    function(user, context, callback) {
      const namespace = 'https://{YOUR_ACCOUNT}.auth0.com/'
      context.idToken[namespace + 'roles'] = user.app_metadata.roles
      callback(null, user, context)
    }
    

    【讨论】:

      猜你喜欢
      • 2021-11-01
      • 2021-04-01
      • 2017-12-14
      • 2018-04-17
      • 1970-01-01
      • 1970-01-01
      • 2018-03-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多