1

当有人POST/oauth/authorizeSpring OAuth2 中执行操作时(此链接上 API 的源代码),CSRF 令牌会在服务器上更新。

可以使用哪些特定的代码语法:
1.) 在代码中访问新生成的 CSRF 令牌?
2.) 将新生成的 CSRF 令牌的副本分配给惰性会话变量?
3.) 随后检索新的会话变量以在不同的类中使用?

此要求的上下文是一个控制流,其中涉及通过多个过滤器和控制器的可变路由,而用户通过/oauth/authorize端点进行多次传递。变量需要保存到会话范围,然后根据算法的需要从会话范围中检索并放回请求范围。

可能需要创建和使用上述会话变量的类类型示例包括:

1.) 任何具有@Controller annotation,
2.) 任何自定义实现OncePerRequestFilter ,
3.) 任何自定义实现DefaultOAuth2RequestFactory,
4.) 以及自定义过滤器链中使用的其他类型的类。

这可能是 Spring MVC 问题或 Spring Security 问题,或两者兼而有之,即使它涉及 Spring OAuth2 API,其源代码是由 Spring MVC 和 Spring Security 构建的。

4

2 回答 2

2

Spring Security 文档详细介绍了这一点。您可以使用部分标题Include the CSRF Token访问令牌。本节的摘要:

  • 解决此问题的一种方法是使用 _csrf 请求属性来获取当前的 CsrfToken。使用 JSP 执行此操作的示例如下所示:
<c:url var="logoutUrl" value="/logout"/>
<form action="${logoutUrl}"
    method="post">
<input type="submit"
    value="Log out" />
<input type="hidden"
    name="${_csrf.parameterName}"
    value="${_csrf.token}"/>
</form>
  • 如果您使用 Spring MVC<form:form>标记或 Thymeleaf 2.1+ 并且正在使用@EnableWebSecurityCsrfToken则会自动为您包含 (使用CsrfRequestDataValueProcessor)。有关详细信息,请参阅自动令牌包含
  • Spring Security 提供了CsrfTokenResolver可以自动解析当前CsrfToken的 Spring MVC 参数。通过使用@EnableWebSecurity,您将自动将其添加到您的 Spring MVC 配置中。如果您使用基于 XML 的配置,则必须自己添加。

CsrfTokenResolver正确配置后,您可以将其公开给CsrfToken基于静态 HTML 的应用程序。

@RestController
public class CsrfController {

    @RequestMapping("/csrf")
    public CsrfToken csrf(CsrfToken token) {
        return token;
    }
}

CsrfToken对其他域保密很重要。这意味着如果您使用跨域共享 (CORS),则不应将 CsrfToken 暴露给任何外部域。

于 2016-05-18T14:03:52.210 回答
0

这就是OP所要求的:

1.) 检索 CSRF 令牌,如下所示:

ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
CsrfToken csrf = (CsrfToken) attr.getRequest().getAttribute(CsrfToken.class.getName());

2.) 然后用令牌做任何你想做的事情。(小心行事,知道自己在做什么,以免弄得一团糟。)也许将csrf令牌放入一个类代码中的惰性会话变量中,然后将其留在那里,直到需要在另一个类代码中将其取出.

3.)然后(可能在控制流中其他地方的不同类的代码中)将令牌放回请求中,如下所示:

attr.setAttribute("_csrf", csrf, RequestAttributes.SCOPE_REQUEST);
RequestContextHolder.setRequestAttributes(attr);

以上将用于清理自定义处理的副作用。例如,保存旧请求,然后在DefaultOAuth2RequestFactoryor的自定义实现中重新使用OncePerRequestFilter,但csrf令牌值在旧请求创建和新请求之间发生变化,因此csrf需要更新值在旧请求之前,它可以被添加到控制流中。

于 2016-05-19T18:59:10.130 回答