我正在尝试设置端点api(使用谷歌应用引擎,python),但我在获取用户个人资料信息时遇到了一些麻烦。 API正在运行,我可以通过我的localhost上的API Explorer创建实体。
我的目标是允许用户只提供一封电子邮件注册我的应用,并授权该应用从其个人资料中重置信息。我有这个端点方法:
@User.method(http_method="POST",
auth_level=endpoints.AUTH_LEVEL.REQUIRED,
allowed_client_ids=[
endpoints.API_EXPLORER_CLIENT_ID
],
scopes=[
'https://www.googleapis.com/auth/userinfo.email',
'https://www.googleapis.com/auth/userinfo.profile',
'https://www.googleapis.com/auth/plus.me',
],
user_required=True,
request_fields=('email',),
response_fields=('id',),
name="register",
path="users")
def UserRegister(self, instance):
logging.info(os.getenv( 'HTTP_AUTHORIZATION' ))
# 'Beared __TOKEN__'
logging.info(endpoints.users_id_token._get_token(None))
# '__TOKEN__'
instance.put()
return instance
这很好用,我收到授权令牌,用户在数据存储区中创建,但我无法弄清楚如何获取配置文件信息。如果我在OAuth2 API中输入令牌(通过API Explorer):
POST https://www.googleapis.com/oauth2/v2/tokeninfo?access_token=__TOKEN__
我获取了一些我需要{ "user_id": "__ID__", "verified_email": true, ...}
的数据的令牌信息,如果我在+ API中使用user_id
:
GET https://www.googleapis.com/plus/v1/people/__ID__
我可以获得我需要的其他数据(名称,图像等)。
在我的 < / p>
UserRegister()
方法中,我需要做些什么?我更愿意只返回实体ID并异步进行其余的注册,但这是另一个问题,我会弄清楚(;只需要一些指导如何从我的代码中调用其他端点......
我已经设法弄清楚如何调用其他API(code on Gist),现在只有一个Plus API问题:
我做了一些查询,最终得到了 匿名配额错误 。然后我添加了key
参数并将其设置为WEB_CLIENT_ID
或SERVICE_ACCOUNT
:
WEB_CLIENT_ID
是来自console.developers.google.com/apis/credentials,SERVICE_ACCOUNT
是默认的App Engine服务帐户 - MY_APP@appspot.gserviceaccount.com ... 现在我收到了以下错误:
HttpError: <HttpError 400 when requesting https://www.googleapis.com/plus/v1/people/__VALID_USER_ID__?key=__WEB_CLIENT_ID__or__SERVICE_ACCOUNT__&alt=json returned "Bad Request">
当我使用+API explorer时,我得到了预期的结果:
REQUEST:
https://www.googleapis.com/plus/v1/people/__VALID_USER_ID__?key={YOUR_API_KEY}
RESPONSE:
200 OK + json data for user...
答案 0 :(得分:0)
BadRequest
的问题在于我没有发送授权令牌...我确实尝试将其发送为access_token
,但+api docs之类的接缝已过时 - 它应该是oauth_token
。当我包含此参数时,问题已得到解决:
build('plus', 'v1').people().get(userId=user_id, key=SERVICE_ACCOUNT, oauth_token=token).execute()
提示:使用http://localhost:8001/_ah/api/discovery/v1/apis/和discoveryRestUrl
属性,您必须查看API的真实属性 - 这是我找到答案的地方
oauth_token
可以像这样获得:
token = os.getenv('HTTP_AUTHORIZATION').split(" ")[1]
# or like in my question:
token = endpoints.users_id_token._get_token(None)
我建议HTTP_AUTHORIZATION
变量,因为users_id_token
文档声明它是:
用于从id_token读取用户信息的实用程序库。
这是一个可以暂时用于提取的实验库 来自id_token的用户。此库提供的功能 将在未来的其他地方提供。
这也是我第一个问题的答案:
from googleapiclient.discovery import build
service = build('plus', 'v1')
request = service.people().get(userId=user_id, key=SERVICE_ACCOUNT, oauth_token=token)
response = request.execute()
data = dict(self.response.POST)
对我有用的代码是here。
注意:从https://console.developers.google.com/apis/credentials(Web应用程序类型的OAuth2客户端ID)获取的 WEB_CLIENT_ID
将 不 工作在这种情况下。我不得不使用SERVICE_ACCOUNT
- 我没有尝试通过控制台生成一个,我从App Engine获得的默认服务帐户工作正常。
......现在我的工作变得更加清晰了。希望它会帮助别人(;