在解析和理解com.adobe.granite.csrf.impl.CSRFFilter doFilter时需要帮助:提供的csrf令牌在AEM 6.1中无效
问题概述:在解析和理解com.adobe.granite.csrf.impl.CSRFFilter doFilter时需要帮助:提供的csrf令牌在AEM 6.1中无效,aem,Aem,问题概述: 我们正在将系统从CQ5.4升级到AEM 6.1。 在现有代码中,我们提到了使用ajax的POST.jsp,在这里我们调用身份验证服务来对系统的外部用户进行身份验证。 当我们向resource post.jsp发送ajax帖子时,会出现以下错误。在error.log中。 com.adobe.granite.csrf.impl.CSRFFilter doFilter:提供的csrf令牌无效 我们尝试了什么: 为了解决这个问题,我们根据AEM 6.1文档尝试了解决方案。 但它不起作用 我们
我们正在将系统从CQ5.4升级到AEM 6.1。 在现有代码中,我们提到了使用ajax的POST.jsp,在这里我们调用身份验证服务来对系统的外部用户进行身份验证。 当我们向resource post.jsp发送ajax帖子时,会出现以下错误。在error.log中。 com.adobe.granite.csrf.impl.CSRFFilter doFilter:提供的csrf令牌无效 我们尝试了什么:
但它不起作用
public void doFilter(ServletRequest req, ServletResponse res, FilterChain Chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)req;
if ((request.getAuthType() != null) && (isFilteredMethod(request)) && (doFilterBasedOnUserAgent(request)) && (!isValidRequest(request))) {
HttpServletResponse response = (HttpServletResponse)res;
this.logger.info("doFilter: the provided CSRF token is invalid");
response.sendError(403);
return;
}
chain.doFilter(req, res);
}
在上述代码中,
isFilteredMethod检查当前请求(POST)是否存在于Adobe Granite CSRF Filter的已配置过滤方法中。doFilterBasedOnUserAgent检查当前请求的用户代理是否不在配置的用户代理中。
在我们的例子中,request.getAuthType是“FORM”。所以这不会导致(403)。
isValidRequest获取请求参数:cq_csrf_令牌并检查 此参数值有效。(注意到这一点,在我们的案例中是有效的 并发送参数)
那么过滤方法和用户代理的意义是什么呢?尽管所有CQ和AEM 5.x版本都支持这种发布请求的方式,但为什么CSRF会发送403 for POST.jsp呢?因此,您可以做几件事-
或者,您可以在“Adobe Granite CSRF filter configuration”(Adobe Granite CSRF filter configuration)下过滤您自己的servlet,而不允许使用cq jquery进行所有POST请求或以上操作。如前所述,isValidRequest获取请求参数:cq_CSRF_令牌,并检查此参数值是否有效,因此我们正确获取令牌和有效值,通过将其值与/libs/granite/csrf/token.json进行比较进行交叉检查,您可以演示一个如何手动添加令牌的示例吗?您能告诉我您所做的修复吗?