我在python中使用谷歌API有一个非常奇怪的例外。目标是在服务器端检查与来自Android应用程序的应用内订阅相对应的令牌的有效性。
为此,我们在Google Play帐户中附加了一个服务帐户,我们尝试使用oauth通过p12密钥验证我们的请求(转换为pem证书以删除密码短语):
from apiclient.discovery import build
from httplib2 import Http
from oauth2client.client import SignedJwtAssertionCredentials
with open("googleplay.pem") as f:
private_key = f.read()
credentials = SignedJwtAssertionCredentials(GOOGLE_CLIENT_EMAIL, private_key, scope=['https://www.googleapis.com/auth/androidpublisher'])
http_auth = credentials.authorize(Http())
client = build('androidpublisher', 'v2', http=http_auth)
这在我的电脑上完美运行。但是最后一行在我的服务器上触发了一个异常:invalid_grant
我不明白这可能来自哪里!如果你可以帮助我们,那我们就太棒了!
我用来将p12证书转换为pem证书的其他代码:
openssl pkcs12 -in privatekey.p12 -nodes -nocerts > privatekey.pem
然后我删除了前4行。
提前致谢!
答案 0 :(得分:1)
答案 1 :(得分:0)
不确定这是否有助于提供任何线索。
我最近修复了类似错误消息的问题(也包含“invalid_grant”)。我的情况是由于OAuth2凭据中缺少refresh_token值导致凭据刷新失败。所以我的修复是从谷歌获得新的刷新令牌。事实证明谷歌只在用户第一次使用谷歌授权时分发刷新。除非用户断开应用程序并重新授权。或者在应用程序中,flow.params['approval_prompt'] = 'force'
已设置(通常用于本地调试)。
我的案例是关于Web应用程序和OAuth2授权的凭据。你看起来像一个服务帐户,所以我不确定你的问题是否也是一个刷新问题。