如何使用集成 getToken - AWS WAF、AWS Firewall Manager 和 AWS Shield Advanced

如何使用集成 getToken

本部分介绍了如何使用 getToken 操作。

AWS WAF 要求您向受保护端点发出的请求中包含名为 aws-waf-token 的 Cookie 和当前令牌的值。

getToken 操作是一个异步 API 调用,用于检索 AWS WAF 令牌并将其存储在名为 aws-waf-token 的当前页面的 Cookie 中,值设置为令牌值。您可以根据需要在页面中使用此令牌 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 提供令牌后才能提交表格

以下列表显示了如何注册事件侦听器以拦截表单提交,直到有有效的令牌可供使用。

<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-token Cookie 中读取令牌外,AWS WAF 还会从此标头读取令牌。以下代码显示了设置标头的示例:

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

默认情况下,AWS WAF 仅接受其所含域与请求的主机域一致的令牌。任何跨域令牌都需要在 Web ACL 令牌域列表中有相应条目。有关更多信息,请参阅 AWS WAF Web ACL 令牌域列表配置

有关跨域令牌使用的更多信息,请参阅 aws-samples/aws-waf-bot-control-api-protection-with-captcha