在不创建用户的情况下通过令牌在前端使用 Google 个存储桶的方法
Ways to using Google storage buckets on frontend by token without user creation
我有一个在服务器上存储文件的客户端-服务器应用程序,但是我想集成 google 云。
我必须马上说,用户可以通过电子邮件登录,也可以通过 phone 登录(在这种情况下,他不会有电子邮件)。
我的主要任务是让每个特定用户的前端能够将文件直接上传到 Google 云存储(无权删除它们)
我的主要想法是赋予特定用户向特定范围添加新文件的权限。起初,我想我会在后端创建一个具有管理员权限的服务帐户,并使用我的后端向特定用户授予对特定篮子文件夹的访问权限。但是,据我了解,最好为每个用户创建一个单独的存储桶,并赋予用户创建新文件的权限。
主要问题是如何为前端提供一个令牌,该令牌将包含仅添加到此存储桶的权利。
最初,我希望我可以创建某种令牌,而无需在 Google 云端创建用户实体。
但经过一番谷歌搜索后,我意识到我需要使用 IAM。
IAM 提供多种用户识别选项:
- Google 账户邮箱:user@gmail.com - 但是正如我之前写的,我可能没有邮箱,只有 phone 人数
- Google 群组:admins@googlegroups.com - 不是我的选择
- 服务帐户:server@example.gserviceaccount.com - 但据我了解,前端不允许使用服务帐户。
- Google 工作区域:example.com - 不是我的选择
也许还有一些其他的选择。理想情况下,我想要一个用于特定存储桶的永久令牌,而不需要在 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>
我有一个在服务器上存储文件的客户端-服务器应用程序,但是我想集成 google 云。
我必须马上说,用户可以通过电子邮件登录,也可以通过 phone 登录(在这种情况下,他不会有电子邮件)。
我的主要任务是让每个特定用户的前端能够将文件直接上传到 Google 云存储(无权删除它们)
我的主要想法是赋予特定用户向特定范围添加新文件的权限。起初,我想我会在后端创建一个具有管理员权限的服务帐户,并使用我的后端向特定用户授予对特定篮子文件夹的访问权限。但是,据我了解,最好为每个用户创建一个单独的存储桶,并赋予用户创建新文件的权限。 主要问题是如何为前端提供一个令牌,该令牌将包含仅添加到此存储桶的权利。 最初,我希望我可以创建某种令牌,而无需在 Google 云端创建用户实体。 但经过一番谷歌搜索后,我意识到我需要使用 IAM。 IAM 提供多种用户识别选项:
- Google 账户邮箱:user@gmail.com - 但是正如我之前写的,我可能没有邮箱,只有 phone 人数
- Google 群组:admins@googlegroups.com - 不是我的选择
- 服务帐户:server@example.gserviceaccount.com - 但据我了解,前端不允许使用服务帐户。
- Google 工作区域:example.com - 不是我的选择
也许还有一些其他的选择。理想情况下,我想要一个用于特定存储桶的永久令牌,而不需要在 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>