【问题标题】:AppSync Lambda Authoriser Source IP AddressAppSync Lambda 授权方源 IP 地址
【发布时间】:2022-11-08 12:28:28
【问题描述】:

我最近开始为 AppSync API 使用自定义 Lambda 授权方,该 API 运行良好,但在该授权方中发现了对源 IP 地址的要求。

我一直在做一些谷歌搜索,可以找到很多关于如何在速度模板中获取 IP 地址以及如何使用 API Gateway 授权方执行此操作的信息,但无法在 AppSync 授权方中找到获取它的位置。我希望有人能帮忙。

在授权人中,如果我添加此代码:

exports.handler = async (event, context, callback) => {
         console.log('EVENT', event);
         console.log('CONTEXT', context);
         console.log('CALLBACK', callback);
}

我可以看到我无权访问任何标题,我希望看到 X-Forwarded-For 标题,但它不存在。

  EVENT {
    authorizationToken: '<removed>',
    requestContext: {
      apiId: '<removed>',
      accountId: '<removed>',
      requestId: '<removed>',
      queryString: '<removed>',
      variables: {}
    }
  }
  CONTEXT {
    callbackWaitsForEmptyEventLoop: [Getter/Setter],
    succeed: [Function (anonymous)],
    fail: [Function (anonymous)],
    done: [Function (anonymous)],
    functionVersion: '$LATEST',
    functionName: '<removed>',
    memoryLimitInMB: '128',
    logGroupName: '/aws/lambda/<removed>',
    logStreamName: '2021/11/25/[$LATEST]<removed>',
    clientContext: undefined,
    identity: undefined,
    invokedFunctionArn: '<removed>,
    awsRequestId: '<removed>',
    getRemainingTimeInMillis: [Function: getRemainingTimeInMillis]
  }
  CALLBACK [Function (anonymous)]

有谁知道我如何在授权者级别公开 IP?

这是身份验证设置,我似乎找不到任何进一步的设置。

AppSync Auth Screenshot

【问题讨论】:

    标签: amazon-web-services aws-lambda aws-appsync


    【解决方案1】:

    您必须使用映射模板在您的事件对象中显式包含请求详细信息(详细信息在 AWS 文档 https://docs.aws.amazon.com/appsync/latest/devguide/tutorial-lambda-resolvers.html#configuring-resolvers 中)。在您的情况下,映射模板应与此类似:

    {
        "version": "2017-02-28",
        "operation": "Invoke",
        "payload": {
            "field": "yourField",
            "request": $utils.toJson($context.request)
        }
    }
    

    完成后,您的 Lambda 事件对象应包含一个名为 request 的新属性:

    exports.handler = async (event, context, callback) => {
        console.log('REQUEST', event.request);
    }
    

    console.log 应该输出类似下面的内容:

    {
        headers: {
            'x-forwarded-for': '49.111.222.33, 130.111.222.33',
            'sec-ch-ua-mobile': '?0',
            'cloudfront-viewer-country': 'AU',
            'cloudfront-is-tablet-viewer': 'false',
            'x-amzn-requestid': 'aaaaaaa-ccccc-bbbb-1111-22222222',
            via: '2.0 12345678.cloudfront.net (CloudFront)',
            'cloudfront-forwarded-proto': 'https',
            origin: 'https://studio.apollographql.com',
            'content-length': '65',
            'x-forwarded-proto': 'https',
            'accept-language': 'en-US,en;q=0.9,fr;q=0.8,id;q=0.7',
            host: '1234567.appsync-api.ap-southeast-2.amazonaws.com',
            'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36',
            'cloudfront-is-mobile-viewer': 'false',
            accept: '*/*',
            'cloudfront-is-smarttv-viewer': 'false',
            'accept-encoding': 'gzip, deflate, br',
            referer: 'https://studio.apollographql.com/graph/bla/explorer?variant=current',
            'content-type': 'application/json',
            'sec-fetch-mode': 'cors',
            'x-amzn-trace-id': 'Root=1-321234-123456',
            'x-amz-cf-id': 'A-dadwdewcstd_klA==',
            authorization: 'de2dwqd23...cdwfef43453fewf3few',
            'sec-fetch-dest': 'empty',
            'sec-ch-ua-platform': '"macOS"',
            'cloudfront-is-desktop-viewer': 'true',
            'sec-fetch-site': 'cross-site',
            'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="96", "Google Chrome";v="96"',
            'x-forwarded-port': '443'
        },
        domainName: null
    }
    

    【讨论】:

      【解决方案2】:

      我有同样的需求,但我不相信源 IP 地址可用于 AWS Lambda 授权函数,只能通过在请求模板中使用 $context.identity.sourceIp 用于解析函数。

      授权方 Lambda 唯一可用的请求信息是

      {
          "authorizationToken": "ExampleAUTHtoken123123123",
          "requestContext": {
              "apiId": "aaaaaa123123123example123",
              "accountId": "111122223333",
              "requestId": "f4081827-1111-4444-5555-5cf4695f339f",
              "queryString": "mutation CreateEvent {...}
      
      query MyQuery {...}
      ",
              "operationName": "MyQuery",
              "variables": {}
          }
      }
      

      授权方真正能做的就是根据请求中收到的信息进行验证,例如 authorizationToken 或 accountId - IP 地址不是请求的一部分。我想将令牌绑定到 IP 地址,以便令牌仅对来自该 IP 的请求有效 - 但这看起来需要在授权后在单个解析器中按请求执行。我可以使用 AppSync 缓存授权方 Lambda 的结果,但要缓存 IP 地址/令牌检查的结果,我需要在解析器中执行此操作。在多个地方维护授权代码是可行的,但很烦人。

      我还没有设置如何修改授权函数的请求模板——它似乎是一个锁定请求,如上所述。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-04-09
        • 2020-02-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-24
        • 1970-01-01
        相关资源
        最近更新 更多