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

如何在AWS Amplify登录后为GraphQL/AppSync请求添加JWT

解决AppSync IAM认证下获取UserPool用户信息的方案

我之前刚好踩过这个坑——当AppSync用IAM认证时,确实只能拿到Cognito身份池的上下文信息,UserPool的用户名、sub、邮箱这些核心属性没法直接通过$event.context.identity获取。要把UserPool的JWT传递到AppSync,你可以通过Amplify自定义请求头的方式实现,下面是亲测有效的具体步骤:

方案一:用Amplify API拦截器自动注入JWT

你可以借助Amplify API模块的请求拦截器,在每次GraphQL请求发送前,自动把当前用户的UserPool JWT加到请求头里。代码示例如下:

import { Amplify, API } from 'aws-amplify';
import { Auth } from 'aws-amplify';

// 保留你原本的Amplify初始化代码
Amplify.configure({
  // ...你的AppSync、Cognito配置项
});

// 添加请求拦截器,动态注入UserPool JWT
API.intercept({
  request: async (request) => {
    try {
      // 获取当前登录用户的session
      const session = await Auth.currentSession();
      // 这里选ID Token,因为它包含用户的基础属性(邮箱、用户名等);如果需要权限相关信息可以用Access Token
      const idToken = session.getIdToken().getJwtToken();
      // 自定义请求头,比如命名为x-userpool-jwt
      request.headers['x-userpool-jwt'] = idToken;
    } catch (err) {
      // 处理用户未登录的场景,避免请求失败
      console.warn('用户未登录,跳过JWT注入');
    }
    return request;
  }
});

方案二:自定义AppSync Client的请求头配置

如果你是手动创建AppSyncClient实例,也可以直接在配置里设置动态headers函数,实现同样的效果:

import { createAppSyncClient } from '@aws-amplify/api-graphql';
import { Auth } from 'aws-amplify';

const appSyncClient = createAppSyncClient({
  authMode: 'IAM',
  // 动态生成请求头
  headers: async () => {
    try {
      const session = await Auth.currentSession();
      const idToken = session.getIdToken().getJwtToken();
      return { 'x-userpool-jwt': idToken };
    } catch (err) {
      return {};
    }
  },
  // ...其他AppSync配置项
});

在AppSync侧解析JWT获取用户信息

把JWT传到AppSync后,你可以在Resolver里通过$context.request.headers.x-userpool-jwt拿到这个token,再解析出用户属性:

方式1:用AppSync内置函数快速解码(适合无需严格验证的场景)

AppSync支持直接解码JWT的payload部分,你可以在Resolver模板里这样写:

#set($jwtPayload = $util.parseJson($util.base64Decode($util.urlDecode($context.request.headers.x-userpool-jwt).split('.')[1])))
{
  "sub": "$jwtPayload.sub",
  "username": "$jwtPayload.username",
  "email": "$jwtPayload.email"
}

⚠️ 注意:这种方式只做了解码,没有验证签名的合法性,如果你的场景需要确保token未被篡改,建议用下面的Lambda方案。

方式2:通过Lambda Resolver验证并解析(安全可靠)

创建一个Lambda函数,接收JWT作为参数,用Cognito的公钥验证签名合法性,然后返回解析后的用户信息。在AppSync的Resolver里调用这个Lambda,就能安全地拿到可信的用户属性了。

额外注意事项

  • 选择ID Token还是Access Token:ID Token包含用户的基础身份属性,Access Token主要用于资源授权,根据你的业务需求选择即可。
  • 权限配置:如果用Lambda验证JWT,要确保Lambda的IAM角色允许访问Cognito UserPool的公钥(可以通过AWS SDK自动获取)。
  • 异常处理:拦截器里一定要捕获Auth的错误,避免用户未登录时请求直接失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:56:40