答案取决于您的环境以及您希望如何创建/获取凭据。
什么是 Google Cloud 凭据?
Google Cloud 凭据是 OAuth 2.0 令牌。这个令牌至少有一个Access Token 和可选的Refresh Token、Client ID Token,以及诸如expiration、Service Account Email 或Client Email 等支持参数。
Google Cloud API 中的重要项是Access Token。这个令牌是授权访问云的东西。该令牌可用于curl等程序、python等软件等,不需要SDK。 Access Token 用于 HTTP Authorization 标头中。
什么是访问令牌?
访问令牌是由 Google 生成的不透明值,它派生自签名的 JWT,更准确地说是 JWS。 JWT 由标头和声明(有效负载)Json 结构组成。这两个 Json 结构使用服务帐户的私钥进行签名。这些值经过 base64 编码和连接以创建访问密钥。
Access Token 的格式为:base64(header) + '.' + base64(payload) + '.' + base64(signature)。
这是一个 JWT 示例:
标题:
{
"alg": "RS256",
"typ": "JWT",
"kid": "42ba1e234ac91ffca687a5b5b3d0ca2d7ce0fc0a"
}
有效载荷:
{
"iss": "myservice@myproject.iam.gserviceaccount.com",
"iat": 1493833746,
"aud": "myservice.appspot.com",
"exp": 1493837346,
"sub": "myservice@myproject.iam.gserviceaccount.com"
}
使用访问令牌:
将启动 VM 实例的示例。替换 PROJECT_ID、ZONE 和 INSTANCE_NAME。此示例适用于 Windows。
curl -v -X GET -H "Authorization: Bearer <access_token_here>" ^
https://www.googleapis.com/compute/v1/projects/%PROJECT_ID%/zones/%ZONE%/instances/%INSTANCE_NAME%/start
Compute Engine 服务帐号:
Dustin 的回答对于这种情况是正确的,但为了完整起见,我会提供一些额外的信息。
这些凭据由 GCP 自动为您创建,并从虚拟机实例元数据中获取。权限由 Google 控制台中的Cloud API access scopes 控制。
但是,这些凭据有一些限制。要修改凭据,您必须先停止 VM 实例。此外,并非所有权限(角色)都受支持。
from google.auth import compute_engine
cred = compute_engine.Credentials()
服务帐户凭据:
在您了解所有类型的凭据及其用例之前,这些凭据将用于除 gcloud 和 gsutil 之外的所有内容。了解这些凭据将使编写程序时使用 Google Cloud 变得更加简单。从 Google 服务帐户 Json 文件中获取凭据很容易。唯一需要注意的是凭据过期(通常为 60 分钟)并且需要刷新或重新创建。
gcloud auth print-access-token 不推荐。服务帐户凭据是 Google 推荐的方法。
这些凭据由控制台、gcloud 或通过程序/API 创建。权限由 IAM 分配给贷方,并在 Compute Engine、App Engine、Firestore、Kubernetes 等以及 Google Cloud 之外的其他环境中发挥作用。这些凭据从 Google Cloud 下载并存储在 Json 文件中。注意scopes 参数。这定义了授予结果凭证对象的权限。
SCOPES = ['https://www.googleapis.com/auth/sqlservice.admin']
SERVICE_ACCOUNT_FILE = 'service-account-credentials.json'
from google.oauth2 import service_account
cred = service_account.Credentials.from_service_account_file(
SERVICE_ACCOUNT_FILE, scopes=SCOPES)
Google OAuth 2.0 凭据:
这些凭据源自完整的 OAuth 2.0 流程。这些凭据是在您启动浏览器以访问 Google 帐户以授权访问时生成的。这个过程要复杂得多,需要大量的代码来实现,并且需要一个内置的 Web 服务器来进行授权回调。
此方法提供了附加功能,例如能够在浏览器中运行所有内容,例如您可以创建云存储文件浏览器,但请注意了解安全隐患。此方法是用于支持 Google 登录等的技术。我喜欢在允许在网站等上发布之前使用此方法对用户进行身份验证。正确授权的 OAuth 2.0 身份和范围的可能性是无限的。
使用google_auth_oauthlib的示例代码:
from google_auth_oauthlib.flow import InstalledAppFlow
flow = InstalledAppFlow.from_client_secrets_file(
'client_secrets.json',
scopes=scope)
cred = flow.run_local_server(
host='localhost',
port=8088,
authorization_prompt_message='Please visit this URL: {url}',
success_message='The auth flow is complete; you may close this window.',
open_browser=True)
使用requests_oauthlib 库的示例代码:
from requests_oauthlib import OAuth2Session
gcp = OAuth2Session(
app.config['gcp_client_id'],
scope=scope,
redirect_uri=redirect_uri)
# print('Requesting authorization url:', authorization_base_url)
authorization_url, state = gcp.authorization_url(
authorization_base_url,
access_type="offline",
prompt="consent",
include_granted_scopes='true')
session['oauth_state'] = state
return redirect(authorization_url)
# Next section of code after the browser approves the request
token = gcp.fetch_token(
token_url,
client_secret=app.config['gcp_client_secret'],
authorization_response=request.url)