簡體   English   中英

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

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

我目前正在使用 endpoints-proto-datastore 庫構建 Google Cloud Endpoints 后端,並且在您請求用戶時遇到需要 apikey 的問題。 用戶登錄后,他們會收到一個 APIkey,他們將其發回用於連續放置(有效),但是我如何在 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 ”示例添加了參數。 對於某些背景,“simple_get”示例中的文檔提到“id”是 EndpointsModel 自動定義的五個特殊幫助器屬性之一,用於通過 id 檢索等常見操作。 這就是為什么您的代碼無需您對 'id' 參數進行任何“特殊”操作即可自動運行的原因。 如果您嘗試獲取該實體,該示例仍會檢查該實體是否存在:

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

由於您的“apiKey”字段沒有特殊的輔助屬性,因此您需要在方法中添加自己的代碼以檢查密鑰是否有效,如果無效則返回 401 或適當的錯誤。 另一種選擇是根據“ basic_with_auth ”示例,還使用一些 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()

user_model 將存儲 userId 和 apiToken,因此我使用密鑰從 ndb 中提取“真實”數據並檢查 user_model 是否具有正確的令牌,如果正確則返回模型,如果不正確,我拒絕

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM