gpt4 book ai didi

python - Google App Engine - Endpoints API - 从另一个 App Engine 应用程序消费 -python

转载 作者:行者123 更新时间:2023-11-28 22:51:18 24 4
gpt4 key购买 nike

我正在尝试在另一个类似的应用引擎应用程序中执行我编写的一个应用引擎应用程序(python)提供的使用端点的功能。

我目前有两个应用程序引擎应用程序都在 appspot 上运行,它们使用带有 oauth2 的端点。我有一个使用端点的工作 javascript 客户端,通过授权和身份验证执行功能。所以我知道后端应用程序引擎服务器正在运行并且是一个正确公开的端点。我还可以使用 api explorer 和发现服务浏览 API。

由于这是一个服务器到服务器的链接,我认为服务帐户是我想要用于 oauth2 身份验证的。因此,我在应用引擎控制台的客户端应用程序中创建了服务帐户。

这是在调用者上运行的代码:

f = file('key2.pem', 'rb')
key = f.read()
f.close()

credentials = SignedJwtAssertionCredentials(
'my-service-account-email-from-caller-app@developer.gserviceaccount.com',
key,
scope='https://my-app-id.appspot.com/_ah/api/my-api/v1')
http = credentials.authorize(httplib2.Http())
service = build("my-api", "v1", http=http)

当我运行此代码时,出现错误:AccessTokenRefreshError: invalid_grant

我已经尝试了很多其他的东西,将 developerKey 或 discoveryUrl 参数添加到凭据,仍然无效授权。我查看了其他看到此错误并尝试弄乱时钟的人,尽管这是服务器到服务器的调用,所以我认为这不是问题所在。我已将调用者的服务帐户电子邮件地址添加到被调用者应用的权限中。

我没有找到关于使用服务帐户调用自定义端点 API 的示例应用程序或帖子,只能调用 Google API,例如 Youtube 或 Plus,其中大多数都有注册调用应用程序引擎应用程序的方法。

有没有人能够使用 oauth2 在一个应用程序引擎应用程序上调用另一个应用程序引擎应用程序的端点 api 函数?

提前致谢,-垫

最佳答案

我已经能够在您描述的应用到应用场景中使用服务帐户来实现此功能。我已经有一段时间没有接触这段代码了,但很快将你的代码与我的代码进行比较,我看到的两个区别是:

范围:

我正在为 SignedJwtAssertionCredentials 类的范围传入 https://www.googleapis.com/auth/userinfo.email。鉴于您看到的错误消息,这可能是原因。基于 this documentation,我相信电子邮件范围是最低要求。

我正在调用的端点服务也指定了 allowed_client_ids 以限制对已知客户端列表的访问,其中之一是我提供的用于与这些端点通信的服务帐户。

发现服务网址:

我将 discoverServiceUrl 参数传递给 build() 函数。鉴于您的错误消息,这似乎不太可能,但我想我会提到它。

----编辑----

根据以下请求添加示例代码。

对于 id=1234567890 的谷歌控制台项目,这是我用来调用我的服务端点的客户端代码:

from apiclient.discovery import build
from oauth2client.client import SignedJwtAssertionCredentials

service_account_email = '1234567890-aasgqg243rsaggw4@developer.gserviceaccount.com'
key_file_path = os.path.join(config.base_path, 'myservice.pem')

key_file = file(key_file_path, 'rb')
key = key_file.read()
key_file.close()

credential = SignedJwtAssertionCredentials(service_account_email, key, 'https://www.googleapis.com/auth/userinfo.email')
http = credential.authorize(httplib2.Http())

discoveryServiceUrl = 'http://mysite.appspot.com/_ah/api/discovery/v1/apis/{api}/{apiVersion}/rest'
myservice = build('myservice', 'v1', http=http, discoveryServiceUrl=discoveryServiceUrl)

这是带有指定我的 google api 项目 (id: 1234567890) 的 allowed_client_ids 参数的服务声明

@myservice_api.api_class(resource_name='myservice', path='myservice', allowed_client_ids=['1234567890.apps.googleusercontent.com', '1234567890-aasgqg243rsaggw4.apps.googleusercontent.com', endpoints.API_EXPLORER_CLIENT_ID])
class MyService(remote.Service):
...

希望这对您有所帮助。

关于python - Google App Engine - Endpoints API - 从另一个 App Engine 应用程序消费 -python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21675147/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com