簡體   English   中英

無法驗證服務帳號 - Google Cloud

[英]Unable to authenticate service account - Google Cloud

我假設我在寫作之前已經用谷歌搜索並閱讀了文檔,我注意到這也是 StackOverflow 上的一個熱門討論,但是已經給出的答案都沒有幫助我。

我創建了一個 Google Cloud 帳戶來使用 API:Google Vision。

為此,我按照創建項目的步驟操作,添加上面的 API,最后創建一個帶有密鑰的服務帳戶。

我下載了密鑰並將其放在PC上java項目的文件夾中。

然后,由於它是一個 maven 項目,我按照教程中的描述將依賴項添加到 pom 中。

此時我插入了建議的代碼段,開始使用 API。

一切似乎都很好,一切都被閱讀了,各種庫/接口都被導入了。

但是當我嘗試運行程序時出現了一個錯誤:

應用程序默認憑據不可用。 如果在 Google Compute Engine 中運行,它們就可用。 否則,必須定義環境變量 GOOGLE_APPLICATION_CREDENTIALS 指向定義憑據的文件。

我必須承認我不知道“Google Compute Engine”是什么,但既然有替代方案並且我有一些憑據,我想嘗試並遵循它。

所以我按照說明進行操作:

創建服務帳戶后,您需要將服務帳戶密鑰下載到運行應用程序的計算機上。 您可以使用 GOOGLE_APPLICATION_CREDENTIALS 環境變量或編寫代碼將服務帳戶密鑰傳遞給客戶端庫。

好的,我嘗試了第一種方法,通過環境變量傳遞憑據:

  • 使用 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,因為有些評論說這樣做是為了解決問題。

我能做些什么? 我做錯了什么?

你的方法是正確的。

要驗證代碼,您應該使用服務帳戶。

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 角色)並在部署之前進行優化。

請考慮閱讀ImageAnnotationClient class 級別的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>

在任何情況下,請考慮參考 Cloud Vision 示例中提供的pom.xml

Cloud Vision 示例存儲庫還在Detect class 中為檢測過程本身提供了一些有用的代碼片段。

確保您用於連接到 GCP 的服務帳號具有必要的權限。

盡管此解決方案可以工作,但它的缺點是您可能需要將憑證文件存儲在您的機器中的某個位置,可能在您的源代碼存儲庫等中,並且它可能存在安全風險。 如果您從 Google Cloud 運行您的程序,始終建議向您正在使用必要權限的虛擬機或服務授予權限並使用默認應用程序憑據。

使用GOOGLE_APPLICATION_CREDENTIALS也可能更可取。 如果您嘗試使用此變量,請首先嘗試使用 IDE 提供的機制而不是cmdPSbash來配置它,看看它是否有效。

要使用最后提到的兩個解決方案中的任何一個,您在構建ImageAnnotatorClient時無需提供任何其他信息:

ImageAnnotatorClient imageAnnotatorClient = ImageAnnotatorClient.create();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM