了解本地 AWS API 网关上的 403 错误
与合作后 AWS API网关 并通过 AWS SAM(无服务器应用程序模型)进行本地测试,通常会发现部署 API 后不会出现的错误。一个问题是获得 403 禁止错误 执行 OPTIONS 方法时,尽管正确配置了 CORS 的 API 并将 AuthorizationType 设置为“NONE”。当安装在部署环境中顺利运行时,这个问题可能会特别严重。
当在本地测试 OPTIONS 请求时 卷曲,API 网关可能会返回“缺少身份验证令牌”错误。这是令人困惑的,因为 OPTIONS 方法不应该要求身份验证,特别是当明确设置为提供 200 结果时。找出这种差异的根源对于当地发展的成功至关重要。
了解 SAM 本地行为与部署的 API 网关不同的原因可以帮助您解决此问题。深入研究配置细节并确保本地和部署的环境尽可能匹配至关重要。错误配置经常会导致此类错误。
在本文中,我们将了解本地开发过程中出现 403 错误的可能原因以及解决方法。我们将回顾以下方面的常见陷阱 SAM 模板、CORS 处理和 API 网关设置,这样您就可以避免这些障碍并继续有效地构建。
命令 | 使用示例 |
---|---|
app.options() | 定义在 Express.js 中处理 OPTIONS 请求的路由,这是预检 CORS 处理所需的。在这种情况下,它使服务器能够在继续处理 POST 请求之前对 CORS 预检查询做出反应。 |
res.setHeader() | 该函数在响应中设置特定的HTTP标头,例如 访问控制允许来源,这对于在使用各种来源的 API 时启用 CORS 和防止 403 错误至关重要。 |
PassthroughBehavior | AWS API Gateway 方法的自定义配置,指定在没有匹配模板可用时如何处理请求。将其设置为 WHEN_NO_MATCH 保证在未提供特定请求模板时模拟集成正常运行。 |
IntegrationHttpMethod | 定义 API Gateway 用于调用后端服务的 HTTP 方法(例如 Lambda 函数)。这对于将 API 网关路由链接到适当的 HTTP 方法至关重要,该方法将启动后端操作。 |
AWS::ApiGateway::Method | AWS SAM 模板指定 API Gateway 方法资源。这对于定义 API 网关应支持的 HTTP 方法(POST、OPTIONS)并将其映射到后端集成至关重要。 |
ResponseParameters | 此命令在 API Gateway 集成响应中使用,通过设置标头(例如 访问控制允许方法。这些参数按照CORS策略返回给客户端。 |
app.route() | 此 Flask 命令将 HTTP 方法(例如 POST 和 OPTIONS)映射到特定函数。在这种情况下,对 OPTIONS(预检查询)和 POST(主要 API 请求)做出不同的反应至关重要。 |
!Ref | 用于 AWS CloudFormation/SAM 模板!参考 对模板中其他资源的引用。例如,它用于引用 扫描记录资源 并将 API 调用正确链接到正确的 URL。 |
app.response_class() | 此命令在 Flask 中生成自定义响应对象,使您可以控制 HTTP 状态代码和标头。它对于设置某些 CORS 标头特别方便,例如 访问控制允许来源。 |
了解和优化 AWS API Gateway 本地调用
在本文中,我们将了解本地开发过程中出现 403 错误的可能原因以及解决方法。我们将回顾以下方面的常见陷阱 SAM 模板、CORS 处理和 API 网关设置,这样您就可以避免这些障碍并继续有效地构建。
在 Express 服务器中,我们使用 res.setHeader() 设置 CORS 标头,例如“Access-Control-Allow-Origin”和“Access-Control-Allow-Methods”。这可确保将适当的标头返回给客户端,从而允许跨源请求。此外,该脚本的 POST 方法通过 AWS 开发工具包连接到 AWS DynamoDB 表。扫描操作是只读操作,它返回所选表中的所有记录,使我们能够在本地测试数据库交互。正确的错误处理用于管理数据库连接问题,确保服务器对故障做出适当的响应。
第二个示例是使用 Flask 用 Python 构建的,提供与 Node.js 脚本相同的功能,但适用于对 Python 更有经验的开发人员。烧瓶的 应用程序.route() 方法将 OPTIONS 和 POST 方法路由到指定的例程,确保轻松处理 CORS 预检请求。自定义响应是使用 app.response_class() 方法,其中包含相关的 CORS 标头。 POST 方法与 Node.js 示例一样,使用适用于 Python 的 AWS 开发工具包 (boto3) 扫描 DynamoDB 表。这种模块化允许开发人员根据他们喜欢 JavaScript 还是 Python 来简单地改变后端。
最后,SAM 模板设置可确保 AWS API Gateway 正确设置为接收 POST 和 OPTIONS 查询。这 直通行为 属性设置为“WHEN_NO_MATCH”,这允许API网关处理与预定模板不匹配的请求。这在使用模拟集成时非常有用,因为它允许系统在不真正运行后端 Lambda 的情况下提供 200 状态代码。这 集成响应 和 方法响应 部分指定确保 OPTIONS 方法向客户端发送正确的 CORS 配置的标头和响应参数。此方法对于避免本地 SAM 测试期间的“403 Forbidden”问题至关重要。
修复本地 SAM 调用的 AWS API Gateway 上的 403 错误。
解决方案 1:使用 Express.js 和 AWS SDK 的 Node.js 后端,具有高效的 CORS 和 OPTIONS 处理。
// Import required modules
const express = require('express');
const AWS = require('aws-sdk');
const cors = require('cors');
const app = express();
app.use(cors());
// Middleware for JSON request parsing
app.use(express.json());
// CORS preflight response handling
app.options('/scanRecords', (req, res) => {
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', 'POST, OPTIONS');
res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
res.status(200).send();
});
// Main POST method for scanRecords
app.post('/scanRecords', async (req, res) => {
const dynamoDB = new AWS.DynamoDB.DocumentClient();
try {
const params = { TableName: 'RecordsTable' };
const data = await dynamoDB.scan(params).promise();
res.status(200).json(data);
} catch (err) {
res.status(500).send('Error fetching records');
}
});
// Start the Express server on PORT 3000
app.listen(3000, () => {
console.log('Server running on http://localhost:3000');
});
解决 AWS SAM Local 中的“缺少身份验证令牌”
解决方案 2:使用 Flask 的 Python 后端,配置本地 SAM 和 API 网关
from flask import Flask, jsonify, request
import boto3
app = Flask(__name__)
# CORS headers for OPTIONS requests
@app.route('/scanRecords', methods=['OPTIONS'])
def options_method():
response = app.response_class(status=200)
response.headers['Access-Control-Allow-Origin'] = '*'
response.headers['Access-Control-Allow-Methods'] = 'POST, OPTIONS'
response.headers['Access-Control-Allow-Headers'] = 'Content-Type, Authorization'
return response
# POST method to scan records from DynamoDB
@app.route('/scanRecords', methods=['POST'])
def scan_records():
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('RecordsTable')
try:
response = table.scan()
return jsonify(response['Items']), 200
except Exception as e:
return str(e), 500
# Run the Flask app on port 3000
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0', port=3000)
使用 SAM 测试 AWS API Gateway 本地调用
解决方案 3:配置 SAM 模板来处理 OPTIONS 请求并避免 403 错误。
Resources:
scanRecords:
Type: AWS::Serverless::Function
Properties:
Handler: dist/dynamo/CRUD.scanRecords
CodeUri: ./backend
Policies:
- AmazonDynamoDBFullAccess
- CloudWatchLogsFullAccess
Events:
ApiEvent:
Type: Api
Properties:
Path: /scanRecords
Method: post
scanRecordsOptionsMethod:
Type: AWS::ApiGateway::Method
Properties:
AuthorizationType: NONE
HttpMethod: OPTIONS
ResourceId: !Ref scanRecordsResource
RestApiId: !Ref apiGatewayRestApi
Integration:
Type: MOCK
IntegrationResponses:
- StatusCode: 200
ResponseParameters:
method.response.header.Access-Control-Allow-Headers: "'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token'"
method.response.header.Access-Control-Allow-Methods: "'POST,OPTIONS'"
method.response.header.Access-Control-Allow-Origin: "'*'"
排查 AWS API Gateway 本地 403 错误
当在 SAM 本地调用期间看到 403 错误时,了解如何在 API 网关中实施 CORS(跨源资源共享)策略至关重要。虽然您的部署可以在云上适当处理 CORS,但使用本地调用 AWS SAM 有时会导致 OPTIONS 方法的处理方式之间不兼容。这是因为本地环境可能并不总是准确地复制所有设置,并且必须正确集成 OPTIONS 机制以避免身份验证困难。
另一个关键特征是 403 错误经常与 API Gateway 权限缺失或配置错误相关。在本地开发期间,确保您的 SAM 模板正确定义至关重要 授权类型 对于 OPTIONS 请求为“NONE”,并且相应的权限在 拉姆达 功能已正确设置。否则,请求将返回“缺少身份验证令牌”消息,表明系统需要未指定的身份验证机制。
最后,处理模拟集成是一种有效的技术,可以避免为 OPTIONS 方法调用 Lambda 函数。创建一个 模拟集成 在 API 网关中使用响应参数,以保证 OPTIONS 方法提供带有所需 CORS 标头的默认 200 响应。这简化了开发过程,并有助于避免 403 错误,这些错误通常是由本地和部署设置中的非托管预检查询引起的。
有关 AWS API Gateway 403 错误的常见问题
- 为什么我仅在 SAM 本地中收到 403 问题,但在部署时却没有收到 403 问题?
- 本地 SAM 环境可能无法模仿完整的 API 网关配置,特别是对于 AuthorizationType 和 CORS 设置。确保您的本地设置与部署的设置匹配,包括 OPTIONS 请求的虚假集成。
- 什么是“缺少身份验证令牌”错误?
- 此错误表明 API 网关需要身份验证令牌,但未提供该令牌。对于 OPTIONS 请求,请确保 AuthorizationType: NONE 已在您的 SAM 模板中正确配置。
- 如何在 AWS API Gateway 中处理 CORS 预检请求?
- 要处理 CORS,请确保您的 OPTIONS 方法适当地设置了相关的响应头,例如 Access-Control-Allow-Origin 和 Access-Control-Allow-Methods。
- 我可以使用 AWS SAM 在本地测试 CORS 吗?
- 是的,您可以在本地测试 CORS,但请确保您的 app.options() 方法或等效的 API 网关配置返回预检 OPTIONS 请求的正确标头。
- 什么是 AWS API Gateway 中的模拟集成?
- 一个 MOCK integration 使您能够从 API Gateway 返回静态响应,而无需使用后端 Lambda 函数,从而简化了 OPTIONS 请求的 CORS 处理。
关于修复 AWS API Gateway 403 错误的最终想法
要修复本地 SAM 环境中 OPTIONS 请求的 403 错误,请确保您的 SAM 模板 并且权限配置正确。让您的本地环境尽可能与您部署的 AWS 配置相匹配至关重要。
为了防止丢失令牌问题,请将 AuthorizationType 更改为“NONE”并使用假集成进行预检 CORS 查询。解决这些设置问题可以实现顺利的本地开发和正确的 API 网关行为。
AWS API Gateway 403 错误的有用来源和参考
- 扩展了 AWS SAM CLI 和 API Gateway 本地开发,重点是处理 CORS 查询。 AWS 官方文档提供了详细的见解和示例。访问: AWS SAM CLI 文档。
- 提供 API Gateway 问题(例如 403 禁止错误和缺少身份验证令牌)的详细故障排除信息。看: .AWS API 网关错误处理。
- 在 API 网关和 Lambda 函数中配置 CORS 的完整指南。 CORS 问题是本地测试期间 403 错误的常见来源。更多信息请点击这里: AWS 知识中心。