当前位置: 首页 > 面试题库 >

如何使用python以编程方式获取GCP Bearer令牌

马宜民
2023-03-14
问题内容

gcloud auth print-access-token给我一个Bearer令牌,以后可以使用;但是,这是一个shell命令。如何通过Google
Cloud Python API以编程方式获取一个?

我看到了使用oauth2client的先前示例,但现在已弃用。如何使用google.auth和oauthlib做到这一点?


问题答案:

答案取决于您的环境以及您如何创建/获取凭据。

什么是Google Cloud凭据?

Google Cloud凭证是OAuth 2.0令牌。此令牌至少具有Access TokenRefresh Token,并且可选地包含Client ID Token,和支持参数,例如expirathtml" target="_blank">ionService Account EmailClient Email等。

Google Cloud API中的重要项目是Access Token。该令牌授权访问云。该令牌可用于诸如curl,诸如的软件等程序中python,并且不需要SDK。的Access Token是在HTTP中使用Authorization报头。

什么是访问令牌?

访问令牌是Google生成的不透明值,它是从Signed
JWT(更正确地称为JWS)派生而来的。JWT由标头和声明(有效负载)Json结构组成。这两个Json结构是使用服务帐户的私钥签名的。这些值经过base64编码和连接以创建访问密钥。

访问令牌的格式为: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"
}

使用访问令牌:

启动虚拟机实例的示例。替换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服务帐户:

在这种情况下,达斯汀的答案是正确的,但是为了完整起见,我将提供一些附加信息。

这些凭据由GCP自动为您创建,并从VM实例元数据中获取。权限由Cloud API access scopesGoogle控制台控制。

但是,这些凭据有一些限制。要修改凭据,必须首先停止VM实例。此外,不支持所有权限(角色)。

from google.auth import compute_engine

cred = compute_engine.Credentials()

服务帐户凭据:

在您了解凭证的所有类型及其用例之前,这些凭证将用于除gcloud和以外的所有内容gsutil。了解这些凭据将使编写程序时使用Google
Cloud变得更加简单。从Google Service Account
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)


 类似资料:
  • 我在Android中初始化了Firebase,而没有使用像这样的google-service插件 现在,在初始化firebase应用程序之后,我如何获得生成的令牌来通过FCM发送推送通知

  • 问题内容: 我想从受监视的应用程序内部以编程方式获得等效的输出。我看到可以通过HotSpot诊断Bean触发二进制堆转储,但是我看不到如何获取直方图数据。可能吗 ? 问题答案: 这可能是不是最好的例子/代码,但看看这个 (我认为这仅适用于Hotspot JVM)

  • 问题内容: 我正在尝试将bash或python脚本放在一起以与facebook graph API一起玩。使用API​​看起来很简单,但是我在bash脚本中设置curl来调用authorize和access_token遇到麻烦。有人有可行的例子吗? 问题答案: 更新2018-08-23 由于这仍然有一些意见和支持,我只想提一提,到目前为止,似乎存在一个维护良好的第三方SDK:https : //g

  • 问题内容: 基本上,我想获取python解释器的句柄,以便可以传递脚本文件来执行(从外部应用程序执行)。 问题答案: 这适用于Linux和Windows: Python 3.x Python 2.x

  • 我在IDP(ADFS)和SP之间配置了SSO,IDP生成SAML令牌并发布到SP页面进行身份验证。但是,我喜欢创建一个名为test app的新应用程序,该应用程序应该通过使用弹出的登录窗口以编程方式为IDP和SP生成/提取SAML令牌。 有可能吗? 在获得SAML令牌后,我打算在SP的REST webservice上使用它。

  • 我想以编程方式查看广告包的所有ProximityUID。一些文章说这在iOS上是不可能的,但Android是可能的。但我不敢相信,因为我发现神奇的应用程序“BLExplr”有这个功能。我需要在我的应用程序中实现该功能。有人知道怎么做吗?或者有好的例子吗?任何帮助都将不胜感激。 (更新日期2014/1/17) 我相信@davidgyoung的答案是正确的。估计信标的近似UID为“B9407F30-F