在不创建用户的情况下通过令牌在前端使用 Google 个存储桶的方法

Ways to using Google storage buckets on frontend by token without user creation

我有一个在服务器上存储文件的客户端-服务器应用程序,但是我想集成 google 云。

我必须马上说,用户可以通过电子邮件登录,也可以通过 phone 登录(在这种情况下,他不会有电子邮件)。

我的主要任务是让每个特定用户的前端能够将文件直接上传到 Google 云存储(无权删除它们)

我的主要想法是赋予特定用户向特定范围添加新文件的权限。起初,我想我会在后端创建一个具有管理员权限的服务帐户,并使用我的后端向特定用户授予对特定篮子文件夹的访问权限。但是,据我了解,最好为每个用户创建一个单独的存储桶,并赋予用户创建新文件的权限。 主要问题是如何为前端提供一个令牌,该令牌将包含仅添加到此存储桶的权利。 最初,我希望我可以创建某种令牌,而无需在 Google 云端创建用户实体。 但经过一番谷歌搜索后,我意识到我需要使用 IAM。 IAM 提供多种用户识别选项:

也许还有一些其他的选择。理想情况下,我想要一个用于特定存储桶的永久令牌,而不需要在 Google 存储端创建用户,因为我自己的数据库中已经有一个用户。

我找到了一个解决方案,这是唯一适用于类似任务的解决方案。这些是 Signed URLs.

接下来的逻辑是:客户端向服务器请求一个link来上传文件,服务器创建一个签名的link并在一定时间内可用,客户端进行放置通过在 GCS 上上传所需文件来请求。

Here is an example 在所有语言中如何创建这样的 link

这里有一个简单的例子,说明如何使用 link:

在前端将文件上传到 google 云存储

<div>
    <label htmlFor="inventoryPicture">Choose file to upload</label>
    <input type="file" name="someFile" accept=".jpg" id="photo"/>
</div>

<script>
    document.getElementById('photo').addEventListener('change', async (event) => {
        const file = event.target.files[0];
        //your signed url:
        const url = 'https://storage.googleapis.com/your-bucket/123.jpeg?X-Goog-Algorithm=...';
        try {
            const response = await fetch(url, {
                method: 'PUT',
                body: file,
            });
        } catch (error) {
            console.error('Error:', error);
        }

    });
</script>