簡體   English   中英

AWS API 網關:授權 Cognito 用戶組

[英]AWS API Gateway: Authorize Cognito user groups

我是 API 網關的 AWS 世界的新手,我試圖限制用戶組對我的 API 的訪問。 為了澄清我已經可以運行經過身份驗證的 API,問題在於授權(將一組用戶限制為 API-1,另一組限制為 API-2)。 我正在使用 HTTP-API,但我不想使用其他 API(以節省成本)。

我創建了一個 Cognito 用戶池並創建了兩個名為“常規”和“管理員”的組。 我還設置了一個應用程序客戶端。

用戶池

接下來我有兩條 API 路由,即 map 到兩個不同的 Lambda 函數(只是你好世界)。 這些無需身份驗證即可完美運行,也可以使用身份驗證。 我將 JWT-auth 與 Cognito 一起使用,出於多種原因,這對我的應用程序來說是正確的方法。

API 認證

問題是我如何限制相關用戶組對 API 的訪問。 因此,只有 admin-group 中的用戶才能使用 admin-api。 我相信紅色部分可以提供幫助,但我似乎找不到正確的文檔。 I read that I can also create a lambda function to authorize users, but that seems like a waste, why pay for another lambda function, if the restrictions can be applied here.

授權用戶

將不勝感激任何幫助。

范圍在這里不適合使用。 如果您有不同的應用程序客戶端(實際應用程序使用您的 API 網關)來限制他們可以訪問的端點的 scope,則范圍可以很好地工作。 它們不適用於基於角色的訪問。

正如您所說,您已經使用 Cognito 用戶池並設置了一些用戶組。 一個簡單的方法是使用確認后 Lambda 觸發器 只要確認了新用戶,就會觸發此 Lambda。 例如,當您使用外部身份提供者並且用戶第一次使用 Cognito 托管的 UI 登錄時,它甚至會被觸發。 在最簡單的情況下,您可以通過發布確認 Lambda 將用戶添加到“常規”組。

要對 API 網關路由進行身份驗證和授權,請將 JWT 授權者替換為自定義授權者。 這意味着,您將使用 Lambda function 進行身份驗證和授權。 在 Lambda function 中,您必須驗證 JWT 令牌。 如果 JWT 令牌或請求本身無效,則會拋出異常並顯示“未授權”消息。 API 網關會將其轉換為 401“未授權”響應。 如果 JWT 令牌是有效的,您將其解碼並從中獲取cognito:groups聲明。 您可以解碼您的令牌並查看jwt.io上的聲明以進行測試。 在您的 Lambda function 中,您然后檢查您的用戶是哪些組以及該組是否有權訪問特定路線。 用戶嘗試訪問的路線也是觸發您的 Lambda function 的事件的一部分。

# dummy python code
if route.startswith('/adminuser') and 'admin' in cognito_groups:
   return { 'isAuthorized': True, 'context': { 'custom_key': 'custom_value' } }
# respond with 403 "Forbidden"
return { 'isAuthorized': False }

Lambda 輸入和 output 的有效負載可以在HHTP API Z04A7DA3C5B04CAD85DA1EEBB921文檔中找到。

如需深入了解,請查看“使用 Amazon Cognito、API 網關和 IAM 構建細粒度授權” 要更深入地了解授權選項,我推薦 re:invent 2017 中的這個視頻

應用程序范圍不是要尋找的(它們定義應用程序訪問,而不是用戶訪問)。

這被廣泛稱為基於角色的訪問控制 (RBAC)。 內置授權者不支持它,因此您必須檢查處理程序中的角色/組或選擇自定義授權者。

一個想法是為每個組創建不同的 Cognito 用戶池。 然后在每個池中,定義一個資源服務器並將組名設置為 scope。 這樣,該組在 scope 中可用。 然后,按如下方式制作組合的 Cognito 授權方。

  securitySchemes:
    CognitoAuth:
      type: apiKey
      name: Authorization
      in: header
      x-amazon-apigateway-authtype: cognito_user_pools
      x-amazon-apigateway-authorizer:
        type: cognito_user_pools
        providerARNs:
          - 'arn:aws:cognito-idp:{region}:{account}:userpool/{pool1}'
          - 'arn:aws:cognito-idp:{region}:{account}:userpool/{pool2}'
          - 'arn:aws:cognito-idp:{region}:{account}:userpool/{pool3}'

然后,您可以自由地將組名(作為范圍)放在全局或任何路徑中。

此外,由於使用了不同的池,您將對每個組的策略(例如,自定義屬性、MFA、注冊選項)有更多的控制權。

暫無
暫無

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

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