【问题标题】:Getting user info with Cloud Endpoints (using other API Endpoints)使用 Cloud Endpoints 获取用户信息(使用其他 API Endpoints)
【发布时间】: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_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...

有人知道为什么会这样吗?

【问题讨论】:

  • 请从您的问题标题中删除“已解决”文本。这是完全没有必要的。接受答案 - 您可以接受自己的答案 - 每个人都会看到该问题有一个可接受的解决方案。

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


【解决方案1】:

为什么我会收到 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 Endpoints?

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

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

...现在我得到了这个工作,事情变得更加清晰了。希望它会帮助别人(;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-07
    • 2012-07-27
    • 2020-11-27
    • 1970-01-01
    • 2015-11-09
    相关资源
    最近更新 更多