Google 翻译 API V3:如何从文件流中验证服务帐户

Google translate API V3: How to authenticate service account from file stream

使用 Google Translate V3 API 验证服务帐户的默认方式是通过环境变量。这个名为 GOOGLE_APPLICATION_CREDENTIALS 的环境变量指向带有凭据的 json 文件,如下所述: https://cloud.google.com/docs/authentication/production

但是,在不同位置使用文件时如何使用所需的凭据?正如 google 文档中所述,我可以从 FileStream 创建凭证对象。但是,使用此凭据对象仅记录在 google 云存储中。 TranslateTextRequest 的生成器不接受此类凭据对象。 https://googleapis.dev/dotnet/Google.Cloud.Translate.V3/2.0.0/api/Google.Cloud.Translate.V3.TranslateTextRequest.html

唯一的解决方法是将文件复制到环境变量中指定的位置,但这看起来很奇怪,并且在未设置该变量时会失败。

所以,我终于解决了这个问题。

@JohnHanley 不幸的是,class TranslationServiceClientBuilder 在我的环境中不可用。也许它是特定于 DotNet 的。然而,这个提示还是很有用的,因为我发现了另一个创建 TranslationServiceSettings 实例的 Builder,它又拥有一个静态工厂方法,它又可以用来实例化一个 TranslationServiceClient

以下是关于如何从 Google JSON 凭据文件的文件路径创建 TranslationServiceClient 的完整解决方案。

TranslationServiceSettings settings = TranslationServiceSettings.newBuilder()
    .setCredentialsProvider(new CredentialsProvider() {
    @Override
    public Credentials getCredentials() throws IOException {
        GoogleCredentials credentials = GoogleCredentials.fromStream(new FileInputStream(credentialsFileAbsPath))
        .createScoped(Collections.singletonList("https://www.googleapis.com/auth/cloud-platform"));

        return credentials;
        }
    }).build();

TranslationServiceClient translationServiceClient = TranslationServiceClient.create(settings);

当然,匿名 class 也可以用 Lambda 表达式代替。

@Pjotr​​S 很抱歉造成混淆。我指的是 JSON 凭据文件,而不是要翻译的文件。