appengine的OAuth2身份验证停止工作

时间:2016-05-10 20:50:45

标签: python google-app-engine oauth-2.0

我有一个定期工作,使用远程api从我的appengine数据存储区中提取数据。 这项工作突然停止工作,因为谷歌决定不再喜欢我的服务器了。 它可以在我的机器上运行。

这是我机器上的python shell中发生的事情:

$ python
Python 2.7.6 (default, Jun 22 2015, 17:58:13) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from google.appengine.ext.remote_api import remote_api_stub
>>> app = 'qmagicobr2.appspot.com'
>>> remote_api_stub.ConfigureRemoteApiForOAuth(app, '/_ah/remote_api')
<google.appengine.tools.appengine_rpc_httplib2.HttpRpcServerOAuth2 object at 0x7f5cdfac61d0>
>>> 

以下是我服务器上相同代码的情况

(qmbi)dashboard@ip-172-31-32-222:~/qmbi$ python
Python 2.7.6 (default, Jun 22 2015, 17:58:13) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from google.appengine.ext.remote_api import remote_api_stub
>>> app = 'qmagicobr2.appspot.com'
>>> remote_api_stub.ConfigureRemoteApiForOAuth(app, '/_ah/remote_api')
Go to the following link in your browser:

    https://accounts.google.com/o/oauth2/auth?scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fappengine.apis+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&response_type=code&client_id=None&access_type=offline

Enter verification code:

当我转到上面的网址时,我会收到一个错误页面,上面写着:

  
      
  1. 这是一个错误。   错误:invalid_client   找不到OAuth客户端。   请求详情   ACCESS_TYPE =离线   范围= https://www.googleapis.com/auth/appengine.apis https://www.googleapis.com/auth/userinfo.email   RESPONSE_TYPE =代码   REDIRECT_URI =瓮:IETF:WG:OAuth的:2.0:OOB   CLIENT_ID =无   这就是我们所知道的。
  2.   

帮助?

----更新(2016-05-12)-----

我忘了提到我正在使用的身份验证文件。 要使ConfigureRemoteApiForOAuth起作用,我需要有一个指向凭证文件的环境变量GOOGLE_APPLICATION_CREDENTIALS。 我做。 在这两种环境中(我的机器和服务器)GOOGLE_APPLICATION_CREDENTIALS指向一个json文件(两个环境中的同一文件),格式如下:

{
  "type": "service_account",
  "project_id": "qmagicobr2",
  "private_key_id": "000000000000000000000000000000000000000",
  "private_key": "-----BEGIN PRIVATE KEY-----\nAAAAAAAAAAAAAAAAAAAAAAA....AAAA\n-----END PRIVATE KEY-----\n",
  "client_email": "dashboard@qmagicobr2.iam.gserviceaccount.com",
  "client_id": "0000000000000000000000",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://accounts.google.com/o/oauth2/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/dashboard%40qmagicobr2.iam.gserviceaccount.com"
}

此文件是使用Appengine的开发者控制台在“凭据/服务帐户密钥/管理服务帐户”下生成的

1 个答案:

答案 0 :(得分:2)

所以我只测试了这个特定的用例,并且客户端ID为none的事实揭示了很多。

ConfigureRemoteApiForOAuth接受使用带有密钥文件的服务帐户,将oauth2参数作为appengine_rpc_httplib2.HttpRpcServerOAuth2.OAuth2Parameters对象提供,您可以在其中指定client idsecret,{{1}等等OAuth2Parameters Doc

但是,缓解这种情况的最简单方法是使用gcloud tool来正确验证您的服务器:

scope