如何使用集成 getToken - Amazon WAF、 Amazon Firewall ManagerAmazon Shield Advanced、和 Amazon Shield 网络安全总监
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

引入全新的主机体验 Amazon WAF

现在,您可以使用更新的体验访问控制台中任意位置的 Amazon WAF 功能。有关更多详细信息,请参阅 使用更新的主机体验

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

如何使用集成 getToken

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

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

getToken 操作是一个异步 API 调用,用于检索 Amazon 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标题来处理此问题。 Amazon WAF 除了从 aws-waf-token Cookie 中读取令牌外,还会从该标头中读取令牌。以下代码显示了设置标头的示例:

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

默认情况下, Amazon WAF 仅接受包含与请求的主机域相同域名的令牌。任何跨域令牌都需要在保护包或 Web ACL 令牌域列表中输入相应的条目。有关更多信息,请参阅 Amazon WAF 保护包或 Web ACL 令牌域列表配置

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