You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在Cognito预令牌Lambda调用的callerContext中定义自定义信息?

解决Amazon Cognito预令牌生成钩子中自定义应用标识的问题

首先明确:无法直接在Cognito应用客户端中配置自定义字段并让它自动出现在callerContext里,callerContext的结构是Cognito固定提供的,只能拿到clientId、invokedBy这类默认属性。不过有几个靠谱的替代方案可以实现你的需求:

方案1:利用Cognito应用客户端的描述/标签存储自定义标识

这是最推荐的方案,直接在Cognito应用客户端配置里维护你的自定义应用标识,然后在Lambda中通过API获取:

  • 步骤1:创建或编辑Cognito应用客户端时,把你的appName(比如FoobarGame)填到描述字段里,或者添加一个标签(比如键appName,值FoobarGame)。
  • 步骤2:给Lambda执行角色添加权限,允许调用cognito-idp:DescribeUserPoolClient API。
  • 步骤3:在预令牌生成Lambda中,通过传入的callerContext.clientId调用DescribeUserPoolClient,拿到客户端的描述或标签,以此作为应用标识来生成令牌声明。

示例代码(Node.js,AWS SDK v3):

import { CognitoIdentityProviderClient, DescribeUserPoolClientCommand } from "@aws-sdk/client-cognito-identity-provider";

const client = new CognitoIdentityProviderClient({});

export const handler = async (event) => {
  const { clientId } = event.callerContext;
  const userPoolId = event.userPoolId; // 从事件中获取用户池ID

  // 调用API获取客户端信息
  const command = new DescribeUserPoolClientCommand({
    UserPoolId: userPoolId,
    ClientId: clientId
  });
  const response = await client.send(command);
  
  // 从描述中提取appName,或者从标签中取
  const appName = response.UserPoolClient.Description; 
  // 或者 const appName = response.UserPoolClient.ClientMetadata?.appName;

  // 用appName生成自定义声明
  event.response = {
    claimsOverrideDetails: {
      claimsToAddOrOverride: {
        appName: appName
      }
    }
  };

  return event;
};

方案2:通过客户端认证请求传递自定义参数

如果你的客户端是可信的,可以在发起认证请求时(比如调用InitiateAuth或AdminInitiateAuth),在AuthParameters里加入自定义参数(比如appName: "FoobarGame"),这个参数会出现在Lambda事件的request.validationData中,你可以直接读取使用。

注意:这个方案需要客户端配合传参,且如果客户端不可信,存在参数被篡改的风险,需要结合clientId验证合法性。

方案3:维护clientId与自定义标识的映射

把clientId和对应的appName映射关系存在Lambda的环境变量里(适合少量客户端),或者存在DynamoDB中(适合大量客户端)。Lambda收到事件后,通过clientId查询对应的appName,再生成声明。

这个方案的缺点是客户端重建后需要手动更新映射关系,但比直接依赖clientId更稳定,因为你可以用固定的appName来维护业务逻辑。


内容的提问来源于stack exchange,提问作者Glstunna

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 02:30:52