如何使用整合 getToken - AWS WAF、AWS Firewall Manager 與 AWS Shield Advanced

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

如何使用整合 getToken

AWS WAF要求您對受保護端點的請求包含以當前令牌值命名aws-waf-token的 cookie。

getToken操作是一個異步 API 調用,它檢索AWS WAF令牌並將其存儲在具有名稱的當前頁面上的 cookie 中aws-waf-token,並將值設置為令牌值。您可以根據需要在頁面中使用此令牌 cookie。

當你打電話時getToken,它會執行以下操作:

  • 如果一個未過期的令牌已經可用,調用立即返回它。

  • 否則,呼叫會從權杖提供者擷取新的權杖,等待最多 2 秒鐘,讓權杖擷取工作流程在逾時之前完成。如果操作超時,它會拋出一個錯誤,您的調用代碼必須處理。

getToken操作具有隨附的hasToken操作,指示 aws-waf-token cookie 當前是否持有未過期的令牌。

AwsWafIntegration.getToken()檢索一個有效的令牌並將其存儲為 cookie。大多數客戶端調用會自動附加此 cookie,但有些則不會。例如,跨主機網域進行的呼叫不會附加 Cookie。在接下來的實作詳細資訊中,我們會示範如何處理這兩種類型的用戶端呼叫。

基本getToken實作,適用於附加 aws-waf-token Cookie 的呼叫

下列範例清單顯示使用登入要求實作getToken作業的標準程式碼。

const login_response = await AwsWafIntegration.getToken() .catch(e => { // Implement error handling logic for your use case }) // The getToken call returns the token, and doesn't typically require special handling .then(token => { return loginToMyPage() }) async function loginToMyPage() { // Your existing login code }
僅在令牌可用後才提交表單 getToken

下列清單顯示如何註冊事件偵聽程式以攔截表單提交,直到有效的 Token 可供使用為止。

<body> <h1>Login</h1> <p></p> <form id="login-form" action="/web/login" method="POST" enctype="application/x-www-form-urlencoded"> <label for="input_username">USERNAME</label> <input type="text" name="input_username" id="input_username"><br> <label for="input_password">PASSWORD</label> <input type="password" name="input_password" id="input_password"><br> <button type="submit">Submit<button> </form> <script> const form = document.querySelector("#login-form"); // Register an event listener to intercept form submissions form.addEventListener("submit", (e) => { // Submit the form only after a token is available if (!AwsWafIntegration.hasToken()) { e.preventDefault(); AwsWafIntegration.getToken().then(() => { e.target.submit(); }, (reason) => { console.log("Error:"+reason) }); } }); </script> </body>
在您的客戶端默認情況下未附加 aws-waf-token cookie 時附加令牌

AwsWafIntegration.getToken()檢索有效的令牌並將其存儲為 cookie,但並非所有客戶端調用默認附加此 cookie。例如,跨主機網域進行的呼叫不會附加 Cookie。

fetch包裝器會自動處理這些情況,但是如果您無法使用fetch包裝器,則可以使用自定義x-aws-waf-token標題來處理此問題。 AWS WAF除了從 aws-waf-token cookie 中讀取它們之外,還可以從此標頭讀取令牌。下列程式碼顯示設定標頭的範例。

const token = await AwsWafIntegration.getToken(); const result = await fetch('/url', { headers: { 'x-aws-waf-token': token, }, });

默認情況下,AWS WAF僅接受包含與請求的主機域相同的域的令牌。任何跨網域權杖都需要 Web ACL 權杖網域清單中的對應項目。如需詳細資訊,請參閱 設定 Web ACL 權杖網域清單

如需有關跨網域權杖使用的其他資訊,請參閱 aws-aws-waf-bot-control 範例/-。api-protection-with-captcha