过期日期已过的 Cloudfront 签名 URL 可用于我的应用程序,但不能用于浏览器

问题描述

在我的 Java 后端,每次我的前端加载/重新加载时,我都会生成一个新的签名 URL。出于测试目的,我对到期日期进行了硬编码。过期日期/时间已过且 URL 已按预期过期,但我的前端应用程序仍然能够使用我传递给它的 URL 显示对象。

这是在每次刷新时执行的后端代码

            String signedUrl = CloudFrontUrlSigner.getSignedURLWithCannedPolicy(SignerUtils.Protocol.https,distributionDomain,new File(privateKeyFilePath),s3ObjectKey,"my-keypair-id",DateUtils.parseISO8601Date("2021-02-10T14:41:00.000Z"));

在我的前端,我只是将 signedUrl 添加到 Image 标签中:

        <Image style={styles.img} source={{ uri: img }} />

如果我转到浏览器并手动粘贴我的 signedUrl,我可以看到它显示由于过期而拒绝访问。

解决方法

我想我会尝试其他一些方法来查看行为。我将我的存储桶策略更改为完全私有,并尝试仅从 S3 URL 和浏览器中提取图像,它按预期被阻止,但是,从我的应用程序来看,这是有效的。然后,我尝试了相同的方法,除了 Android Play 商店中我的应用程序的测试版。在这里,图像的行为符合预期。当我阻止公共访问时,它们就会消失,反之亦然。

我最终从我的手机上卸载了我的应用程序的本地版本,重新安装了它,现在它按预期工作,由于过期日期过去,img 没有出现。不知道那里发生了什么。