【发布时间】:2019-12-22 19:43:56
【问题描述】:
我正在使用signed-urls 为我的客户提供对谷歌云存储对象的临时访问权限
我有一个服务帐户 json,如下所示:
{
"type": "service_account",
"project_id": "my-project",
"private_key_id": "abcdef1234567890",
"private_key": "-----BEGIN PRIVATE KEY-----\n<key...>\n-----END PRIVATE KEY-----\n",
"client_email": "my-app@my-project.iam.gserviceaccount.com",
"client_id": "1234567890",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/my-app%my-project.iam.gserviceaccount.com"
}
这是我创建签名 url 的方法 - 用 elixir 编写的代码(代码来自 gcs_signer lib)
def sign_url(private_key, client_email, bucket, object) do
verb = "GET"
md5_digest = ""
content_type = ""
expires = DateTime.utc_now() |> DateTime.to_unix() |> Kernel.+(1 * 3600)
resource = "/#{bucket}/#{object}"
signature = [verb, md5_digest, content_type, expires, resource]
|> Enum.join("\n") |> generate_signature(private_key)
url = "https://storage.googleapis.com#{resource}"
qs = %{
"GoogleAccessId" => client_email,
"Expires" => expires,
"Signature" => signature
} |> URI.encode_query
Enum.join([url, "?", qs])
end
defp generate_signature(string, private_key) do
private_key = process_key(private_key)
string
|> :public_key.sign(:sha256, private_key)
|> Base.encode64
end
defp process_key(private_key) do
private_key
|> :public_key.pem_decode
|> (fn [x] -> x end).()
|> :public_key.pem_entry_decode
|> normalize_private_key
end
defp normalize_private_key(private_key) do
# grab privateKey from the record tuple
private_key
|> elem(3)
|> (fn pk -> :public_key.der_decode(:RSAPrivateKey, pk) end).()
end
这是我使用 json 文件中的 private_key 创建一个签名的 url
出于安全原因,我们移至 service-accounts-for-instances,而不是使用 json 凭据
我的问题是当我没有 json 凭证时,如何在使用 service-accounts-for-instances 时创建签名的 url?
我唯一拥有的是servie_account_email,它看起来像这样:my-app-gsa@my-project.iam.gserviceaccount.com
我应该使用signBlob api吗?如果是这样,我的 curl 请求会是什么样子?
【问题讨论】:
-
当您在 Google Compute Engine(任何计算服务)上使用(参考)Google Cloud 凭据(服务帐户)时,您无权访问私钥。这意味着您必须使用 Google Cloud 库或编写自己的代码才能使用 SignBlob(这意味着 Google 正在为您访问私钥)。此链接提供有关 REST API 的信息,然后您可以将其映射到 curl 参数:cloud.google.com/iam/docs/reference/rest/v1/…
-
要查看 CLI 如何生成 API 调用,请添加命令行选项
--log-http。然后,您可以跟踪由gcloud生成的整个预签名 URL。
标签: google-cloud-platform elixir google-cloud-storage