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

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

如何使用集成 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