Unauthorized使用错误参数中的字符串从 Lambda 授权方调用 Lambda 回调函数返回带有正文的 401 响应:
{ "message": "Unauthorized" }
尝试在响应中使用任何其他字符串会导致响应:
{ "message": null }
相反,如果您在回调的结果参数中返回一个拒绝策略文档,您将得到一个 403 响应,类似于:
{ "message": "Unable to access resource with an explicit deny" }
环顾四周后,您似乎需要配置网关响应以从 Lambda 授权方返回自定义响应,我已为 403 响应工作,但无法弄清楚如何为 401 执行此操作。
对于 403,我使用模板创建了一个网关响应:
{\"message\":\"$context.authorizer.stringKey\"}
然后在结果对象上我设置了以下内容
ResultObject.context.stringKey = 'My custom response'
这有效并记录在此处。
但是,对于 401,因为我没有返回策略文档,所以我不知道如何使用自定义响应。我创建了与 403 相同的网关响应,但是如果我在错误参数中使用任何字符串(“未授权”除外)点击回调,我会收到空消息。我无法在结果参数中返回,因为这需要是包含策略文档的响应结构。
关于如何使用 401 返回自定义响应的任何想法?
amazon-web-services aws-lambda aws-api-gateway lambda-authorizer
我在 api 网关后面实现了两个 lambda(我们称之为 A 和 B)。假设 A 是从“外部”调用的,B 是从外部和 A 调用的。我还实现了 lambda Authorizer(基于令牌;cognito)作为身份验证层。一切都按预期进行。有没有办法绕过 B 的授权流程,只处理来自 A 的呼叫?
总氮
AWS API Gateway 有两个版本:
我正在使用带有 lambda 授权者的较新 HTTP 版本,并且希望保护我的暂存/测试环境免受外部请求的影响。一种想法是在 API 网关前面放置一个 WAF,但不幸的是只有 REST 版本的网关支持 WAF。
对于如何保护这些资源以便只能从特定的 IP 范围访问它们有什么建议吗?(公司VPN)
amazon-web-services aws-api-gateway amazon-waf lambda-authorizer
我目前正在开发一个简单的 api 来接收 Github 事件负载,并且我想验证它们是否来自正确的源。通过这个,我正在努力在请求标头中使用 hmac 签名(由 github 使用我提供的秘密生成)。为了验证签名,ApiGateway 授权者需要签名 (X-Hub-Signature)、用于生成签名的密钥以及消息正文。据我所知,Api Gateway 不允许您将正文传递给 ApiGateway 授权者。有谁知道不需要额外的代理 lambda 和 s3 的解决方法吗?
*注意:请求者是Github Webhook服务(无法将正文添加到标头)
基本 ApiGateway 身份验证文档: https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-use-lambda-authorizer.html
amazon-web-services aws-cloudformation aws-api-gateway lambda-authorizer
我试图缓存授权方 lambda 在第一次验证 JWT 令牌时返回的 IAM 策略。我已在 API Gateway Authorizer 中启用并设置authorizerResultTtlInSeconds为3500秒。但是,我仍然看到一个请求在缓存时间范围内发送到 Authorizer lambda 函数。
我的 node.js 脚本如下:
const jwt = require('jsonwebtoken');
const jwksClient = require('jwks-rsa');
const keyClient = jwksClient({
jwksUri: process.env.JWKS_URI
})
const allow = {
"principalId": "user",
"policyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Action": "execute-api:Invoke",
"Effect": "Allow",
"Resource": process.env.RESOURCE // RESOURCE = *
}
]
}
}
const unauthorized = {
"error": "Unauthorized",
}
//excluded verificationJWTOptions object and getSigningKey function for simplicity
function validateJWTToken(token, …Run Code Online (Sandbox Code Playgroud) 已按照文档 ( https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-use-lambda-authorizer.html )为我的 AWS API Gateway 创建了一个简单的基于请求的授权方
在测试授权者时(使用虚拟设置来验证授权头中是否有关键的“测试”),授权者工作正常,但是当直接从端点调用 API 时,授权者根本不会被调用,并且我得到了 API 响应(应该被阻止,因为没有传递标头)。
使用无效密钥进行授权者测试:得到预期的 401
使用有效密钥进行授权者测试:获得预期 200
直接从Web调用API endpoing成功:
我的 API Gateway 资源策略只想限制来自特定 IP 范围的调用:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "execute-api:Invoke",
"Resource": "arn:aws:execute-api:us-east-1:111111111111:6mm9kw17uf/*/*/*"
},
{
"Effect": "Deny",
"Principal": "*",
"Action": "execute-api:Invoke",
"Resource": "arn:aws:execute-api:us-east-1:111111111111:6mm9kw17uf/*/*/*",
"Condition": {
"NotIpAddress": {
"aws:SourceIp": "XXXXXXX"
}
}
}
]
}
Run Code Online (Sandbox Code Playgroud)
授权者 Lambda 代码:
exports.handler = function(event, context, callback) {
console.log('Received event:', JSON.stringify(event, null, 2));
// Retrieve request parameters from the …Run Code Online (Sandbox Code Playgroud) amazon-web-services aws-lambda aws-api-gateway lambda-authorizer
我今天花了大部分时间试图让授权者工作,我检查了多个示例,它们似乎都在做与我的代码所做的相同的事情。
我使用无服务器框架,这是授权代码:
exports.handler = function (event: APIGatewayTokenAuthorizerEvent): APIGatewayAuthorizerResult {
const authorizer = new Authorizer();
try {
if (!event.authorizationToken) throw new Error("No token");
const token = event.authorizationToken.split(" ")[1];
const decodedData = authorizer.verifyToken(token) as unknown as User;
const policy = generatePolicy(token, event.methodArn);
return {
...policy,
context: {
user: JSON.stringify(decodedData),
},
};
} catch (err) {
console.log(err);
throw "Unauthorized";
}
};
const generatePolicy = (principalId: string, methodArn: string) => {
return {
principalId,
policyDocument: {
Version: "2012-10-17",
Statement: [
{
Action: "execute-api:Invoke",
Effect: …Run Code Online (Sandbox Code Playgroud) javascript amazon-web-services node.js lambda-authorizer aws-jwt-authorizer
我想生成一个自定义策略,该策略提供对 AWS 自定义授权方内的 DynamoDB 表的细粒度访问。这可能吗?
在无服务器中,我的配置如下所示:
functions:
APIAuthorizer:
handler: src/services/auth/handlers.apiAuthorizer
cors: true
GraphQLAPI:
handler: src/services/graphql/handlers.apiHandler
events:
- http:
path: "/api"
method: post
cors: true
authorizer:
name: APIAuthorizer
type: request
resultTtlInSeconds: 0
Run Code Online (Sandbox Code Playgroud)
我已验证我的自定义授权被调用,并生成各种权限(sts:AssumeRole,lambda:InvokeFunction,execute-api:Invoke,等)所需要的成功调用API处理器。所以我的自定义授权器正在工作,它提供的结果是必要的。
但是,当授权方包含 dynamodb 权限时,例如像 { Effect: "Allow", Action: "dynamodb: ", "Resource": " " }这样的语句
我的 API 处理程序(GraphQLAPI 函数)失败并显示如下消息
User: arn:aws:sts::<myaccountid>:assumed-role/<mydefaultrole>/myservice-mystage-GraphQLAPI is not authorized to perform: dynamodb:Query on resource: arn:aws:dynamodb:us-east-1:<myaccountId>:table/<mytable>/index/<someIndex>
Run Code Online (Sandbox Code Playgroud)
(我注意到投诉是关于索引权限的,因此还尝试为该索引和/或所有索引添加特定权限,但这没有效果。)
经过多次不同尝试后的底线是,完全忽略了自定义授权方颁发的 dynamodb 权限。我的 lambda node.js 代码正在使用 AWS 节点 SDK,它应该从实例环境中获取权限。我认为这将包括自定义授权方生成的权限。
最后,我注意到有关如何加载凭据 …
amazon-dynamodb amazon-iam aws-lambda serverless lambda-authorizer
我正在尝试使用无服务器框架在 API Gateway 中创建自定义 lambda 授权方。
我的服务的客户端可以发送“授权”或“X-自定义”标头(但不能同时发送两者)。所以我需要的是一个没有身份源的自定义授权者。
无服务器 YAML 截图如下:
functions:
create:
handler: posts.create
events:
- http:
path: posts/create
method: post
authorizer:
arn: xxx:xxx:Lambda-Name
resultTtlInSeconds: 0
type: request
integration: lambda
cors: true
request:
template:
application/json: '{"method": "$context.httpMethod","body" : $input.json("$"),"headers": {#foreach($param in $input.params().header.keySet())"$param": "$util.escapeJavaScript($input.params().header.get($param))" #if($foreach.hasNext),#end#end},"queryParams": {#foreach($param in $input.params().querystring.keySet())"$param": "$util.escapeJavaScript($input.params().querystring.get($param))" #if($foreach.hasNext),#end#end},"pathParameters": {#foreach($param in $input.params().path.keySet())"$param": "$util.escapeJavaScript($input.params().path.get($param))" #if($foreach.hasNext),#end#end}}'
Run Code Online (Sandbox Code Playgroud)
我使用以下请求模板,以便我的 lambda 获取标头并可以执行验证:
{"method": "$context.httpMethod","body" : $input.json("$"),"headers": {#foreach($param in $input.params().header.keySet())"$param": "$util.escapeJavaScript($input.params().header.get($param))" #if($foreach.hasNext),#end#end},"queryParams": {#foreach($param in $input.params().querystring.keySet())"$param": "$util.escapeJavaScript($input.params().querystring.get($param))" #if($foreach.hasNext),#end#end},"pathParameters": {#foreach($param in $input.params().path.keySet())"$param": "$util.escapeJavaScript($input.params().path.get($param))" #if($foreach.hasNext),#end#end}}
Run Code Online (Sandbox Code Playgroud)
问题是,当我运行无服务器部署命令时,授权者是使用“授权”身份资源创建的。
我的代码基于以下资源:
amazon-web-services aws-api-gateway serverless lambda-authorizer