如何将 Firebase 存储图像与 Google Cloud Vision API 一起使用?

How to use Firebase Storage image with Google Cloud Vision API?

我有一个网络应用程序,其中用户使用 Firebase Auth 进行匿名身份验证。我将来自用户的图像存储在 Firebase Storage 中,它在幕后由 Google Cloud Storage 存储桶提供支持。当我尝试从客户端 javascript 使用 Google Cloud Vision API 获取图像属性时,出现权限错误。

image-annotator::User lacks permission.: Can not open file: gs://MYAPP.appspot.com/photos/IMG_12345.jpg

如果我制作图像 public,一切正常。但这是用户数据,不能是 public。我该如何解决这个问题?

我调用愿景的代码api:

gapi.client.init({
    'apiKey': MY_API_KEY,
    'discoveryDocs': ['https://vision.googleapis.com/$discovery/rest'],
    // clientId and scope are optional if auth is not required.
    'clientId': MY_APP_ID + '.apps.googleusercontent.com',
    'scope': 'profile',
  }).then(function() {
    // 3. Initialize and make the API request.
    return gapi.client.vision.images.annotate({
      "requests":
      [
        {
          "features":
          [
            {
              "type": "LABEL_DETECTION"
            },
            {
              "type": "IMAGE_PROPERTIES"
            }
          ],
          "image":
          {
            "source":
            {
              "gcsImageUri": "gs://MY_APP.appspot.com/photos/" + "IMG_12345.jpg"
            }
          }
        }
      ]
    });
  }).then(function(response) {
    console.log(response.result);
  }, function(reason) {
    console.log('Error: ' + reason.result.error.message);
  });

我上传图片到存储的代码:

var file = e.target.files[0];
var metadata = {
  contentType: file.type
};
console.log(file);

var uploadTask = photosStorageRef.child(file.name).put(file, metadata);

您确实想通过 Google Cloud Functions (see my example here).

之类的方式在服务器端执行此操作

客户端会要求你的API密钥有足够的权限来访问照片,这基本上会使私人照片public(因为一旦API密钥有权限阅读它们,如何阻止恶意客户端这样做?)。