我正在使用AWS创建一个签名URL,以便我可以安全地将此URL传递给另一个API以供临时使用。签名URL指向S3资源。问题是其他API不接受如此长的链接。因此我正在尝试缩短它。我尝试使用goo.gl或bit.ly之类的缩短器,但无济于事,因为URL对他们来说太长了。我甚至使用AWS构建了自己的私人缩短器(AWS url缩短器),但它有同样的问题:“网站重定向位置的长度不能超过2,048个字符。”。
我正在使用AWSS3PreSignedURLBuilder.default()在iOS(Swift)中创建签名URL。将AWS Cognito用作未经授权的用户时,获取预签名URL(预签名请求)。
我尝试了以下方法,但没有成功:
但即使进行了所有这些小调整,AWS返回的签名URL有时也太长了。尤其是令牌参数(X-Amz-Security-Token)似乎真的很长。通过我的小调整,我有时会让URL短于2,048个字符,但有时会稍微长一点。我想找到一种解决方案,可以保证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, "");
}
});
该方法返回以下错误
网站重定向位置的长度不能超过2048个字符。
标题“x-amz-website”的putObject文档-重定向位置”在对象元中表示以下内容(请参阅:放置对象文档):
值的长度限制为2 KB
如何确保初始AWS签名的URL对于URL缩短器来说不太长?
编辑:
我发现的一个问题是,我在AWS Cognito中以未经验证的用户身份创建了签名URL。因此,签名的URL包含这个长得离谱的令牌作为参数。我不想在iOS应用程序中嵌入我的accessKey和shortKey,这就是我切换到AWS Cognito的原因(请参阅AWS Cognito)。但目前没有授权用户,只有未经授权的用户,我需要作为未经授权的AWS Cognito用户创建签名的URL。如果我使用accessKey和shortKey创建带有常规凭据的签名URL,则得到的URL要短得多。但为此,我必须将accessKey和shortKey嵌入iOS应用程序中,这是不推荐的。
有一种较旧的生成预签名URL的方法,可以生成非常短的链接,例如:
https://s3-ap-southeast-2.amazonaws.com/my-bucket/foo.png?AWSAccessKeyId=AKI123V12345RYTP123
然而,这早于sigv4,因此在较新的地区(法兰克福以后)不起作用。
您可以在以下位置找到示例代码:
我通过创建用于创建预签名URL并返回预签名URL的AWS lambda来解决这个问题。预签名的URL允许调用方访问(getObject)S3资源。关于这一点,有两种选择:
我从我的iOS应用程序中调用这个lambda作为未经授权的科尼托用户。从AWS lambda接收到预签名URL后,我能够缩短它,因为使用这种方法,预签名URL要短得多。
我试图上传图像/视频使用PHP/Javascript到AWS S3 这是我的PHP代码 这是我的Java脚本代码 所有这些功能工作伟大,我想即使在执行它给我文件上传成功消息too.but当我检查s3什么都没有。 即使在控制台中,它也会像下面一样生成预签名URL。但当我尝试单击它时,它会给我SignatureDesNotMatch错误。(请单击URL)。可能是什么错误。。? https://ibra
我试图上传一个图像使用预先签名的网址 我得到了一个类似的url https://s3.eu-west-1.amazonaws.com/bucket/folder/access.JPG?AWSAccessKeyId=xxxx 我已经尝试上传文件与内容类型图像/jpg,多部分/表单数据。 尝试生成没有文件类型和上传的网址。 尝试了放后法 但似乎什么都不管用 错误总是: 我们计算的请求签名与您提供的签名
我设置了以下信息: 创建了AWS S3存储桶并将一些映像上载到特定文件夹 创建了AWS CloudFront web发行版: 来源域名:从列表中选择的S3 bucket 限制存储桶访问:是 来源访问标识:选定的已有标识 授予桶的读取权限:是,更新桶策略 拒绝访问
Jenkins中的Git签出抛出错误“文件名太长”并失败,如下所示: hudson.plugins.git.gitException:命令“git.exe checkout-F 2CEA7D8EB9185899C01D2FFC86872F584DA2E60C”返回状态代码1: stdout: stderr:错误:无法创建文件some_long_named_project/src/test/reso
我知道水桶是存在的。当我通过AWS Web GUI导航到此项目并双击它时,它将打开带有URL的对象,并且运行良好: 所以我认为我在使用SDK时肯定做错了什么。
有没有办法让预签名的aws上传URL在出现错误时返回json响应,而不是xml响应。 目前,如果url过期,它会返回如下内容。 如果这是json响应就好了。