python-3.x Google云平台认证:尽管使用服务帐户,但仍被识别为最终用户身份

u1ehiz5o  于 2023-03-31  发布在  Python
关注(0)|答案(2)|浏览(96)

有人能帮忙吗?这个真的快把我逼疯了...谢谢!
我尝试使用谷歌云平台API语音到文本。
工具:WINDOWS 10 && GCP &&Python(Pycharm IDE)
1.我已经为我的speech-to-test项目创建了一个服务帐户作为所有者,并在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中消失,但如果再次添加,则会显示在env列表中。
1.我已经在GCP控制台中启用了谷歌存储API和谷歌语音转文本API。
1.我试过通过python显式显示凭证方法,同样的问题。
1.我已经安装了google cloud SDK shell,并通过使用command初始化来登录我的帐户。
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))

----运行上述代码时,预期会收到“200 OK”和转录文本(来自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_requests”和限制“DefaultRequestsPerMinutePerProject”的配额已超过,该服务属于消费者“project_number:764086051850”的speech.googleapis.com。

另一件怪事:错误信息显示“project_number:764086051850”,这与我在GCP上的语音转文本project_number不同(我区分项目编号和项目ID),错误信息中显示的project_number在每次代码运行时也会发生变化。似乎我发送了错误项目的云需求?

1.我的GOOGLE_APPLICATION_CREDENTIALS系统环境变量在我下次重启笔记本电脑后消失了。重新添加后,它会出现在env列表中,但再次重启后无法存储。
如果有人能帮上忙,我很感激,谢谢!

lymnna71

lymnna711#

尝试这样做:

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

运行您的脚本,看看它是否更好。
否则,尝试在微型虚拟机上做同样的事情,以验证您的代码、服务帐户和环境(并验证只有Windows存在问题)
对于Windows的问题,我在ChromeBook,我不能测试和帮助你在这.然而,我检查了关于EnvVar在互联网上,这更新注册表.检查你是否没有保护注册表更新的东西(防病毒,....)

9fkzdhlc

9fkzdhlc2#

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
IAM成员ID显示为ACCOUNT,带星号的是CLI和任何未指定凭据的应用程序使用的帐户。
要了解更多关于ADC的信息,请阅读我写的这篇文章:
Google Cloud Application Default Credentials
google.API_core.exceptions.ResourceExhausted:429配额度量“speech.googleapis.com_requests”和限制“DefaultRequestsPerMinutePerProject”的配额已超过,该服务属于消费者“project_number:764086051850”的speech.googleapis.com。
云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和服务帐户)。

相关问题