authentication - Google Cloud Storage 以用户为中心的身份验证
问题描述
我的目标是使用访问令牌(无需 Gmail、Facebook 等)直接从客户端访问 Google Cloud Storage 文件。我想要这样的架构:
在创建存储文件时,服务器将创建一个文件并为其分配一个由服务器生成的密钥并将其发送给授权的客户端。只有拥有密钥的客户端才能访问存储文件。
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String generatedString = getAlphaNumericString(16);
GcsFilename gcsFileName = new GcsFilename("feist*******2.appspot.com", generatedString);
GcsFileMetadata metaData = gcsService.getMetadata(gcsFileName);
while(metaData != null) {
generatedString = getAlphaNumericString(16);
gcsFileName = new GcsFilename("feist*********2.appspot.com", generatedString);
metaData = gcsService.getMetadata(gcsFileName);
}
/*GcsFileOptions.Builder builder = new GcsFileOptions.Builder();
builder.acl("public-read");*/
GcsFileOptions instance = GcsFileOptions.getDefaultInstance();
GcsOutputChannel outputChannel;
outputChannel = gcsService.createOrReplace(gcsFileName, instance);
copy(req.getInputStream(), Channels.newOutputStream(outputChannel));
JSONObject jsonWriter = new JSONObject();
jsonWriter.append("result", "ok");
jsonWriter.append("path", generatedString);
resp.setContentType("application/json; charset=UTF-8");
PrintWriter out = resp.getWriter();
out.print(jsonWriter.toString());
}
我添加了我的简单 java 代码来创建一个文件并将数据上传到它。有什么方法可以将此文件添加为直接从具有服务器生成的密钥的客户端访问的密钥。
注意:我有一个 3 层消息传递应用程序。我正在使用 Firebase Cloud Messaging 进行下游通知(我认为这超出了主题)。对于存储(图像、声音等),我使用的是 Google Cloud Storage。我不想让我的存储公开访问。我也不想实现以服务器为中心的身份验证来访问 Google Cloud Storage 资源。
解决方案
使用签名 URL来避免所有这些令牌生成问题。它们旨在完成您要求的相同功能。
查看 Cloud Storage 的Java 客户端库,了解如何生成它们。