如何在请求中要求 api-token 字段?

How can I require an api-token field on requests?

我目前正在使用 endpoints-proto-datastore 库构建 Google Cloud Endpoints 后端,并且 运行 在请求用户时遇到需要 apikey 的麻烦。 用户登录后,他们会收到一个 APIkey,他们会发回该 APIkey 以进行连续的放置(有效)但是我如何在 GET 上要求 username/email 和 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 密钥是否有效。

您的示例与“basic' example, and you've added parameters as per the 'simple_get”示例中的示例相似。对于某些背景,'simple_get' 示例中的文档提到 'id' 是 EndpointsModel 自动定义的五个特殊辅助属性之一,用于通过 id 检索等常见操作。这就是为什么您的代码无需对 'id' 参数执行任何操作 'special' 即可自动运行的原因。如果您尝试获取该实体,该示例仍会检查该实体是否存在:

if not my_model.from_datastore:
      raise endpoints.NotFoundException('MyModel not found.')

由于您的 'apiKey' 字段没有特殊的助手 属性,您需要在方法中添加自己的代码来检查密钥是否有效以及 return 401 或如果不是,则为合适的错误。另一种选择是根据“basic_with_auth”示例也使用 Google 的一些内置身份验证。

最后,由于 endpoints-proto-datastore 只是主要端点库的语法糖,您需要阅读 full documentation 以获取更多信息,例如如何 return来自端点方法的值。

我发现最简单的方法是:

   @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()

user_model 将存储 userId 和 apiToken,因此我使用密钥从 ndb 中提取 "real" 数据并检查 user_model 是否具有正确的令牌和return模型是否正确,如果不正确,我拒绝