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

启用强制登录后AWS Amplify API请求仍用访客凭证问题

解决AWS Amplify强制登录下API调用使用访客凭证的问题

看起来你遇到的核心问题是:明明已经完成Cognito用户登录,Amplify调用API时却依然尝试使用访客凭证,而强制登录模式下访客凭证是被禁用的。下面是具体的排查和解决步骤:

一、确认Amplify API配置已关联Cognito认证

首先要确保你的API Gateway在Amplify中的配置正确绑定了Cognito User Pool作为认证方式:

  • 如果你通过MobileHub配置API,检查云逻辑页面的API设置,认证类型必须选择Cognito User Pool,不能是"访客访问"或其他未认证选项。
  • 查看本地aws-exports.js配置文件,确认aws_user_pools_id和aws_user_pools_web_client_id配置正确,且aws_cloud_logic_custom中的API项包含authorizationType: 'AMAZON_COGNITO_USER_POOLS',同时不需要配置aws_api_key(Cognito认证模式下无需API密钥)。

二、确保调用API前用户处于有效认证状态

即使表面登录成功,也可能存在会话未同步的情况。建议在调用API前,先通过Amplify Auth模块确认用户状态:

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

async function fetchChatroomData() {
  try {
    // 先验证用户已完成认证
    const authenticatedUser = await Auth.currentAuthenticatedUser();
    console.log("当前已认证用户信息:", authenticatedUser);
    
    // 再发起API请求
    const apiResponse = await API.get('YourAPIName', '/your-api-endpoint');
    console.log("API返回结果:", apiResponse);
  } catch (error) {
    console.error("认证或API调用出错:", error);
  }
}

这段代码会先确保用户处于有效认证状态,再发起API请求,避免Amplify fallback到访客凭证模式。

三、调整Lambda函数以获取已认证用户信息

你的Lambda目前硬编码了user_id: 'user-abc',实际应该从API Gateway传递的认证上下文里获取真实的用户ID。当API Gateway启用Cognito认证后,用户身份信息会包含在event.requestContext中:
修改你的Lambda主函数:

import { success, failure } from '../lib/response'; 
import * as dynamoDb from '../lib/dynamodb'; 

export const main = async (event, context, callback) => {
  // 从Cognito认证信息中提取用户唯一ID(sub是Cognito用户池的用户标识)
  const userId = event.requestContext.authorizer?.claims?.sub;
  
  if (!userId) {
    return callback(null, failure({ status: false }, "无法获取已认证用户ID"));
  }

  const params = { 
    TableName: 'chatrooms', 
    Key: { 
      user_id: userId, 
      chatroom_id: event.pathParameters.chatroom_id // 从路径参数动态获取聊天室ID
    } 
  }; 

  try { 
    const result = await dynamoDb.call('get', params); 
    if (result.Item) { 
      return callback(null, success(result.Item, 'Item found')); 
    } else { 
      return callback(null, failure({ status: false }, 'Item not found.')); 
    } 
  } catch (err) { 
    console.log(err); 
    return callback(null, failure({ status: false }, err.message)); 
  } 
}

这样就能让Lambda使用当前已认证用户的ID查询DynamoDB,实现基于用户身份的资源访问控制。

四、验证API Gateway的方法请求配置

最后检查API Gateway的GET方法设置:

  • 确保该方法开启了Cognito User Pool认证,并正确选择你的目标User Pool。
  • 确认"API Key Required"设置为false(Cognito认证模式下不需要API密钥)。

通过以上步骤,应该就能解决Amplify在已登录状态下仍使用访客凭证调用API的问题,同时让Lambda正确获取并使用已认证用户的信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:30:25