使用Cloud Endpoints获取用户信息(使用其他API端点)

时间:2016-01-24 02:16:41

标签: python google-app-engine google-plus google-cloud-endpoints endpoints-proto-datastore

我正在尝试设置端点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__

我可以获得我需要的其他数据(名称,图像等)。

在我的UserRegister()方法中,我需要做些什么?我更愿意只返回实体ID并异步进行其余的注册,但这是另一个问题,我会弄清楚(;只需要一些指导如何从我的代码中调用其他端点...... < / p>

修改

我已经设法弄清楚如何调用其他API(code on Gist),现在只有一个Plus API问题:

我做了一些查询,最终得到了 匿名配额错误 。然后我添加了key参数并将其设置为WEB_CLIENT_IDSERVICE_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...

任何人都知道为什么会这样?

1 个答案:

答案 0 :(得分:0)

为什么我会收到 BadRequest 回复?

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的用户。此库提供的功能   将在未来的其他地方提供。

如何调用其他API端点?

这也是我第一个问题的答案:

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获得的默认服务帐户工作正常。

......现在我的工作变得更加清晰了。希望它会帮助别人(;