Google应用程序引擎-端点API-使用另一个应用程序引擎应用程序-python

Google应用程序引擎-端点API-使用另一个应用程序引擎应用程序-python,python,google-app-engine,oauth-2.0,google-cloud-endpoints,oauth2client,Python,Google App Engine,Oauth 2.0,Google Cloud Endpoints,Oauth2client,我试图在第二个类似的应用程序引擎应用程序中执行一个由我编写的使用端点的应用程序引擎应用程序(python)提供的函数 我目前在appspot上运行的两个应用程序引擎应用程序都使用oauth2的端点。我有一个工作的javascript客户端,它使用端点,通过授权和身份验证执行函数。因此,我知道后端应用程序引擎服务器正在工作,并且是一个正确公开的端点。我还可以使用API资源管理器和发现服务浏览API 由于这是一个服务器到服务器的链接,我认为服务帐户是我想要用于oauth2身份验证的。因此,我在应用程

我试图在第二个类似的应用程序引擎应用程序中执行一个由我编写的使用端点的应用程序引擎应用程序(python)提供的函数

我目前在appspot上运行的两个应用程序引擎应用程序都使用oauth2的端点。我有一个工作的javascript客户端,它使用端点,通过授权和身份验证执行函数。因此,我知道后端应用程序引擎服务器正在工作,并且是一个正确公开的端点。我还可以使用API资源管理器和发现服务浏览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\u grant

我尝试过许多其他的方法,在凭证中添加developerKey或discoveryUrl参数,但仍然无效。 我观察了其他看到这个错误的人,他们试图弄乱时钟,尽管这是一个服务器到服务器的调用,所以我认为这不是问题所在。 我已将呼叫者的服务帐户电子邮件地址添加到被呼叫者应用程序的权限中

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

是否有人能够使用oauth2在一个应用程序引擎应用程序和另一个应用程序引擎应用程序上调用端点api函数

提前感谢,,
-mat

我已经能够在应用到应用的场景中使用服务帐户来实现这一点,就像您所描述的那样。我已经有一段时间没有接触到这段代码了,但很快将您的代码与我的代码进行比较,我发现两个不同点是:

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

我正在调用的端点服务还指定了
允许的\u客户端\u ID
,以限制对已知客户端列表的访问,其中一个是我为与这些端点对话而设置的服务帐户

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

----编辑----

根据下面的请求添加示例代码

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

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)
这是带有
allowed\u client\u id
参数的服务声明,该参数指定了我的google api项目(id:1234567890)


希望这能有所帮助。

我已经能够在应用到应用的场景中使用服务帐户来实现这一点,正如您所描述的。我已经有一段时间没有接触到这段代码了,但很快将您的代码与我的代码进行比较,我发现两个不同点是:

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

我正在调用的端点服务还指定了
允许的\u客户端\u ID
,以限制对已知客户端列表的访问,其中一个是我为与这些端点对话而设置的服务帐户

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

----编辑----

根据下面的请求添加示例代码

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

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)
这是带有
allowed\u client\u id
参数的服务声明,该参数指定了我的google api项目(id:1234567890)


希望这能有所帮助。

您正处于未知领域。目前存在的端点是为客户端由用户操作的clientserver通信而设计的。你有过这样的运气吗?我现在正试图做同样的事情,但只是从本地计算机上运行的python脚本开始。让我的API请求授权真的很困难。你处在一个未知的领域。目前存在的端点是为客户端由用户操作的clientserver通信而设计的。你有过这样的运气吗?我现在正试图做同样的事情,但只是从本地计算机上运行的python脚本开始。我的API请求很难得到授权。嘿,Brian,你有什么示例代码或要点可以分享吗?我一直在拼命想让这一切顺利进行。嘿,泰德卡普,我用客户呼叫代码和服务声明的代码示例更新了我的答案……让我知道这是否有效,或者你是否需要任何澄清。布莱恩·韦勒,你是我本周的英雄。说真的,非常感谢你。这就是我所需要的。我终于成功了!缺少的项目id是将build()方法与自定义api一起使用的关键。没问题……很高兴我能提供帮助。:-)嘿,布莱恩,你有什么可以分享的示例代码或要点吗?我一直在拼命想让这一切顺利进行。嘿,泰德卡普,我用客户呼叫代码和服务声明的代码示例更新了我的答案……让我知道这是否有效,或者你是否需要任何澄清。布莱恩·韦勒,你是我本周的英雄。说真的,非常感谢你。