我有一个服务器应用程序,用于在Google云端存储中存储用户文件。客户端从服务器请求文件,并返回指向Google云端存储中文件的URL。服务器还返回访问令牌,以便客户端可以下载文件。
我发现我的服务器生成的访问令牌可用于下载我存储在Google云端存储中的任何文件。我更愿意生成一个仅对单个Bucket有效的Access Token。那可能吗?这是限制客户端访问存储的正确方法吗?
以下是我如何生成访问令牌:
private Credential authorize (Set<String> scopes)
{
GoogleCredential credential = null;
try
{
if (m_HttpTransport == null)
{
m_HttpTransport = GoogleNetHttpTransport.newTrustedTransport ();
}
File p12File = new File ("key.p12");
credential = new GoogleCredential.Builder ()
.setTransport (m_HttpTransport)
.setJsonFactory (JacksonFactory.getDefaultInstance ())
.setServiceAccountId ("foo@developer.gserviceaccount.com")
.setServiceAccountScopes (scopes)
.setServiceAccountPrivateKeyFromP12File (p12File).build ();
}
catch (Exception ex)
{
m_Logger.log (Level.SEVERE, null, ex);
}
return credential;
}
private String retrieveReadOnlyAccessToken ()
throws IOException
{
Set<String> scopes = new HashSet<> ();
scopes.add (StorageScopes.DEVSTORAGE_READ_ONLY);
Credential credential = authorize (scopes);
credential.refreshToken ();
return credential.getAccessToken ();
}
答案 0 :(得分:1)
对于您的用例(对资源的有限访问),我建议使用签名URL。请参阅文档here。
解决此用例的典型方法是向用户提供签名URL,允许用户在限定时间内访问该资源。知道URL的任何人都可以在有限的时间内访问该资源。
如果是签名网址,您的用户甚至不必拥有Google帐户来读取/写入/删除GCS资源,并且访问控制完全由您的应用程序管理。