GCP REST api 身份验证缺失

问题描述 投票:0回答:2

我使用 Web 界面创建了一个 JDBC 到 BigQuery 的作业,并且运行良好。 现在我想从 GCP 的 REST API 创建相同的作业,因此我从网站获取了请求的其余部分,并尝试从 Postman 发送它。

我正在向以下 URL 发送 POST 请求:
https://dataflow.googleapis.com/v1b3/projects/test-data-308414/templates:launch?gcsPath=gs://dataflow-templates/latest/Jdbc_to_BigQuery

这是我从 GCP 文档中的示例中获得的。

我还在正文中传递了 GCP 给我的 JSON。
API 密钥作为获取参数,格式为“?key=[API_KEY]”

我从服务器收到 401 响应,并显示以下消息:

请求缺少所需的身份验证凭据。预期的 OAuth 2 访问令牌、登录 cookie 或其他有效的身份验证凭据。 看 https://developers.google.com/identity/sign-in/web/devconsole-project

状态为:

未经验证

我查看了链接,发现了一个关于如何在前端创建谷歌身份验证的教程 女巫对我没有帮助。

我非常确定我以错误的格式传递了 API 密钥,这也是它无法进行身份验证的原因。
但我找不到任何说明如何正确执行此操作的文档。

PS> 我也尝试过在标题处传递它,正如我在一个地方看到的那样 采用下一种格式

授权:[API_KEY]

但失败并显示相同的消息

api google-cloud-platform api-key
2个回答
2
投票

几天前,我试图将 GCP 集成到 SaaS 应用程序中,但很难弄清楚如何使用不同项目的凭据来调用微服务(充当 GCP 的代理),这些凭据将动态传递给该微服务。令我惊讶的是,尽管花费了大量时间,我还是无法弄清楚如何实现它,因为 GCP 文档专注于使用应用程序默认凭据一次处理一个项目凭据。另一个令人沮丧的事情是,API 资源管理器默认为所有 API 显示 OAuth 2.0 和 API 密钥,而事实上任何 API 都几乎不支持 API 密钥。最后我找到了这个问题的解决方案here

以下是调用 GCP Rest api 的步骤 -

  • 为您的项目创建一个服务帐户并下载与其关联的 json 文件。
  • 记下服务帐户 json 文件中的
    client_email
    private_key_id
    private_key
    属性值。
  • 使用上述值定义以下环境变量 -
GCP_SERVICE_ACCOUNT_CLIENT_EMAIL=<client_email>
GCP_SERVICE_ACCOUNT_PRIVATE_KEY_ID=<private_key_id>
GCP_SERVICE_ACCOUNT_PRIVATE_KEY=<private_key>
  • 执行以下python代码生成jwt_token -

    import time, jwt, os
    
    iat = time.time()
    exp = iat + 3600
    
    client_email = os.getenv('GCP_SERVICE_ACCOUNT_CLIENT_EMAIL')
    private_key_id = os.getenv('GCP_SERVICE_ACCOUNT_PRIVATE_KEY_ID')
    private_key = os.getenv('GCP_SERVICE_ACCOUNT_PRIVATE_KEY')
    
    payload = {
        'iss': client_email,
        'sub': client_email,
        'aud': 'https://compute.googleapis.com/',
        'iat': iat,
        'exp': exp
    }
    
    private_key1 = private_key.replace('\\n', '\n')
    # print(private_key1)
    
    additional_headers = {'kid': private_key_id}
    
    signed_jwt = jwt.encode(
                    payload, 
                    private_key1,
                    headers=additional_headers,
                    algorithm='RS256'
                )
    
    print(signed_jwt)

  • 使用上一步生成的 jwt 令牌并将其用作不记名令牌来调用任何 GCP Rest api。例如
curl -X GET --header 'Authorization: Bearer <jwt_token>' 'https://compute.googleapis.com/compute/v1/projects/{project}/global/networks'

0
投票

验证请求的最佳实践是使用您的应用程序凭据。只需确保您安装了谷歌云SDK

curl -X POST \
-H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
https://dataflow.googleapis.com/v1b3/projects/PROJECT_ID/templates:launch?gcsPath=gs://dataflow-templates/latest/Jdbc_to_BigQuery
© www.soinside.com 2019 - 2024. All rights reserved.