我有一个定期工作,可以使用远程api从我的appengine数据存储中提取数据。
这项工作突然停止了工作,因为Google决定不再喜欢我的服务器。
不过,它可以在我的机器上运行。
这是在我的机器上的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:
当我转到上面的URL时,会看到一个错误页面,上面显示:
那是一个错误。
错误:invalid_client
找不到OAuth客户端。
索取详细资料
access_type =离线
scope = https://www.googleapis.com/auth/appengine.apis https://www.googleapis.com/auth/userinfo.email
response_type =代码
redirect_uri = urn:ietf:wg:oauth:2.0:oob
client_id =无
我们知道的就这些。
救命?
----更新(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": "[email protected]",
"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的开发者控制台在“凭据/服务帐户密钥/管理服务帐户”下生成的
最佳答案
因此,我刚刚测试了这个特殊的用例,并且客户端ID为none
的事实揭示了很多。ConfigureRemoteApiForOAuth
接受将服务帐户与密钥文件一起使用,并提供oauth2参数作为appengine_rpc_httplib2.HttpRpcServerOAuth2.OAuth2Parameters
对象,您可以在其中指定client id
,secret
,scope
等。OAuth2Parameters Doc
但是,减轻这种情况的最简单方法是使用gcloud tool来正确认证您的服务器:
gcloud auth login
关于python - 用于Appengine的OAuth2身份验证停止工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37148733/