AWS CloudFront getSignedCookies自定义策略报错排查求助
问题根源
你遇到的两个错误核心原因:
- 第一个
TypeError:getSignedCookies要求policy参数必须是字符串格式的策略文档,不能直接传入JavaScript对象。 - 第二个
Invalid policy错误:你将字符串化后的策略赋值给了自定义变量stringPoly,但API规定的参数名必须是policy,参数名不匹配导致策略无法被识别。 - 额外隐藏问题:策略中
AWS:EpochTime需要传入秒级Unix时间戳,你当前用getTime()获取的是毫秒值,会导致过期时间远超出预期,甚至可能引发策略验证失败。
修正后的完整代码
import { getSignedCookies } from "@aws-sdk/cloudfront-signer"; let originalString = process.env.S3_PRIVATEKEY_CLOUDFRONT; let privateKey = originalString.replace(/\\n/g, "\n"); const keyPairId = "XXXXXXXXXX"; const currentDate = new Date(); const oneHourFromNow = new Date(currentDate.getTime() + 60 * 60 * 1000); const policy = { "Statement": [ { "Resource": "https://xxxxxxxxxx.cloudfront.net/harry/*", "Condition": { "DateLessThan": { // 转换为秒级Unix时间戳 "AWS:EpochTime": Math.floor(oneHourFromNow.getTime() / 1000) } } } ] }; // 将策略对象转为JSON字符串,保持参数名为policy const signedCookie = getSignedCookies({ keyPairId, policy: JSON.stringify(policy), privateKey, }); return signedCookie;
关键注意事项
Resource字段必须与CloudFront域名及资源路径完全匹配,通配符*仅能用于路径末尾。- 私钥替换换行符的逻辑要确保正确,保证签名过程能读取到合法的密钥格式。
内容的提问来源于stack exchange,提问作者Emanuele
相关产品推荐
相关产品推荐

