Angular + Sping Boot -无法通过HTTPS发送Cookie

z8dt9xmd  于 2022-11-05  发布在  Spring
关注(0)|答案(2)|浏览(138)

我有一个Angular 12前端应用程序和一个Sping Boot 后端应用程序通信。API应该被调用,通过使用cookie传递一个CSRF令牌,但是看起来我的逻辑只对localhost有效。
请找到以下代码片段:

  • 通过ngx-cookie-service设置的Angular cookie:
this.cookieService.set(key, value, {
   secure: environment.apiHost.startsWith('https'),
   sameSite: environment.apiHost.startsWith('https') ? 'None' : undefined
});
  • 在每个请求之前调用的Angular 拦截器:
intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {
    // Handle cookies
    request = request.clone({
      withCredentials: true
    });
    return next.handle(request).pipe(
      ...
    );
}
  • Spring Boot CORS通用配置:
List<String> allowedOrigins = new ArrayList<>();
allowedOrigins.add("http://localhost:4200");
allowedOrigins.add("https://<host_name_not_localhost>");

config.setAllowCredentials(true);
config.setAllowedOrigins(allowedOrigins);
config.setAllowedHeaders(Arrays.asList("Origin", "Content-Type", "Accept"));
config.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "OPTIONS", "DELETE", "PATCH"));
source.registerCorsConfiguration("/api/**", config);

return new CorsFilter(source);

老实说,我不明白问题是出在前端还是出在后端......同样,通过HTTP(localhost)发送cookie可以正常工作,而在通过HTTPS调试调用时,Cookie 属性不会出现。
你对此有什么建议吗?
先谢谢你了。

8cdiaqws

8cdiaqws1#

这里唯一的原因可能是在创建cookie的时候,你没有用后端的域来设置域。

var cookieName = 'HelloWorld';
var cookieValue = 'HelloWorld';
var myDate = new Date();
myDate.setMonth(myDate.getMonth() + 12);
document.cookie = cookieName +"=" + cookieValue + ";expires=" + myDate 
                  + ";domain=.example.com;path=/";

在上述情况下,example.com是您的后端域。或通过使用cookie API,请参阅此处:-https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Work_with_the_Cookies_API

sauutmhj

sauutmhj2#

我决定去掉cookie,并在请求头中传递信息,这似乎是一种更安全的方法。另外,我可以从后端本身控制允许的头。

相关问题