请问自定义域名的 HTTP 触发器的签名,怎么确定 CanonicalizedResource?
可以按照我的步骤试一下:
获取 HTTP 请求的 URI 路径:从 HTTP 请求中提取出 URI 路径部分,包括查询字符串。
对 URI 进行 URL 编码:对 URI 路径进行 URL 编码,确保特殊字符被正确编码。
获取 HTTP 请求中的参数:从 HTTP 请求中获取所有参数,并按参数名称进行字典排序。
构建 CanonicalizedResource:按照特定格式构建 CanonicalizedResource 字符串,通常的格式为<URI路径>?<参数名称1>=<参数值1>&<参数名称2>=<参数值2>&...。
在使用自定义域名的HTTP触发器时,CanonicalizedResource的构造方法与使用默认域名的HTTP触发器是不一样的。以下是构造CanonicalizedResource的步骤:
GET\n
\n
\n
Sun, 20 Dec 2020 09:40:16 GMT\n
/{apiVersion}/proxy/{serviceName}/{functionName}/
其中,{apiVersion}是API版本号(默认为2016-08-15),{serviceName}是函数计算服务名称,{functionName}是函数名称
/2016-08-15/proxy/service-name/function-name/
将HTTP请求的CanonicalizedHeaders添加换行符。CanonicalizedHeaders的构造方法与使用默认域名的HTTP触发器一致,详见官方文档。
将上述步骤得到的字符串连接起来,即为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
阿里云函数计算自定义域名的 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
方法是使用密钥进行签名的自定义方法。在实际使用中,需要根据具体的签名算法和密钥生成逻辑进行实现。
看这个集成场景的部分 fc有sdk帮您算这个,具体算的方法也可以参考sdk里的代码
https://help.aliyun.com/document_detail/460027.html?spm=a2c4g.394216.0.0.20dd6a0cZmlAEW#section-e0r-mik-xm3
此答案来自钉钉群“阿里函数计算官网客户"
在自定义域名的 HTTP 触发器中,签名验证的过程需要使用到 CanonicalizedResource 这个参数。CanonicalizedResource 是一个规范化资源描述符,用于标识要访问的资源,并且是签名验证中非常重要的一个参数。
在确定 CanonicalizedResource 的值时,需要按照以下步骤进行计算:
首先,需要将请求方法(HTTP Verb)转换成大写字母并添加换行符“\n”。
接着,需要添加请求路径(URI),并确保其包含所有请求参数。如果请求不带参数,则请求路径就是 URI。否则,需要将请求参数和值附加在 URI 后面,并按请求参数名称进行排序。
然后,需要添加换行符“\n”和所有标准化请求头(CanonicalizedHeaders)。标准化请求头包括请求中所有带有 x-fc- 前缀的头部信息,并按字典序排列。如果请求中存在多个同名的标准化请求头,则需要将它们的值拼接在一起,以逗号分隔。
最后,需要添加换行符“\n”和所有标准化查询参数(CanonicalizedQueryParameters)。标准化查询参数包括请求中所有不带有 x-fc- 前缀的查询参数,并按字典序排列。如果请求中存在多个同名的标准化查询参数,则需要将它们的值拼接在一起,以逗号分隔。
通过上述步骤计算得到的 CanonicalizedResource 就是签名验证中使用的参数。在进行签名验证时,需要将该参数与请求中的 Authorization 参数一起发送到函数计算服务,以确保请求的真实性和完整性。
总之,在自定义域名的 HTTP 触发器中确定 CanonicalizedResource 的值需要按照上述步骤进行计算,并严格按照规范格式组装参数。这样可以确保签名验证的准确性和可靠性。
自定义域名的 HTTP 触发器,其 CanonicalizedResource 需要按照以下方式进行构造:
/
,则CanonicalizedResource为 /<service>/<function>
。/
,则CanonicalizedResource为 /<service>/<function>{uri}
。其中,{uri}
为经过URI编码的请求路径和查询参数部分。<service>
为function所在的Service名称,<function>
为调用的函数名称。举例说明,假设函数名称为myFunction
,服务名称为myService
,已经将域名绑定到HTTP触发器,自定义域名为:custom-domain.com
。如果向该HTTP触发器发起GET请求,请求路径/test?a=1&b=2
,则构造CanonicalizedResource的过程如下:
/test?a=1&b=2
,所以需将其进行URI编码并拼接到资源路径的末尾。得到的结果为/myService/myFunction/test%3Fa%3D1%26b%3D2
。因此,在进行签名时,CanonicalizedResource值应该是/myService/myFunction/test%3Fa%3D1%26b%3D2
。
当使用自定义域名的 HTTP 触发器时,签名验证需要确定一个名为 CanonicalizedResource 的字符串,该字符串是请求的实际内容。
CanonicalizedResource 是一个经过 URL 编码和签名哈希处理后的字符串,它表示请求的实际资源路径。在 AWS Lambda 中,可以使用以下步骤来计算 CanonicalizedResource:
将原始请求 URL 进行编码。例如,如果请求 URL 是 [https://example.com/path/to/resource?a=1&b=2],则需要对其进行编码为 https://example.com/path/to/resource%3Fa%3D1%26b%3D2。
对编码后的请求 URL 进行签名哈希处理。这可以通过将请求 URL 和一个密钥(SecretAccessKey)组合在一起,然后对它们进行 SHA-256 哈希来实现。例如,如果 SecretAccessKey 是 "abcdefghijklmnopqrstuvwxyz1234567890",则可以计算出以下哈希值:
eJztBlLXNmVkZS9sbG9nZW5jc2lvbi4wYXcuYWRtaW4xMjM0NTY3ODkwNzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5NzkxMjg5NjQ0OTUyMWM5
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。