我正在使用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>.";
};
}
谷歌云文档非常混乱。在这种情况下,我不知道如何指定用户。什么是正确的方法?
答案 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。