我有一个App引擎应用程序。我想使用云存储来存储一些用户上传的文件。
我想知道如何进行简单身份验证,以访问每个应用引擎应用程序附带的单个免费存储桶。
我只希望应用程序本身与云存储通信,并且用户无需与云存储进行任何交互。每个文件都可以放在同一个文件夹中,只需要可以访问App引擎JVM。
是否有一种简单的身份验证方式,而无需通过Oauth2等?一种简单的服务器到服务器类型的访问,如果可能的话!
编辑:它与此相同吗?
gcloud beta auth application-default login
编辑2:尝试了以上Gcloud的默认身份验证设置。仍然会抛出相同的异常。
com.google.cloud.storage.StorageException: Invalid Credentials
测试我正在使用的代码:
private static Storage storage = null;
static {
storage = StorageOptions.getDefaultInstance().getService();
}
@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
PrintWriter out = resp.getWriter();
out.println("Hello, world");
testCloudStorage();
}
private void testCloudStorage() throws IOException{
ByteArrayInputStream baIs = new ByteArrayInputStream("TEST FILE CONTENT".getBytes());
uploadFile("test-content.txt", baIs, "xyzabc.appspot.com");
}
/**
* Uploads a file to Google Cloud Storage to the bucket specified in the BUCKET_NAME
* environment variable, appending a timestamp to end of the uploaded filename.
*/
public String uploadFile(String fileName, InputStream inputStream, final String bucketName) throws IOException {
DateTimeFormatter dtf = DateTimeFormat.forPattern("-YYYY-MM-dd-HHmmssSSS");
DateTime dt = DateTime.now(DateTimeZone.UTC);
String dtString = dt.toString(dtf);
final String extendedFileName = fileName + dtString;
// the inputstream is closed by default, so we don't need to close it here
BlobInfo blobInfo =
storage.create(
BlobInfo
.newBuilder(bucketName, extendedFileName)
// Modify access list to allow all users with link to read file
.setAcl(new ArrayList<>(Arrays.asList(Acl.of(Acl.User.ofAllUsers(), Role.READER))))
.build(),
inputStream);
// return the public download link
return blobInfo.getMediaLink();
}
编辑3:这些是我遵循的步骤:
答案 0 :(得分:1)
Appengine项目已经使用各自的存储桶进行了身份验证。根据{{3}}创建存储桶后,无需其他身份验证。
然后,您可以根据这些文档或blobstore https://cloud.google.com/appengine/docs/java/googlecloudstorageclient/setting-up-cloud-storage使用存储桶。