那麼問題來了:
「登入成功之後,後端要怎麼知道這個人是誰?」
「如果我要呼叫雲端 API,怎麼確保只有登入的人能用?」
今天,就讓我們透過 API Gateway + Lambda,帶你體驗「後端也能認得你」的流程。
流程其實很直覺:
API Gateway 是 AWS 中 承接 API 請求的入口,功能包括:
在今天的案例中,API Gateway + Cognito 的搭配重點是:
在 API Gateway 背後,最常見的搭檔就是 AWS Lambda。
它可以讓我們不用維護伺服器,直接在雲端執行程式碼。
特點是:
在今天的案例中,Lambda 的任務很單純:
Lambda 可以直接從 event 拿到「使用者的身分資訊 (claims)」。
import json
def lambda_handler(event, context):
// 從API Gateway拿使用者的資料
claims = (
event.get('claims', {})
)
// 將資料解包取得email 以及 username (如沒有則為預設值)
email = claims.get('email') or claims.get('cognito:username') or '訪客'
// 根據使用者的email回傳訊息
message = f"歡迎{email}加入30天AWS系列!"
return {
'statusCode': 200,
// CORS 標頭 (不知道這是什麼的之後介紹)
'headers': {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Headers': 'Content-Type,Authorization',
'Access-Control-Allow-Methods': 'GET,OPTIONS'
},
// 前端會收到的內容
'body': json.dumps({
'message': message,
'email': email
})
}
對於後端而言,前端的角色很單純:帶著 Token 過來。
// 透過環境變數讀入URL
const res = await fetch(`${apiUrl.replace(/\/$/, '')}/echo`, {
method: 'GET',
headers: {
// 將使用者的session id token帶入header
'Authorization': `Bearer ${idToken}`,
'Accept': 'application/json'
}
});
如果請求 header 中沒有帶有指定 cognito 認證過的 id token 的話,則會直接被api gateway給攔下來
這個 Demo 我已經整理成一個小專案,你可以直接 clone 跟著README下來跑:
GitHub Repo - Cognito + API Gateway Demo
建議你試試看:
今天我們回答了「後端怎麼知道使用者是誰?」這個問題。
靠著 API Gateway + Cognito,我們建立了第一個「前後端都有認知」的完整流程:
這樣的架構再搭配資料庫,是在雲端應用中非常常見的基礎設施規劃。
優點就是完全 Serverless
那麼今天走過了 Cognito token 驗證的流程,應該有比較有感覺了,在明天我們會看看 API Gateway 與 Lambda 部署,尤其是在與 Cognito 串接時的各種眉角以及CDK的寫法。在雲上的前後端分離系統其實蠻容易因權限、瀏覽器安全政策而卡關 (我自己也花了一些時間...),那麼明天就帶大家看看會踩甚麼雷吧
請問一下, 後端的程式, 即 lambda, 在開發過程中, 能不能在本地運行呢? 看來好像要部署到雲端才可以跑起來。
您好!關於你提到的問題
因為本文中的Lambda Function的開發是由handler function為基礎
所以一些上下文的提取實際上需要API Gateway或是其他的Trigger作為輔助
所以簡單的回答是:不行!
不過我調查了一下,其實有一些工具可以在本地模擬雲端環境:
AWS SAM CLI(官方工具):用 Docker 模擬 Lambda 執行環境,並支援各種事件觸發的測試。
LocalStack(開源工具):除了 Lambda 以外,還能模擬 S3、DynamoDB、SQS 等多種 AWS 服務,適合做整合測試。
希望對你有幫助!
謝謝你的回覆! 看來還是要用這些工具, 在本地模擬雲端, 才比較方便開發。
同時也感謝你寫了這個系列文章! 整個系列很完整, 前後呼應, 很適合新手!