我正在使用 AWS 创建一个签名 URL,以便我可以安全地将此 URL 传递给另一个 API 以供临时使用。签名的 URL 指向 S3 资源。问题是其他 API 不接受这么长的链接。因此我正在尝试缩短它。我尝试使用类似的缩短器goo.gl http://goo.gl or bit.ly http://bit.ly但无济于事,因为 URL 对他们来说太长了。我什至使用 AWS 构建了自己的私有缩短器(AWS 网址缩短器 https://aws.amazon.com/blogs/compute/build-a-serverless-private-url-shortener/)但它有同样的问题:“网站重定向位置的长度不能超过 2,048 个字符。”。
我正在 iOS (Swift) 中创建签名 URLAWSS3PreSignedURLBuilder.default().getPreSignedURL(preSignedURLRequest)
以未经授权的用户身份使用 AWS Cognito 时。
我尝试了以下方法但无济于事:
- 选择尽可能短的 3 个字符的 S3 存储桶名称
- 尽可能缩短文件名。我将文件名限制为 10 个字符加上文件扩展名(总共 14 个字符)。较短的文件名对我来说不可行,因为它们在某种程度上应该是唯一的。
但即使进行了所有这些细微的调整,AWS 返回的签名 URL 有时还是太长。尤其是令牌参数(X-Amz-Security-Token)似乎非常长。通过我的细微调整,我有时会得到短于 2,048 个字符的 URL,但有时会稍长一些。我想找到一个解决方案,保证 URL 不会太长并且可以缩短。
在我自己的私有 AWS URL 缩短器中,以下代码片段创建了重定向到实际长 URL 的 S3 对象。
s3.putObject({
Bucket: s3_bucket,
Key: key_short,
Body: "",
WebsiteRedirectLocation: url_long,
ContentType: "text/plain"
},
(err, data) => {
if (err) {
console.log(err);
done("", err.message);
} else {
const ret_url = "https://" + cdn_prefix + "/" + id_short;
console.log("Success, short_url = " + ret_url);
done(ret_url, "");
}
});
该方法返回并出现以下错误
网站重定向位置的长度不能超过2,048
人物。
对象元中标题“x-amz-website-redirect-location”的 putObject 文档声明如下(请参阅:放置对象文档 http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUT.html):
值的长度限制为 2 KB
如何确保初始 AWS 签名 URL 对于 URL 缩短程序来说不会太长?
EDIT:
我发现的问题之一是我在 AWS Cognito 中以未经身份验证的用户身份创建了签名 URL。因此,签名的 URL 包含这个长得离谱的令牌作为参数。我不想将 accessKey 和 ShortKey 嵌入 iOS 应用程序中,这就是我切换到 AWS Cognito 的原因(请参阅AWS 认知 https://aws.amazon.com/blogs/mobile/how-amazon-cognito-keeps-mobile-app-users-data-safe/)。但目前没有授权用户,只有未经授权的用户,我需要作为未经授权的 AWS Cognito 用户创建签名 URL。如果我使用 accessKey 和 ShortKey 创建带有常规凭据的签名 URL,我会得到一个更短的 URL。但为此我必须将 accessKey 和 ShortKey 嵌入 iOS 应用程序中,这是不推荐的。
我通过创建一个 AWS lambda 来创建预签名 URL 并返回预签名 URL,从而解决了该问题。预签名 URL 允许调用者访问 (getObject) S3 资源。对此有两种选择:
- 分配给 AWS lambda 的角色具有 getObject 的 S3 权限。生成的预签名 URL 将包含比使用 AWS Cognito 在 iOS 应用程序中颁发的临时凭证创建的预签名 URL 短得多的令牌。
- 将具有 getObject 的 S3 权限的角色的访问密钥和秘密密钥直接嵌入到 AWS lambda 中,这将为您提供更短的 URL,因为生成的预签名 URL 中不包含令牌。 (例如。示例 AWS 代码 https://stackoverflow.com/questions/38831829/nodejs-aws-sdk-s3-generate-presigned-url)
我作为未经授权的认知用户在我的 iOS 应用程序中调用此 lambda。从 AWS lambda 接收到预签名 URL 后,我可以缩短它,因为使用此方法预签名 URL 会短得多。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)