Google云存储 - 匿名用户没有对项目XXXXXXXXXX

时间:2017-10-15 06:33:33

标签: swift google-cloud-storage

我正在使用swift对我的谷歌云存储桶进行API调用。

import PlaygroundSupport
import Foundation

let url = URL(string: "https://www.googleapis.com/storage/v1/b?project=<project id>")

let task = URLSession.shared.dataTask(with: url!) { data, response, error in
    guard error == nil else {
        print(error!)
        return
    }
    guard let data = data else {
        print("Data is empty")
        return
    }

    let json = try! JSONSerialization.jsonObject(with: data, options: [])
    print(json)
}

task.resume()
PlaygroundPage.current.needsIndefiniteExecution = true

不幸的是,这是得到的:

{
    error =     {
        code = 401;
        errors =         (
                        {
                domain = global;
                location = Authorization;
                locationType = header;
                message = "Anonymous users does not have storage.buckets.list access to project <project id>.";
                reason = required;
            }
        );
        message = "Anonymous users does not have storage.buckets.list access to project <project id>.";
    };
}
谷歌云文档非常混乱。在这种情况下,我不知道如何指定用户。什么是正确的方法?

1 个答案:

答案 0 :(得分:1)

列出存储桶需要将您的请求授权为具有storage.buckets.list permssion的用户或服务帐户。这通常是&#34;所有者&#34;,&#34;编辑&#34;,&#34;查看者&#34;或&#34; storage.admin&#34;在项目中的角色。

首先要决定的是您是要授权用户还是服务帐户。如果此swift应用程序将要访问属于最终用户的项目,请选择用户授权。如果需要在您的应用程序自己的项目中列出存储桶,请选择服务帐户身份验证。

如果您选择服务帐户,则必须创建一个服务帐户并为其生成凭据(请参阅here),然后在您的应用中使用该帐户生成您在API调用期间在Authorization标头中传递的JWT (见here)。

如果您选择代表最终用户进行身份验证,则您的应用程序必须执行&#34; OAuth 2.0三脚流程&#34;如果您的应用通过请求获取令牌将用户发送给Google,则Google会向用户提供身份验证对话框并选择授予对您的应用的访问权限,如果他们说是,则使用刷新令牌将其重定向回来。然后,您的应用可以使用刷新令牌以及API调用(或者更好,使用刷新令牌来获取要发送的短期访问令牌)。如何执行此操作取决于应用程序的类型,有关详细信息,请参阅here