标签: lambda-authorizer

401 的自定义响应 Lambda 授权器

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

6
推荐指数
1
解决办法
4010
查看次数

如何绕过内部 lambda 调用中的授权

我在 api 网关后面实现了两个 lambda(我们称之为 A 和 B)。假设 A 是从“外部”调用的,B 是从外部和 A 调用的。我还实现了 lambda Authorizer(基于令牌;cognito)作为身份验证层。一切都按预期进行。有没有办法绕过 B 的授权流程,只处理来自 A 的呼叫?
总氮

aws-lambda lambda-authorizer

6
推荐指数
1
解决办法
1043
查看次数

如何在 AWS 中保护基于 HTTP 的 API 网关

AWS API Gateway 有两个版本:

  • 休息版本
  • HTTP 版本 (v2)

我正在使用带有 lambda 授权者的较新 HTTP 版本,并且希望保护我的暂存/测试环境免受外部请求的影响。一种想法是在 API 网关前面放置一个 WAF,但不幸的是只有 REST 版本的网关支持 WAF。

对于如何保护这些资源以便只能从特定的 IP 范围访问它们有什么建议吗?(公司VPN)

amazon-web-services aws-api-gateway amazon-waf lambda-authorizer

6
推荐指数
2
解决办法
2139
查看次数

使用 ApiGateway Authorizer 验证 Github Payload 签名(X-Hub-Signature)

我目前正在开发一个简单的 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

5
推荐指数
1
解决办法
1161
查看次数

API 网关授权方 - IAM 策略未缓存

我试图缓存授权方 lambda 在第一次验证 JWT 令牌时返回的 IAM 策略。我已在 API Gateway Authorizer 中启用并设置authorizerResultTtlInSeconds3500秒。但是,我仍然看到一个请求在缓存时间范围内发送到 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)

caching node.js aws-api-gateway lambda-authorizer

5
推荐指数
1
解决办法
963
查看次数

API 创新不会触发 AWS API Gateway 的基于请求的自定义 lambda 授权方

已按照文档 ( 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

5
推荐指数
1
解决办法
1914
查看次数

AWS 授权者返回 500,消息:null,响应中出现 AuthorizerConfigurationException 错误

我今天花了大部分时间试图让授权者工作,我检查了多个示例,它们似乎都在做与我的代码所做的相同的事情。

我使用无服务器框架,这是授权代码:

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

5
推荐指数
1
解决办法
4735
查看次数

如何在我的 lambda 代码中使用 AWS 自定义授权程序中生成的权限?

我想生成一个自定义策略,该策略提供对 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:AssumeRolelambda:InvokeFunctionexecute-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

4
推荐指数
1
解决办法
679
查看次数

如何使用无服务器部署没有身份源的 API Gateway 自定义授权方?

我正在尝试使用无服务器框架在 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

4
推荐指数
1
解决办法
1646
查看次数