使用者池、身分池與 JWT

AWS Security 開發者實務

Rahul Singh

Technical Product Manager

Cognito 是同名的兩個服務

Amazon Cognito

  • 為你的應用程式使用者提供託管身分
  • 同一名稱,兩個獨立服務

兩個問題位於標示為 Amazon Cognito 的虛線邊界上方。邊界內並排兩個藍色面板:使用者池(你的使用者目錄)與身分池(憑證仲介)。兩面板的連線匯聚到下方的橘色虛線框,指出許多應用程式同時使用兩者。

AWS Security 開發者實務

Cognito 是同名的兩個服務

Amazon Cognito

  • 為你的應用程式使用者提供託管身分
  • 同一名稱,兩個獨立服務

你需要哪一個?

  • 登入與使用者檔案:使用者池
  • 瀏覽器或行動端直接呼叫 AWS:身分池

兩個問題位於標示為 Amazon Cognito 的虛線邊界上方。邊界內並排兩個藍色面板:使用者池(你的使用者目錄)與身分池(憑證仲介)。兩面板的連線匯聚到下方的橘色虛線框,指出許多應用程式同時使用兩者。

AWS Security 開發者實務

使用者池負責登入

託管的使用者目錄

  • 註冊與登入
  • 重設密碼
  • 多因子驗證

縱向流程:應用程式使用者登入使用者池(保存密碼),池回傳一個包含 ID token、access token 與 refresh token 的方塊

AWS Security 開發者實務

使用者池負責登入

託管的使用者目錄

  • 註冊與登入
  • 重設密碼
  • 多因子驗證

 

成功後會有三個權杖

縱向流程:應用程式使用者登入使用者池(保存密碼),池回傳一個包含 ID token、access token 與 refresh token 的方塊

AWS Security 開發者實務

使用者池負責登入

託管的使用者目錄

  • 註冊與登入
  • 重設密碼
  • 多因子驗證

 

成功後會有三個權杖

  • ID token:描述使用者是誰
  • Access token:描述可呼叫什麼
  • Refresh token:之後換取新的

縱向流程:應用程式使用者登入使用者池(保存密碼),池回傳一個包含 ID token、access token 與 refresh token 的方塊

AWS Security 開發者實務

身分池會簽發 AWS 憑證

權杖不是憑證

  • 供你的應用程式作為身分證明
  • 不是用來存取 AWS 服務的憑證

 

身分池:可信權杖進、憑證出

與使用者池圖相同結構的縱向流程:將可信權杖提供給身分池,身分池驗證發行者後回傳具角色範圍且會到期的 AWS 憑證

AWS Security 開發者實務

身分池會簽發 AWS 憑證

權杖不是憑證

  • 供你的應用程式作為身分證明
  • 不是用來存取 AWS 服務的憑證

 

身分池:可信權杖進、憑證出

  • 建置作業交換了 OIDC 權杖
  • 你持有的證明,換成門禁卡

與使用者池圖相同結構的縱向流程:將可信權杖提供給身分池,身分池驗證發行者後回傳具角色範圍且會到期的 AWS 憑證

AWS Security 開發者實務

單一應用,兩者並用

瀏覽器同時使用兩者

  1. 登入並取得權杖
  2. 將該權杖送到你的 API

Bearer 權杖:誰持有誰可用

縱向流程:瀏覽器在使用者池登入並取得權杖。該權杖分兩路:左送至你的 API,右送至身分池。身分池回傳憑證,而憑證用於存取 S3。

AWS Security 開發者實務

單一應用,兩者並用

瀏覽器同時使用兩者

  1. 登入並取得權杖
  2. 將該權杖送到你的 API
  3. 用同一個權杖換取憑證

縱向流程:瀏覽器在使用者池登入並取得權杖。該權杖分兩路:左送至你的 API,右送至身分池。身分池回傳憑證,而憑證用於存取 S3。

AWS Security 開發者實務

單一應用,兩者並用

瀏覽器同時使用兩者

  1. 登入並取得權杖
  2. 將該權杖送到你的 API
  3. 用同一個權杖換取憑證
  4. 使用該憑證存取 S3

權杖給你的程式碼,憑證給 AWS

縱向流程:瀏覽器在使用者池登入並取得權杖。該權杖分兩路:左送至你的 API,右送至身分池。身分池回傳憑證,而憑證用於存取 S3。

AWS Security 開發者實務

權杖是帶簽章的文字

三段以點相連並標示為 Header、Payload 與 Signature。Payload 上有開鎖符號,下方括號覆蓋前兩段,表示簽章涵蓋範圍。

JWT:JSON Web Token

  • 宣告:關於使用者的帶標籤敘述
AWS Security 開發者實務

權杖是帶簽章的文字

三段以點相連並標示為 Header、Payload 與 Signature。Payload 上有開鎖符號,下方括號覆蓋前兩段,表示簽章涵蓋範圍。

JWT:JSON Web Token

  • 宣告:關於使用者的帶標籤敘述
  • 已編碼,非加密
  • 任何人都能讀也能修改
AWS Security 開發者實務

讀取前先驗證

先驗證再說

  • JWKS:JSON Web Key Set,發行者的公開簽章金鑰
  • 以那些金鑰驗證簽章

縱向閘門圖:一個權杖依序通過四項勾選檢查:簽章、發行者、對象與到期。發行者的公開金鑰從側邊供應簽章檢查,通過第四項後才到綠色框讀取宣告。

AWS Security 開發者實務

讀取前先驗證

先驗證再說

  • JWKS:JSON Web Key Set,發行者的公開簽章金鑰
  • 以那些金鑰驗證簽章

 

接著檢查三個宣告

  • iss:你的使用者池
  • ID token 看 aud,access token 看 client_id
  • exp:尚未過期

縱向閘門圖:一個權杖依序通過四項勾選檢查:簽章、發行者、對象與到期。發行者的公開金鑰從側邊供應簽章檢查,通過第四項後才到綠色框讀取宣告。

AWS Security 開發者實務

驗過的權杖也可能不對

兩張並排的對照卡。ID token 卡標示為「身分權杖」,顯示 audience 宣告中的 client ID,並註明無 scope;上方灰色區塊表示「使用者是誰」。Access token 卡標示為「存取權杖」,顯示其 `client_id` 宣告中的 client ID,並註明具有 scope;上方橘色區塊表示「可呼叫什麼」。兩卡下方虛線帶註記 Cognito 的群組宣告同時出現在兩種權杖。

已驗證,仍可能是錯的權杖

AWS Security 開發者實務

驗過的權杖也可能不對

兩張並排的對照卡。ID token 卡標示為「身分權杖」,顯示 audience 宣告中的 client ID,並註明無 scope;上方灰色區塊表示「使用者是誰」。Access token 卡標示為「存取權杖」,顯示其 `client_id` 宣告中的 client ID,並註明具有 scope;上方橘色區塊表示「可呼叫什麼」。兩卡下方虛線帶註記 Cognito 的群組宣告同時出現在兩種權杖。

已驗證,仍可能是錯的權杖

token_use 指出種類

  • cognito:groups 同時存在於兩種權杖,且不是 scope

  • scope:權杖可呼叫的範圍

  • sub:哪位使用者,且永不改變
  • 身分不等於權限
AWS Security 開發者實務

一起來練習吧!

AWS Security 開發者實務

Preparing Video For Download...