当前位置: 首页 > 知识库问答 >
问题:

使用用户帐户凭据来实现私有云运行/云功能

锺离锦
2023-03-14

这里是我的用例。

  • 我已经在私有模式下部署了云运行服务。(与云函数相同的问题)
  • 我正在开发一个使用云运行的新服务。我使用应用程序中的默认凭据进行身份验证。它在Compute Engine和Cloud Run上工作,因为默认凭据是从元数据服务器获得的。

但是,我不能使用我的用户帐户凭据。

日志跟踪在Java、Node或Go中非常清晰:不可能在用户凭据类型上生成标识令牌。

所以,

    null

爪哇

我做这个

        Credentials credentials = GoogleCredentials.getApplicationDefault().createScoped("https://www.googleapis.com/auth/cloud-platform");

        IdTokenCredentials idTokenCredentials = IdTokenCredentials.newBuilder()
                .setIdTokenProvider((IdTokenProvider) credentials)
                .setTargetAudience(myUri).build();

        HttpRequestFactory factory = new NetHttpTransport().createRequestFactory(new HttpCredentialsAdapter(idTokenCredentials));

并且我的用户凭据与IDTokenProvider接口不兼容


Caused by: java.lang.ClassCastException: class com.google.auth.oauth2.UserCredentials cannot be cast to class com.google.auth.oauth2.IdTokenProvider (com.google.auth.oauth2.UserCredentials and com.google.auth.oauth2.IdTokenProvider are in unnamed module of loader 'app')
    const {GoogleAuth} = require('google-auth-library');
    const auth = new GoogleAuth()
    const client = await auth.getIdTokenClient(url);
    const res = await client.request({url});
    console.log(res.data);
Error: Cannot fetch ID token in this environment, use GCE or set the GOOGLE_APPLICATION_CREDENTIALS environment variable to a service account credentials JSON file.
    at GoogleAuth.getIdTokenClient(....)

共有1个答案

鄂育
2023-03-14

gcloud auth activate-service-account-key-file只适用于运行gcloud命令的“您”,而不是需要google_application_credentials的“应用程序”。

java调用Google Cloud Run或如何从Cloud Run/gcp的外部调用Cloud Run?中可以看到,您要么需要有服务帐户的JSON密钥文件,要么必须在gce/gke/Cloud Run/App Engine/gcf实例中运行。

为了在本地环境中工作,我建议使用gcloud auth application-default login命令登录(该命令的工作方式与本地设置google_application_credentials类似)。如果这管用就告诉我。

如果这不起作用,作为最后的手段,您可以重构代码,以便在本地工作时从环境变量(如果设置了)中提取标识令牌,例如:

$ export ID_TOKEN="$(gcloud auth print-identity-token -q)"
$ ./your-app

根据纪尧姆的请求“这个gcloud auth print-identity-token如何使用我的个人Google凭据”?

>

  • gcloud是一个注册到Google的OAuth客户端,要获得JWT令牌,您需要在GCE/gcf/gke/gae/cr环境中工作,或者有一个OAuth应用程序。

    GCloud发出如下请求:

    POST https://www.googleapis.com/oauth2/v4/token
    

    带身体:

    grant_type=refresh_token&client_id=REDACTED.apps.googleusercontent.com&client_secret=REDACTED&refresh_token=REDACTED
    

    对于我们来说,client_idclient_secret值很可能是相同的,因为它们是GCloud的。但是,它会将refresh_token与一个新令牌交换。

    /token响应将包含access_tokenid_token。例如:

    {
    "access_token": ".....",
    "id_token": "eyJhbG....."
    "expires_in": 3599,
    "scope": "https://www.googleapis.com/auth/userinfo.email 
    https://www.googleapis.com/auth/appengine.admin 
    https://www.googleapis.com/auth/compute 
    https://www.googleapis.com/auth/cloud-platform 
    https://www.googleapis.com/auth/accounts.reauth openid",
    "token_type": "Bearer",
    }
    

    这就是GCloud为您打印标识令牌的方式。

    如果您想知道代码是如何使用JSON密钥文件的,您将看到非常类似的内容。例如,在Go中有http://google.golang.org/api/idToken包,您将在那里看到类似的实现。

  •  类似资料:
    • 这是服务到服务身份验证中概述的规则的一个例外吗?该规则规定需要设置为接收服务的url(例如https://xxxxx.run.app)。和是一回事吗? 最后,除了使用googlecloudsdk(即imaging不存在)之外,是否还有其他方法使用用户帐户而不是服务帐户进行身份验证?

    • 我目前正在进行一个项目,该项目将自动设置一个新的Firebase/GCloud项目。它在很大程度上依赖于Firebase CLI和gcloud SDK,这些SDK具有几个强制步骤的用户凭据。 我现在正在尝试将这个项目移动到云运行的Docker容器中。我已经能够使用Firebase CLI的内置基于令牌的CI命令,使用用户凭据对其进行身份验证。 我想问一下是否可以使用类似的方法对gcloud SDK

    • 我正在构建一个需要读取普通Gmail收件箱(不是域的一部分)的Web服务。 代码: 错误: 我看不出这有什么原因不起作用,但读完这篇文章后,你似乎不能在个人@gmail帐户上使用服务帐户凭据。有谁知道这是真的还是我做错了什么? 感谢您的帮助! 更新 如果我将更改为,我可以查看邮件,但无法修改标签,这是我的要求。

    • 云用户组对应公有云上的用户组,通过用户组可以对职责相同的用户进行分类并授权等。 云用户组对应公有云上的用户组,通过用户组可以对职责相同的用户进行分类并授权等。 同步规则 从本地到云上:在本地创建的云用户组关联云用户时,将会同步到对应公有云平台,并创建一条缓存记录,即本地与云上的映射关系。在本地修改云用户组权限时,将会同步到公有云平台。 从云上到本地:当平台添加公有云账号时,将会把公有云上的用户组同

    • 问题内容: 我刚刚为Firebase实施了新的Cloud Functions,但是日志中有些东西让我感到困扰: 未配置结算帐户。无法访问外部网络,并且配额受到严重限制。配置计费帐户以消除这些限制 我实际上设法从外部网络访问该功能,所以我想知道我是否真的必须提供计费帐户?Firebase文档中对此没有任何内容。 我将Spark订阅计划用于个人测试,并且如果我不打算支付任何费用,则不想添加账单信息。

    • 我刚刚为Firebase实现了新的云功能,但日志中有一些让我烦恼的地方: 未配置账单帐户。外部网络无法访问,配额受到严格限制。配置帐单帐户以删除这些限制 我实际上设法从外部网络访问了该功能,所以我想知道我真的必须给我的账单帐户吗?firebase文件里没有这方面的内容。 我使用Spark订阅计划用于个人测试目的,如果我还不打算支付任何费用,我不想添加账单信息。