我假設我在寫作之前已經用谷歌搜索并閱讀了檔案,我注意到這也是 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,因為有些評論說這樣做是為了解決問題。
我能做什么?我做錯了什么?
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提供的機制,而不是配置cmd,PS或者bash,看看它是否作業。
要使用最后提到的兩個解決方案中的任何一個,您在構建時不需要提供任何其他資訊ImageAnnotatorClient:
ImageAnnotatorClient imageAnnotatorClient = ImageAnnotatorClient.create();
uj5u.com熱心網友回復:
你的方法是正確的。
要驗證代碼,您應該使用服務帳戶。
Google 提供了一種有用的機制,稱為應用程式默認憑據 (ADC)。請參閱自動查找憑據。當您使用 ADC 時,Google 的 SDK 使用預定義的機制來嘗試作為服務帳戶進行身份驗證:
- 檢查
GOOGLE_APPLICATION_CREDENTIALS您的環境。正如你所嘗試的; - 在 GCP 服務(例如 Compute Engine)上運行時,通過查找服務的(服務帳戶)憑據。使用 Compute Engine,這是通過檢查所謂的元資料服務來完成的。
對于#1,您可以使用GOOGLE_APPLICATION_CREDENTIALS在行程的環境,或當你出現在你的代碼是想你可以手動加載該檔案。
都說:
- 我看不到
GoogleCredentials您的代碼在哪里匯入? - 您是否為服務帳戶授予了合適的角色(權限),以便它可以訪問它需要的任何其他 GCP 服務?
您應該能夠使用此List objects示例。
上面的鏈接,自動查找憑據,顯示顯示以創建服務帳戶,為其分配角色和export它。
您可能希望從(用于開發!)開始(roles/storage.objectAdmin請參閱Cloud Storage 的 IAM 角色)并在部署之前進行優化。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/407758.html
標籤:
上一篇:While-Loop不檢查完整的條件(第一部分被跳過)
下一篇:如何為樹創建遞回添加方法
