从Custom Authorizer $ Context变量更新stageVariables

时间:2017-05-15 01:18:16

标签: amazon-web-services aws-lambda aws-api-gateway aws-cli

此问题可能与thisthis类似。

但我的问题有点不同:

我有一个使用自定义授权器并具有多个阶段的API网关,大多数具有方法(GET / POST)的资源都与普通的HTTP端点集成,这意味着它们只是对所讨论的端点“直通” (不使用HTTP代理集成)。

这是一个例子: enter image description here

这些端点都指向stageVariables。

但是,出于特殊原因,我需要在调用它之前更新此stageVariable。我的想法是设置并从自定义身份验证的$context.authorizer.variableName获取$context

我的问题是,如果我没有使用Lambda,我将如何更新此值。

您似乎可以某种方式使用Body Mapping模板(请参阅this linkthis link),但我不确定如何使用它们来更新stageVariable?

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您可以在上下文中设置值,但不能更改阶段变量

var generatePolicy = function(principalId, effect, resource) {
    var authResponse = {};
    //...
    // Can optionally return a context object of your choosing.
    authResponse.context = {};
    authResponse.context.stringKey = "stringval";
    authResponse.context.numberKey = 123;
    authResponse.context.booleanKey = true;
    return authResponse;
}

上下文将在

中提供
  

$ context.authorizer.stringKey ...

可以添加到集成请求映射模板以传递到后端。

答案 1 :(得分:1)

如果其他人遇到过这个问题。

在AWS团队提供3天帮助之后,这里似乎有2个问题;

1 - 确认目前无法更改stageVariables(<)。

2 - 正文中的$context$authorizer变量存在限制。作为旁注:AWS团队已经创建了一个新的服务请求并为此工作。

解释:

目前,在node.js中,您可以访问传递给Lambda函数的整个数据有效负载(在event参数内),其中包括所有自定义变量。这与C#等效项不同 - 它在Lambda函数中使用APIGatewayProxyRequest请求对象。因此,尽管您可以在C#中访问节点内的整个有效负载(包括所有自定义变量),但您只能访问APIGatewayProxyRequest对象。可以找到here的属性:

或简而言之:

    public string Body { get; set; }
    public IDictionary<string, string> Headers { get; set; }
    public string HttpMethod { get; set; }
    public bool IsBase64Encoded { get; set; }
    public string Path { get; set; }
    public IDictionary<string, string> PathParameters { get; set; }
    public IDictionary<string, string> QueryStringParameters { get; set; }
    public ProxyRequestContext RequestContext { get; set; }
    public string Resource { get; set; }
    public IDictionary<string, string> StageVariables { get; set; }

因此,不允许访问自定义或&#34;未知&#34; (多个)对象。

长话短说,截至目前:您无法通过代码编辑stageVariables,如果您希望在发送的有效负载中使用任何类型的自定义变量,您可能需要通过节点对其进行编码(event)/ python,或者可能覆盖APIGatewayProxyRequest对象中的现有属性。

更新(处理#2):

有一种方法可以访问所有数据的有效负载:

  

到目前为止,解决方法是让您的Lambda函数接受System.IO.Stream而不是APIGatewayProxyRequest。然后您可以访问您可以自己解析的原始JSON。您可以从该JSON中获取所需的信息,然后将JSON反序列化为APIGatewayProxyRequest。