使用Cognito访问令牌对接Verified Permissions的技术问询
AWS Verified Permissions 规范Schema创建与授权请求构造
一、创建符合要求的Schema
Verified Permissions 使用 Cedar 语言定义实体Schema,需要匹配你的业务实体(用户、资源、动作)结构,同时对齐Cognito令牌携带的属性。
核心定义要点
- 主体(Principal):对应Cognito用户,需映射令牌内的标准/自定义Claim(如
sub、email、groups) - 资源(Resource):定义业务资源类型(如示例中的
Module) - 动作(Action):声明可对资源执行的操作(如
read、write),并绑定可作用的资源类型
示例Cedar Schema
// 定义Cognito用户主体类型 entity type User extends Principal { attributes: { sub: String, // 对应Cognito令牌的sub Claim email: String, // 对应Cognito令牌的email Claim groups: Set<String> // 对应Cognito用户组的自定义Claim } } // 定义业务资源类型:模块 entity type Module extends Resource { attributes: { moduleId: String // 资源唯一标识属性 } } // 定义动作类型,指定可作用的资源范围 action type Action { applies to: [Module] } // 声明具体动作实例 action read: Action; action write: Action;
注意事项
- Schema内的
entityType、actionType必须和后续授权请求中的参数严格一致 - 确保Schema属性名与Cognito令牌内的Claim名称完全匹配,Verified Permissions会自动映射令牌属性到实体
二、构造合法的isAuthorizedWithToken请求参数
你的现有代码存在几个关键缺失项,以下是修正后的完整示例:
修正后代码
import { VerifiedPermissions } from "@aws-sdk/client-verifiedpermissions"; const authorizeWithToken = async () => { const accessToken = "你的Cognito Access Token"; const idToken = "你的Cognito ID Token"; // 可选,如需用到ID Token内的属性则传入 try { // 初始化Verified Permissions客户端,指定AWS区域 const client = new VerifiedPermissions({ region: "us-east-1" }); const params = { // 必传:策略存储ID,在AWS控制台创建策略存储时生成 policyStoreId: "ps-xxxxxxxxxxxxxx", // 传入Cognito Access Token作为主体凭证 accessToken: accessToken, // 可选:传入ID Token以获取更多用户属性 // identityToken: idToken, // 动作定义:需与Schema内的动作一致 action: { actionId: "read", actionType: "Action" }, // 资源定义:需与Schema内的资源类型一致 resource: { entityId: "mis", entityType: "Module" }, // 可选:传递额外上下文信息(如IP、时间) // context: { // contextMap: { // ipAddress: "192.168.1.1" // } // } }; const result = await client.isAuthorizedWithToken(params); // 决策结果:allowed为true则授权通过,false则拒绝 console.log("授权决策:", result.decision); return result; } catch (error) { console.error("授权请求失败:", error); throw error; } };
关键参数说明
- policyStoreId:必传项,是Verified Permissions策略存储的唯一标识,无此参数请求会直接失败
- accessToken/identityToken:二选一或同时传入,Verified Permissions会自动验证令牌有效性并解析属性作为主体信息
- action:
actionId需与Schema内声明的动作(如read)一致,actionType必须匹配Schema内的动作类型(如Action) - resource:
entityId为资源唯一标识,entityType必须匹配Schema内的资源类型(如Module)
三、额外注意事项
- 确保Cognito令牌未过期且签名有效,Verified Permissions会自动完成令牌验证
- 需在策略存储中创建Cedar授权策略(如允许某用户组读取指定模块),否则默认会拒绝所有请求
- 若需基于自定义Claim做授权逻辑,需提前在Schema中定义对应属性
内容的提问来源于stack exchange,提问作者Shafeeque Ali P
相关产品推荐
相关产品推荐

