0

我正在尝试设置端点 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, ...},如果我user_id在 +API 中使用:

GET https://www.googleapis.com/plus/v1/people/__ID__

我可以获得所需的其余数据(名称、图像等)。

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

编辑:

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

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

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

4

1 回答 1

0

为什么我收到BadRequest响应?

问题BadRequest是我没有发送授权令牌...我确实尝试将其发送为,但像+api 文档access_token这样的接缝已经过时 - 它应该是. 当我包含此参数时,问题已解决: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)

对我有用的代码在这里

注意: WEB_CLIENT_IDhttps://console.developers.google.com/apis/credentials获得(Web 应用程序类型的 OAuth2 客户端 ID)在这种情况下将不起作用我不得不使用SERVICE_ACCOUNT- 我没有尝试通过控制台生成一个,我从 App Engine 获得的默认服务帐户工作正常。

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

于 2016-01-24T12:48:47.597 回答