Python 2.7 如何在请求中要求api令牌字段?

Python 2.7 如何在请求中要求api令牌字段?,python-2.7,google-app-engine,google-cloud-endpoints,endpoints-proto-datastore,Python 2.7,Google App Engine,Google Cloud Endpoints,Endpoints Proto Datastore,我目前正在使用Endpoints原型数据存储库构建一个Google Cloud Endpoints后端,当您请求用户时,我遇到了需要apikey的麻烦。 一旦用户登录,他们会收到一个APIkey,并将其发送回以进行连续的PUT(这是有效的),但是如何在GET上要求用户名/电子邮件和APIkey?当前,如果用户执行以下操作: @User.method(request_fields=('id', 'apiToken',), path='users', http_method='GET', name=

我目前正在使用Endpoints原型数据存储库构建一个Google Cloud Endpoints后端,当您请求用户时,我遇到了需要apikey的麻烦。 一旦用户登录,他们会收到一个APIkey,并将其发送回以进行连续的PUT(这是有效的),但是如何在GET上要求用户名/电子邮件和APIkey?当前,如果用户执行以下操作:

@User.method(request_fields=('id', 'apiToken',), path='users', http_method='GET', name='user.get')
def user_get(self, query):
    return query
用户被从数据存储中拉出来,因为ID是正确的,并且它完全忽略了apiToken。如何要求这两个字段?
(另一方面,如何在请求时发回用户ID?

如果您正在实现自己的API密钥方案,正如代码所示,那么您需要手动检查API密钥是否有效

您的示例与“”示例中的示例类似,并且您已根据“”示例添加了参数。在某些背景下,“simple_get”示例中的文档提到,“id”是EndpointsModel为常见操作(如按id检索)自动定义的五个特殊帮助器属性之一。这就是为什么代码可以自动工作,而无需对“id”参数做任何“特殊”操作。如果您尝试获取该实体,该示例仍会检查该实体是否存在:

if not my_model.from_datastore:
      raise endpoints.NotFoundException('MyModel not found.')
由于“apiKey”字段没有特殊的helper属性,因此需要在方法中添加自己的代码来检查该键是否有效,如果无效,则返回401或适当的错误。另一个选项是,根据“”示例,还可以利用一些Google内置的身份验证


最后,由于endpoints proto datastore只是主要端点库的语法糖,因此您需要阅读关于它的更多信息,如如何从端点方法返回值。

我发现的最简单的方法是:

   @User.method(request_fields=('id', 'apiToken',), path='users', http_method='GET', name='user.get')
def user_get(self, user_model):
    user = ndb.Key('User', int(user_model.id)).get()
    if user.apiToken != user_model.apiToken:
        raise endpoints.UnauthorizedException('You are not authorized to view this data')
    return user.clean()

用户模型将存储用户ID和apiToken,因此我使用密钥从ndb中提取“真实”数据,检查用户模型是否具有正确的令牌,如果没有,则返回模型。如果没有,我拒绝

我现在不知道如何访问apiToken(从请求中)以与模型的令牌进行比较。如何读取请求信息?我可能完全错了,但例如,update,由endpoints proto创建的用户是数据存储中用户的副本,因此我可以将其与保存的用户进行比较。