Google Cloud Platform身份验证:尽管使用了服务帐户,仍被视为最终用户身份验证

时间:2019-09-10 18:33:54

标签: python-3.x google-cloud-platform environment-variables speech-to-text

任何人都可以帮助吗?这真的让我发疯了...谢谢!

我尝试使用Google云平台API语音转文本。

工具:WINDOWS 10 && GCP && Python(Pycharm IDE)

  1. 我已经创建了一个服务帐户,作为我的语音测试项目的所有者,并通过JSON中的GCP控制台生成了密钥,然后设置了环境变量。 我在WIN10 Powershell && CMD上运行的代码:

    $env:GOOGLE_APPLICATION_CREDENTIALS="D:\GCloud speech-to-text\Speech 
    To Text Series-93e03f36bc9d.json"
    
    set GOOGLE_APPLICATION_CREDENTIALS=D:\GCloud speech-to-text\Speech To 
    Text Series-93e03f36bc9d.json
    

    PS:重新启动笔记本电脑后,添加的环境变量在CMD和Powershell中消失,但如果再次添加,则确实显示在环境列表中。

  2. 我已在GCP控制台中启用了Google存储API和Google语音文本API。

  3. 我尝试通过python显式显示凭据方法,同样的问题。

  4. 我已经安装了Google Cloud SDK Shell,并使用命令进行了初始化以登录我的帐户。

PYTHON语音文本代码(来自GCP演示)

import io
import os

# Imports the Google Cloud client library
from google.cloud import speech
from google.cloud.speech import enums
from google.cloud.speech import types

# Instantiates a client
client = speech.SpeechClient()

# The name of the audio file to transcribe
file_name = os.path.join(
    os.path.dirname(__file__),
    'test_cre.m4a')

# Loads the audio into memory
with io.open(file_name, 'rb') as audio_file:
    content = audio_file.read()
    audio = types.RecognitionAudio(content=content)

config = types.RecognitionConfig(
    encoding=enums.RecognitionConfig.AudioEncoding.LINEAR16,
    sample_rate_hertz=16000,
    language_code='en-US')

# Detects speech in the audio file
response = client.recognize(config, audio)

for result in response.results:
    print('Transcript: {}'.format(result.alternatives[0].transcript))

----运行上面的代码时,预计会收到“ 200OK”和转录的文本(GCP文档中的文本api语音演示)

----但是得到了:

  1. D:\ Python \ main program \ lib \ site-packages \ google \ auth_default.py:66:用户警告:您的应用程序已使用来自Google Cloud SDK的最终用户凭据进行了身份验证。我们建议大多数服务器应用程序改为使用服务帐户。如果您的应用程序继续使用Cloud SDK中的最终用户凭据,则可能会收到“超出配额”或“未启用API”错误。有关服务帐户的更多信息,请参见https://cloud.google.com/docs/authentication/ warnings.warn(_CLOUD_SDK_CREDENTIALS_WARNING)

  2. google.api_core.exceptions.ResourceExhausted:超过429配额指标“ speech.googleapis.com/default_requests”的配额,并限制服务“ speech.googleapis.com”的“ DefaultRequestsPerMinutePerProject”为消费者“ project_number:764086051850”

    另一个奇怪的问题 :错误信息显示'project_number:764086051850',与我在GCP上的语音转文本project_number不同(我确实区分了项目编号和项目ID),错误信息中显示的project_number每次代码运行时也会有所不同。看来我发送的是错误的项目的云需求?

  3. 我下次重新启动笔记本电脑后,我的GOOGLE_APPLICATION_CREDENTIALS系统环境变量消失了。再次添加后,它将显示在env列表中,但在重新启动后无法存储。

如果有人可以帮助您,请多谢!

2 个答案:

答案 0 :(得分:0)

尝试这样做:

  • 运行gcloud init->使用您的帐户进行身份验证并选择您的项目
  • 运行gcloud auth activate-service-account <service account email> --key-file=<JSON key file>
  • 运行gcloud config list以验证您的配置。

运行脚本,看看效果是否更好。

否则,请尝试在微型虚拟机上执行相同的操作,以验证您的代码,服务帐户和环境(并验证仅Windows有问题)

对于Windows问题,我在ChromeBook上,无法对此进行测试和提供帮助。但是,我在互联网上检查了有关EnvVar的信息,这将更新注册表。检查您是否没有保护注册表更新的内容(防病毒,...)

答案 1 :(得分:0)

  

D:\ Python \ main program \ lib \ site-packages \ google \ auth_default.py:66:   用户警告:您的应用程序已使用最终用户进行身份验证   来自Google Cloud SDK的凭据。我们建议大多数服务器   应用程序改为使用服务帐户。如果您的申请   继续使用Cloud SDK中的最终用户凭据,您可能   收到“超出配额”或“未启用API”错误。欲了解更多   有关服务帐户的信息,请参阅   https://cloud.google.com/docs/authentication/   warnings.warn(_CLOUD_SDK_CREDENTIALS_WARNING)

此错误表示您的代码未使用服务帐户。您的代码已配置为使用ADC(应用程序默认凭据)。您的代码很可能使用的是由CLI gcloud配置和存储的Google Cloud SDK凭据。

要确定Cloud SDK使用的凭据,请执行以下命令:

gcloud auth list

显示为ACCOUNT且带有星号的IAM成员ID是CLI和未指定凭据的任何应用程序使用的帐户。

要了解有关ADC的更多信息,请阅读我写的这篇文章:

Google Cloud Application Default Credentials

  

google.api_core.exceptions.ResourceExhausted:超出429个配额   配额指标“ speech.googleapis.com/default_requests”和限制   服务的“ DefaultRequestsPerMinutePerProject”   消费者“ project_number:764086051850”的“ speech.googleapis.com”。

Cloud SDK具有默认值的概念。执行gcloud config list。这将显示各种项目。寻找project。此项目很可能没有启用API Cloud Speech-to-Text

  

另一个奇怪的东西:错误信息显示   'project_number:764086051850',与我的不同   GCP上的语音转文本project_number(我确实区分了项目编号   和项目ID),错误信息中还会显示project_number   每次代码运行都会有所不同。好像我在发送云   错误项目的要求?

要查看您的当前凭据可以查看(访问)执行的项目,项目ID和项目编号的列表:

gcloud projects list

此命令将显示给定项目ID的项目编号:

gcloud projects list --filter="REPLACE_WITH_PROJECT_ID" --format="value(PROJECT_NUMBER)"
  

我的GOOGLE_APPLICATION_CREDENTIALS系统环境变量   下次重新启动笔记本电脑后消失。再次添加后,   将显示在env列表中,但在重新启动后无法存储。

在命令提示符中执行此命令时,它仅在命令提示符的生命周期内持续存在:set GOOGLE_APPLICATION_CREDENTIALS=D:\GCloud speech-to-text\Speech To Text Series-93e03f36bc9d.json。当您退出命令提示符,重新启动等时,环境变量将被破坏。

要在Windows上创建持久性环境变量,请编辑系统属性->环境变量。您可以从命令提示符处按以下方式启动此命令:

SystemPropertiesAdvanced.exe

建议让您的生活更轻松:

  • 请勿在服务帐户文件中使用带空格的长路径名。创建一个诸如C:\Config之类的目录,然后将该文件放在文件名中,不要在其中放置空格。
  • 在桌面上进行开发时,请勿使用ADC(应用程序默认凭据)。指定您要使用的实际凭据。

更改此行:

client = speech.SpeechClient()

对此:

client = speech.SpeechClient().from_service_account_json('c:/config/service-account.json')
  • 服务帐户中有一个项目ID。在要使用它们的同一项目中创建服务帐户(直到您充分了解IAM和服务帐户)。