启用强制登录后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
相关产品推荐
相关产品推荐

