当前位置: 首页 > 知识库问答 >
问题:

AWS签名的URL太长,无法缩短

丌官翰采
2023-03-14

我正在使用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(预签名请求)。

我尝试了以下方法,但没有成功:

  • 用3个字符选择最短的S3存储桶名称

但即使进行了所有这些小调整,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应用程序中,这是不推荐的。

共有2个答案

夏侯衡
2023-03-14

有一种较旧的生成预签名URL的方法,可以生成非常短的链接,例如:

https://s3-ap-southeast-2.amazonaws.com/my-bucket/foo.png?AWSAccessKeyId=AKI123V12345RYTP123

然而,这早于sigv4,因此在较新的地区(法兰克福以后)不起作用。

您可以在以下位置找到示例代码:

  • mdwhcott/s3_presign.py
  • S3生成预签名URL
  • 它也可用于签名上传:预签名URL的正确S3策略
蒋正平
2023-03-14

我通过创建用于创建预签名URL并返回预签名URL的AWS lambda来解决这个问题。预签名的URL允许调用方访问(getObject)S3资源。关于这一点,有两种选择:

  1. 分配给AWS lambda的角色具有getObject的S3权限。生成的预签名URL包含的令牌比使用AWS Cognito在iOS应用程序中发布的临时凭据创建的预签名URL要短得多
  2. 将具有getObject的S3权限的角色的访问密钥和密钥直接嵌入AWS lambda,这将为您提供更短的URL,因为生成的预签名URL中不包含令牌。(例如AWS代码示例)

我从我的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响应就好了。