1

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

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

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

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

  • Google 帐户电子邮件:user@gmail.com - 但正如我之前写的,我可能没有电子邮件,只有电话号码
  • Google 群组:admins@googlegroups.com - 不是我的选择
  • 服务帐户:server@example.gserviceaccount.com - 但据我了解,前端不允许使用服务帐户。
  • Google Workspace 域:example.com - 不是我的选择

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

4

1 回答 1

1

我找到了一个解决方案,唯一一个适合类似任务的解决方案。这些是签名 URL

接下来的逻辑是:客户端向服务器请求上传文件的链接,服务器创建一个在一定时间内可用的签名链接,客户端通过将所需文件上传到 GCS 来发出 put 请求。

这是所有语言的示例如何创建此类链接

这是一个简单的示例,说明如何使用这样的链接将文件上传到前端的谷歌云存储:

<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>

于 2022-01-15T20:53:48.210 回答