开发者社区 > 云原生 > Serverless > 正文

请问自定义域名的 HTTP 触发器的签名,怎么确定 CanonicalizedResource?

请问自定义域名的 HTTP 触发器的签名,怎么确定 CanonicalizedResource?

展开
收起
学习娃 2023-05-22 14:11:59 105 0
7 条回答
写回答
取消 提交回答
  • 可以按照我的步骤试一下:

    • 获取 HTTP 请求的 URI 路径:从 HTTP 请求中提取出 URI 路径部分,包括查询字符串。

    • 对 URI 进行 URL 编码:对 URI 路径进行 URL 编码,确保特殊字符被正确编码。

    • 获取 HTTP 请求中的参数:从 HTTP 请求中获取所有参数,并按参数名称进行字典排序。

    • 构建 CanonicalizedResource:按照特定格式构建 CanonicalizedResource 字符串,通常的格式为<URI路径>?<参数名称1>=<参数值1>&<参数名称2>=<参数值2>&...。

    2023-05-23 17:25:40
    赞同 展开评论 打赏
  • 在使用自定义域名的HTTP触发器时,CanonicalizedResource的构造方法与使用默认域名的HTTP触发器是不一样的。以下是构造CanonicalizedResource的步骤:

    1. 将HTTP请求方法(例如:GET、POST)转换为大写字母并添加换行符
    GET\n
    
    1. 将HTTP请求的Content-MD5 Header的值添加换行符。如果Content-MD5 Header不存在,则在此处添加空行
    \n
    
    1. 将HTTP请求的Content-Type Header的值添加换行符。如果Content-Type Header不存在,则在此处添加空行
    \n
    
    1. 将HTTP请求的Date或者X-Fc-Date Header的值添加换行符。如果两个Header都存在,则使用X-Fc-Date Header
    Sun, 20 Dec 2020 09:40:16 GMT\n
    
    1. 将HTTP请求的CanonicalizedResource添加换行符。CanonicalizedResource的构造方法是:
    /{apiVersion}/proxy/{serviceName}/{functionName}/
    

    其中,{apiVersion}是API版本号(默认为2016-08-15),{serviceName}是函数计算服务名称,{functionName}是函数名称

    /2016-08-15/proxy/service-name/function-name/
    
    1. 将HTTP请求的CanonicalizedHeaders添加换行符。CanonicalizedHeaders的构造方法与使用默认域名的HTTP触发器一致,详见官方文档。

    2. 将上述步骤得到的字符串连接起来,即为CanonicalRequest

    GET\n
    \n
    \n
    Sun, 20 Dec 2020 09:40:16 GMT\n
    /2016-08-15/proxy/service-name/function-name/\n
    host:example.com\n
    x-fc-account-id:1234567890123456\n
    x-fc-region:cn-hangzhou\n
    x-fc-security-token:security-token\n
    \n
    host;x-fc-account-id;x-fc-region;x-fc-security-token\n
    2e1a6c0b6667c14138f1c8c2b6e3d4c2e7b7fba7c7b6c279f4e7aa5dc3a0a505
    
    1. 对CanonicalRequest进行签名,详见官方文档。
    2023-05-23 08:50:28
    赞同 展开评论 打赏
  • 公众号:网络技术联盟站,InfoQ签约作者,阿里云社区签约作者,华为云 云享专家,BOSS直聘 创作王者,腾讯课堂创作领航员,博客+论坛:https://www.wljslmz.cn,工程师导航:https://www.wljslmz.com

    阿里云函数计算自定义域名的 HTTP 触发器签名中的 CanonicalizedResource 应该填写 HTTP 请求的路径部分,不包括域名部分。例如,假设您在控制台中配置了自定义域名 mydomain.com,并在函数计算中实现了签名验证逻辑。若您在 iOS 客户端中以 POST 方法访问 https://mydomain.com/api/functionName,则 CanonicalizedResource 应该填写 /api/functionName。签名示例代码如下:

    let path = "/api/functionName" // HTTP 请求的路径部分,不包括域名部分
    let method = "POST" // HTTP 请求的方法
    let headers = ["host": "mydomain.com"] // HTTP 请求的头部信息
    let queryString = "" // HTTP 请求的查询参数部分
    
    let signStr = "\(method)\n\n\n\n\(path)\n\(queryString)" // 拼接签名字符串
    let signature = signWithKey(signStr, secret) // 使用密钥进行签名
    
    // 发送 HTTP 请求时将签名信息放入 HTTP 头部中,类似如下:
    let headers = [
        "host": "mydomain.com",
        "x-ca-key": "AccessKeyId",
        "x-ca-signature-headers": "host",
        "x-ca-signature": "\(signature)"
    ]
    

    其中,signWithKey 方法是使用密钥进行签名的自定义方法。在实际使用中,需要根据具体的签名算法和密钥生成逻辑进行实现。

    2023-05-22 23:51:07
    赞同 展开评论 打赏
  • 看这个集成场景的部分 fc有sdk帮您算这个,具体算的方法也可以参考sdk里的代码

    https://help.aliyun.com/document_detail/460027.html?spm=a2c4g.394216.0.0.20dd6a0cZmlAEW#section-e0r-mik-xm3

    此答案来自钉钉群“阿里函数计算官网客户"

    2023-05-22 20:09:50
    赞同 展开评论 打赏
  • 在自定义域名的 HTTP 触发器中,签名验证的过程需要使用到 CanonicalizedResource 这个参数。CanonicalizedResource 是一个规范化资源描述符,用于标识要访问的资源,并且是签名验证中非常重要的一个参数。

    在确定 CanonicalizedResource 的值时,需要按照以下步骤进行计算:

    1. 首先,需要将请求方法(HTTP Verb)转换成大写字母并添加换行符“\n”。

    2. 接着,需要添加请求路径(URI),并确保其包含所有请求参数。如果请求不带参数,则请求路径就是 URI。否则,需要将请求参数和值附加在 URI 后面,并按请求参数名称进行排序。

    3. 然后,需要添加换行符“\n”和所有标准化请求头(CanonicalizedHeaders)。标准化请求头包括请求中所有带有 x-fc- 前缀的头部信息,并按字典序排列。如果请求中存在多个同名的标准化请求头,则需要将它们的值拼接在一起,以逗号分隔。

    4. 最后,需要添加换行符“\n”和所有标准化查询参数(CanonicalizedQueryParameters)。标准化查询参数包括请求中所有不带有 x-fc- 前缀的查询参数,并按字典序排列。如果请求中存在多个同名的标准化查询参数,则需要将它们的值拼接在一起,以逗号分隔。

    通过上述步骤计算得到的 CanonicalizedResource 就是签名验证中使用的参数。在进行签名验证时,需要将该参数与请求中的 Authorization 参数一起发送到函数计算服务,以确保请求的真实性和完整性。

    总之,在自定义域名的 HTTP 触发器中确定 CanonicalizedResource 的值需要按照上述步骤进行计算,并严格按照规范格式组装参数。这样可以确保签名验证的准确性和可靠性。

    2023-05-22 15:06:07
    赞同 展开评论 打赏
  • 自定义域名的 HTTP 触发器,其 CanonicalizedResource 需要按照以下方式进行构造:

    1. 如果请求的路径为 /,则CanonicalizedResource为 /<service>/<function>
    2. 如果请求路径不为 /,则CanonicalizedResource为 /<service>/<function>{uri}。其中,{uri}为经过URI编码的请求路径和查询参数部分。
    3. <service>为function所在的Service名称,<function>为调用的函数名称。

    举例说明,假设函数名称为myFunction,服务名称为myService,已经将域名绑定到HTTP触发器,自定义域名为:custom-domain.com。如果向该HTTP触发器发起GET请求,请求路径/test?a=1&b=2,则构造CanonicalizedResource的过程如下:

    1. 第一步的条件不满足,跳过这一步。
    2. 请求路径为/test?a=1&b=2,所以需将其进行URI编码并拼接到资源路径的末尾。得到的结果为/myService/myFunction/test%3Fa%3D1%26b%3D2

    因此,在进行签名时,CanonicalizedResource值应该是/myService/myFunction/test%3Fa%3D1%26b%3D2

    2023-05-22 15:01:42
    赞同 展开评论 打赏
  • CSDN全栈领域优质创作者,万粉博主;InfoQ签约博主;华为云享专家;华为Iot专家;亚马逊人工智能自动驾驶(大众组)吉尼斯世界纪录获得者

    当使用自定义域名的 HTTP 触发器时,签名验证需要确定一个名为 CanonicalizedResource 的字符串,该字符串是请求的实际内容。

    CanonicalizedResource 是一个经过 URL 编码和签名哈希处理后的字符串,它表示请求的实际资源路径。在 AWS Lambda 中,可以使用以下步骤来计算 CanonicalizedResource:

    1. 将原始请求 URL 进行编码。例如,如果请求 URL 是 [https://example.com/path/to/resource?a=1&b=2],则需要对其进行编码为 https://example.com/path/to/resource%3Fa%3D1%26b%3D2。

    2. 对编码后的请求 URL 进行签名哈希处理。这可以通过将请求 URL 和一个密钥(SecretAccessKey)组合在一起,然后对它们进行 SHA-256 哈希来实现。例如,如果 SecretAccessKey 是 "abcdefghijklmnopqrstuvwxyz1234567890",则可以计算出以下哈希值:

    
    eJztBlLXNmVkZS9sbG9nZW5jc2lvbi4wYXcuYWRtaW4xMjM0NTY3ODkwNzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5
    
    
    
    2023-05-22 14:39:19
    赞同 展开评论 打赏
滑动查看更多

快速交付实现商业价值。

相关电子书

更多
创业公司的域名想象 立即下载
“域”见更美好的未来——域名筑梦互联网+ 立即下载
“域”感——《域名投资从入门到精通》 立即下载