在 Auth0 中创建不同的 JWT 授权者,并根据允许的角色附加权限
Create different JWT authoriser in Auth0 and attach permissions based on the permitted roles
我的 Auth0 租户中有三种用户:
- 普通用户(无角色)
- Mod操作者用户(已分配 "Mod" 角色)
- 管理员用户(分配 "Admin" 角色)
我在 Auth0 中创建了一个 API 并通过新 AWS API 网关 HTTP API.
中的 JWT 授权者附加到端点
有些端点允许的业务逻辑只允许普通用户和管理员,有些允许 Mod 和管理员。例如:
- 端点 1:允许普通用户和管理员
- 端点 2:允许 Mod 和管理
- 端点 3:仅允许 Mod
目前,授权者允许Auth0中用户数据库中的任何用户,我通过几个Auth0的管理来检查应用程序中的用户身份API:
/userInfo
以确保令牌与 :user_id
. 匹配
/oauth/token
获取 Auth0 管理 API 访问令牌。
/api/v2/users/:user_id
获取用户配置文件。
/api/v2/users/:user_id/roles
获得角色。
我相信应该有更好的方法来处理身份检查。是否可以创建具有不同 role/permission 范围的多个授权者(例如允许普通用户和管理员)并相应地附加到相关端点?
我根据 AWS API Gateway Doc.
发现来自 Lambda 的 event.requestContext.authorizer.claims
中有一个 claims
对象
- 因此,额外的
/userInfo
调用是不必要的。
- 我添加了 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)
}
我的 Auth0 租户中有三种用户:
- 普通用户(无角色)
- Mod操作者用户(已分配 "Mod" 角色)
- 管理员用户(分配 "Admin" 角色)
我在 Auth0 中创建了一个 API 并通过新 AWS API 网关 HTTP API.
中的 JWT 授权者附加到端点有些端点允许的业务逻辑只允许普通用户和管理员,有些允许 Mod 和管理员。例如:
- 端点 1:允许普通用户和管理员
- 端点 2:允许 Mod 和管理
- 端点 3:仅允许 Mod
目前,授权者允许Auth0中用户数据库中的任何用户,我通过几个Auth0的管理来检查应用程序中的用户身份API:
/userInfo
以确保令牌与:user_id
. 匹配
/oauth/token
获取 Auth0 管理 API 访问令牌。/api/v2/users/:user_id
获取用户配置文件。/api/v2/users/:user_id/roles
获得角色。
我相信应该有更好的方法来处理身份检查。是否可以创建具有不同 role/permission 范围的多个授权者(例如允许普通用户和管理员)并相应地附加到相关端点?
我根据 AWS API Gateway Doc.
发现来自 Lambda 的event.requestContext.authorizer.claims
中有一个 claims
对象
- 因此,额外的
/userInfo
调用是不必要的。 - 我添加了 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)
}