CSRF:如何在JAX-RS中从后端设置名为XSRF-TOKEN的cookie,以便在前端使用AngularJS

时间:2015-04-29 07:28:33

标签: angularjs rest csrf

我的应用程序在前端使用AngularJS,在后端使用Java RESTful Web服务。我们正在尝试使用XSRF-TOKEN来防止跨站点请求伪造。

在前端,我添加了angular-cookies.js,并在我的'模块中包含了ngCookies依赖项。

angular.module('myapp.list', ['ngCookies'])
 .controller('ListCtrl', ['$scope', '$http', '$location', function CoiListCtrl($scope, $http, $location) {
   //some functions
  })
.run(['$http', '$cookies', function($http, $cookies) {
//check if the header X-XSRF-TOKEN is already set by AngularJS
console.log($http.defaults.headers.post['X-XSRF-TOKEN']);
    debugger;
}]);

在前端,我无法通过以下两种方式看到我在后端创建的cookie:

1

使用HttpServletResponse对象,但这样我不确定如何将其发送回用户界面,因为我们没有使用httpResponse.sendRedirect(url);

之类的内容
@Context
HttpServletResponse httpResponse;
httpResponse.addCookie(new Cookie("XSRF-TOKEN", String.valueOf(Math.random()));

2

在我们使用典型JAX-RS服务中的ResponseBuilder方法返回响应时,将Cookie添加到responseBuilder.build()

ResponseBuilder responseBuilder = Response.temporaryRedirect(new URI(redirectUrl));
NewCookie abc = new NewCookie("XSRF-TOKEN", String.valueOf(Math.random()));
responseBuilder.cookie(abc);
return responseBuilder.build();

有人可以帮我创建有效的Cookie并使用它们。

1 个答案:

答案 0 :(得分:0)

您可以添加自己的ServletFilter实现,在其中将检查CRSF标头和CSRF cookie的存在,并检查它们是否相互匹配。 代码示例:

boolean isRequestContainsValidCsrfToken(HttpServletRequest request) {
        String authCookie = Arrays.stream(request.getCookies())
                .filter(cookie -> cookie.getName().equals(COOKIE_NAME))
                .findFirst()
                .map(Cookie::getValue)
                .orElse(null);
        String authHeader = request.getHeader(X_CSRF_TOKEN);
        

        return authCookie != null && authCookie.equals(authHeader);
    }