【发布时间】:2016-01-24 02:16:40
【问题描述】:
我正在尝试设置端点 api(使用谷歌应用引擎、python),但在获取用户个人资料信息时遇到了一些问题。 API 正在运行,我可以通过本地主机上的 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__
我可以获得所需的其余数据(姓名、图片等)。
我需要做什么才能在我的
UserRegister() 方法中实现这一点?我宁愿只返回实体 ID 并异步完成其余的注册,但这是另一个问题,我会弄清楚(;只需要一些指导如何从我的代码中调用其他端点......
编辑:
我已经弄清楚如何调用其他 API (code on Gist),现在 Plus API 有一个问题:
我做了一些查询,最终得到匿名配额错误。然后我添加了key参数并将其设置为WEB_CLIENT_ID或SERVICE_ACCOUNT:
-
WEB_CLIENT_ID是来自 console.developers.google.com/apis/credentials 的 OAuth2 客户端 ID(类型:Web 应用程序), -
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...
有人知道为什么会这样吗?
【问题讨论】:
-
请从您的问题标题中删除“已解决”文本。这是完全没有必要的。接受答案 - 您可以接受自己的答案 - 每个人都会看到该问题有一个可接受的解决方案。
标签: python google-app-engine google-plus google-cloud-endpoints endpoints-proto-datastore