拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 无法验证服务账号-GoogleCloud

无法验证服务账号-GoogleCloud

白鹭 - 2022-03-02 2118 0 0

我假设我在写作之前已经用谷歌搜索并阅读了档案,我注意到这也是 StackOverflow 上的一个热门讨论,但是已经给出的答案都没有帮助我。

我创建了一个 Google Cloud 账户来使用 API:Google Vision。

为此,我遵循了创建项目的步骤,添加了上述 API,最后创建了一个带有密钥的服务账户。

我下载了密钥并将其放在PC上java项目的档案夹中。

然后,由于它是一个 maven 项目,我将依赖项添加到 pom 中,如教程中所述。

此时,我插入了建议的代码段以开始使用 API。

一切似乎都很好,一切都被阅读了,各种库/界面都被汇入了。

但是当我尝试运行程序时出现了一个错误:

我必须承认我不知道“Google Compute Engine”是什么,但既然有替代方案并且我有一些凭据,我想尝试并遵循它。

所以我按照说明进行操作:

好的,我尝试了第一种方法,通过环境变量传递凭据:

  • 使用 powershell -> 无回应
$env:GOOGLE_APPLICATION_CREDENTIALS="my key path"
  • 使用 cmd -> 也没有回应
set GOOGLE_APPLICATION_CREDENTIALS=my key path

所以我尝试了第二种方法,使用代码传递凭据,如果我在这里,肯定有其他问题,实际上我所拥有的只能汇入 io.grpc.Context,而其他所有内容都会给出错误“不能决议符号..”。

import com.google.common.collect.Lists;
import io.grpc.Context;

import java.io.FileInputStream;
import java.io.IOException;

public class Main
{
    static void authExplicit(String jsonPath)
    {
        GoogleCredentials credentials = GoogleCredentials.fromStream(new FileInputStream(jsonPath))
                .createScoped( Lists.newArrayList("https://www.googleapis.com/auth/cloud-platform"));
        Context.Storage storage = StorageOptions.newBuilder().setCredentials(credentials).build().getService();

        System.out.println("Buckets:");
        Page<Bucket> buckets = storage.list();
        for (Bucket bucket : buckets.iterateAll()) {
            System.out.println(bucket.toString());
        }
    }

    public static void main(String[] args) throws IOException
    {
        OCR.detectText();
    }
}

(我不认为我可以上传代码荧屏来显示它给我的错误,但就是这样)

PS:我也已经安装了 Cloud SDK 并重新启动了 PC,因为有些评论说这样做是为了解决问题。

我能做什么?我做错了什么?

uj5u.com热心网友回复:

请考虑阅读ImageAnnotationClient类级别的javadocs,它为您提供有关如何完成身份验证程序的正确指导。我修改了提供的代码给你完整的例子:

// Please, set the appropriate path to your JSON credentials file here
String credentialsPath = "..."; 
// The credentials could be loaded as well as this.getClass().getResourceAsStream(), for example
GoogleCredentials credentials = GoogleCredentials.fromStream(new FileInputStream(credentialsPath))
    .createScoped(Lists.newArrayList("https://www.googleapis.com/auth/cloud-platform"));

// Use that credentials to build your image annotation client
ImageAnnotatorSettings imageAnnotatorSettings =
  ImageAnnotatorSettings.newBuilder()
    .setCredentialsProvider(FixedCredentialsProvider.create(credentials))
    .build()
;

ImageAnnotatorClient imageAnnotatorClient = ImageAnnotatorClient.create(imageAnnotatorSettings);
// Perform the stuff you need to...

你需要在你提供的唯一依赖pom.xml这样

<dependency>
    <groupId>com.google.cloud</groupId>
    <artifactId>google-cloud-vision</artifactId>
    <version>2.0.18</version>
</dependency>

在任何情况下,请考虑参考pom.xmlCloud Vision 示例中提供的内容。

Cloud Vision 示例存盘库还在Detect类中为检测程序本身提供了一些有用的代码片段

确保您用于连接到 GCP 的服务账号具有必要的权限。

尽管此解决方案可以作业,但它的缺点是您可能需要将凭证档案存盘在您的机器中的某个位置,可能在您的源代码存盘库等中,并且它可能会带来安全风险。如果您从 Google Cloud 运行程序,则始终建议您向正在使用必要权限的虚拟机或服务授予权限并使用默认应用程序凭据。

的使用GOOGLE_APPLICATION_CREDENTIALS也可能是更可取的。如果你正在使用这个变量尝试,最初,请尝试使用您的IDE提供的机制,而不是配置cmdPS或者bash,看看它是否作业。

要使用最后提到的两个解决方案中的任何一个,您在构建时不需要提供任何其他信息ImageAnnotatorClient

ImageAnnotatorClient imageAnnotatorClient = ImageAnnotatorClient.create();

uj5u.com热心网友回复:

你的方法是正确的。

要验证代码,您应该使用服务账户。

Google 提供了一种有用的机制,称为应用程序默认凭据 (ADC)。请参阅自动查找凭据当您使用 ADC 时,Google 的 SDK 使用预定义的机制来尝试作为服务账户进行身份验证:

  1. 检查GOOGLE_APPLICATION_CREDENTIALS您的环境。正如你所尝试的;
  2. 在 GCP 服务(例如 Compute Engine)上运行时,通过查找服务的(服务账户)凭据。使用 Compute Engine,这是通过检查所谓的元资料服务来完成的。

对于#1,您可以使用GOOGLE_APPLICATION_CREDENTIALS在行程的环境,当你出现在你的代码是想你可以手动加载该档案。

都说:

  1. 我看不到GoogleCredentials您的代码在哪里汇入?
  2. 您是否为服务账户授予了合适的角色(权限),以便它可以访问它需要的任何其他 GCP 服务?

应该能够使用此List objects示例。

上面的链接,自动查找凭据,显示显示以创建服务账户,为其分配角色和export它。

您可能希望从(用于开发!)开始(roles/storage.objectAdmin请参阅Cloud Storage 的 IAM 角色)并在部署之前进行优化。

标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *