【问题标题】:How to create presigned URL for aws gateway API如何为 aws 网关 API 创建预签名 URL
【发布时间】:2021-08-07 04:52:24
【问题描述】:

我看到了 S3 对象的预签名 URL。是否可以为 API 网关创建预签名 URL。我已经通过documentation。我正在使用.NET。我想知道是否有 .NET 库可用于为网关 API 创建预签名请求。

问题
我有GET API 类似https://xxxxxx.execute-api.us-east-1.amazonaws.com/dev/pets?type=dog&page=1 的东西,我们的客户将不时调用该API。他们使用的旧版工具仅支持GET。所以我想创建一个预签名的 URL(到期时间短)并在他们要求时给他们。对于每个客户,我已经拥有IAM 用户以及他们各自的accesskey 和secretkey

【问题讨论】:

    标签: amazon-web-services aws-sdk aws-api-gateway


    【解决方案1】:

    预签名 URL 通常使用 AWS SigV4 签名过程进行签名。

    您可以为您的API Gateway 托管端点生成 SigV4 签名的 URL。通常,您需要在授权请求标头中发送 SigV4 签名。如果您的客户愿意发送标头,here 是一个示例库,您可以尝试为 .NET 创建一个带有签名标头的 HTTP 请求。

    如果您的客户无法发送授权标头或无法使用上述库,那么您可以将签名转换为查询字符串格式并提供预签名的 URL 给他们。

    This AWS 文档在 Python 中提供了有关如何生成查询字符串 URL 的示例。现在,您可以使用 python 示例并使用以下示例转换为基于 .NET 的代码。

    public string GetSig4QueryString(string host, string service, string region)
        {
            var t = DateTimeOffset.UtcNow;
            var amzdate = t.ToString("yyyyMMddTHHmmssZ");
            var datestamp = t.ToString("yyyyMMdd");
    
            var canonical_uri = "/dev/myApigNodeJS";
    
            var canonical_headers = "host:" + host+"\n";
    
            var signed_headers = "host";
    
            var credential_scope = $"{datestamp}/{region}/{service}/aws4_request";
    
            var canonical_querystring = "X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=" + WebUtility.UrlEncode(_access_key + "/" + credential_scope)
            + "&X-Amz-Date=" + amzdate + "&X-Amz-SignedHeaders=" + signed_headers;
    
            Console.WriteLine("canonical_querystring");
            Console.WriteLine(canonical_querystring);
    
            var payload_hash = Hash(new byte[0]);//No Payload for GET
            var canonical_request = new StringBuilder();
            canonical_request.Append("GET\n");
            canonical_request.Append(canonical_uri + "\n");
            canonical_request.Append(canonical_querystring + "\n");
            canonical_request.Append(canonical_headers + "\n");
            canonical_request.Append(signed_headers + "\n");
            canonical_request.Append(payload_hash);
    
            Console.WriteLine("canonical_request");
            Console.WriteLine(canonical_request);
    
            var string_to_sign = $"{algorithm}\n{amzdate}\n{credential_scope}\n" + Hash(Encoding.UTF8.GetBytes(canonical_request.ToString()));
    
            Console.WriteLine("string_to_sign");
            Console.WriteLine(string_to_sign);
    
            var signing_key = GetSignatureKey(_secret_key, datestamp, region, service);
            var signature = ToHexString(HmacSHA256(signing_key, string_to_sign));
    
            var signed_querystring = canonical_querystring+"&X-Amz-Signature=" + signature;
    
            return signed_querystring;
        }
    
    GetSig4QueryString("myApiId.execute-api.us-east-1.amazonaws.com","execute-api","us-east-1");
    //Returned String --> X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential= AKIAIOSFODNN7EXAMPLE%2F20190104%2Fus-east-1%2Fexecute-api%2Faws4_request&X-Amz-Date=20190104T190309Z&X-Amz-SignedHeaders=host&X-Amz-Signature=7b830fce28f7800b3879a25850950f6c4247dfdc07775b6952295fa2fff03f7f
    

    完整端点变为 -

    https://myApiId.execute-api.us-east-1.amazonaws.com/dev/myApigNodeJS?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20190104%2Fus-east-1%2Fexecute-api%2Faws4_request&X-Amz-Date=20190104T190309Z&X-Amz-SignedHeaders=host&X-Amz-Signature=7b830fce28f7800b3879a25850950f6c4247dfdc07775b6952295fa2fff03f7f

    注意-

    1. 此示例代码引用了我在上面给出的 Github 项目中的方法和变量。
    2. 此外,此示例硬编码 API 路径 /dev/myApigNodeJS 并对其进行签名,对于您而言,它会与完整的绝对路径有所不同。
    3. AWS 建议对您计划在请求中发送的所有查询字符串和标头进行签名。浏览我提到的库的 .NET 代码,了解它是如何做到的。

    如果您有任何问题,请告诉我。

    【讨论】:

      【解决方案2】:

      在 AWS API Gateway 中生成预签名 url 和 websocket 服务时,我使用了 Imran 的解决方案并添加了所需的“X-Amz-Security-Token”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-12
        • 2018-02-01
        • 2022-07-08
        • 2023-04-11
        • 1970-01-01
        • 2021-04-17
        • 2023-03-25
        • 1970-01-01
        相关资源
        最近更新 更多