尽管 withCredentials:true 未能在 GET 请求中发送 Cookie

Posted

技术标签:

【中文标题】尽管 withCredentials:true 未能在 GET 请求中发送 Cookie【英文标题】:Failing to send a Cookie in GET Request despite withCredentials:true尽管 withCredentials:true 未能在 GET 请求中发送 Cookie 【发布时间】:2020-05-24 09:51:43 【问题描述】:

我打算使用 Spring Boot REST API、JWT(Auth0 -java-jwt) 和 Angular 8 实现一个简单的登录应用程序。登录后,我从 REST API 接收到一个 Cookie如下:

Cookie cookie= new Cookie("token",token);
    cookie.setPath("/");
    cookie.setDomain("localhost");
    cookie.setHttpOnly(true);
    cookie.setMaxAge(60 * 60 * 24 * 365 * 10);
    //cookie.setSecure(true); - for deployment
    httpServletResponse.addCookie(cookie);

在浏览器(开发工具,响应标头)中,我可以看到收到的 Cookie,带有正确的令牌。但是,我在chrome://settings/siteData?search 中看不到它,我尝试了 Chrome、Chromium 和 Firefox,都显示了相同的结果。

现在,这就是我从 Angular 客户端发送请求的方式:

const h = new HttpHeaders().append("Authorization", "Bearer ");
this.http.get("http://localhost:8080/api/users", headers:h, withCredentials: true )

在请求标头中,我没有看到这个 cookie,因此,我想,请求没有得到授权。

我错过了什么?另外,我很欣赏任何展示使用 Spring Boot(仅 REST API,而不是 Thymleaf 或其他东西)、Angular 和 JWT (java-jwt) 进行简单登录的文章。谢谢。

【问题讨论】:

【参考方案1】:

在我看来,这里的问题是您发送的 Authorzation 标头没有 JWT,实际上您正在编写代码 const h = new HttpHeaders().append("Authorization", "Bearer ");

我在 react 应用程序中解决了类似的 fetch 问题,但我想它对你来说应该是一样的,没有设置 Authorization 标头,而是像你一样设置 withCredentials: true。

最后 m 建议尝试删除标头,因为您的配置没有发送 JWT 令牌

提示如果在您的问题中您编写了一个空白令牌,但在您的实际生产代码中您正确插入了它,也许您应该检查您的资源服务器是否可以正常工作,我不知道...邮递员卷曲或类似的东西 或者你应该检查你的令牌是一个有效的令牌而不是一个过期的令牌

附言在您的后端服务器实现中,我看到了一个非常低级的详细信息,如果您使用的是 Spring Boot 2.x,我建议您使用 Spring Security oauth2 模块;如果您使用的是 Spring Boot 1.5.x 版本,则建议您使用 Spring Cloud Security OAuth2

【讨论】:

以上是关于尽管 withCredentials:true 未能在 GET 请求中发送 Cookie的主要内容,如果未能解决你的问题,请参考以下文章

OkHttp POST 请求设置 withCredentials 为 True?

2021-07-21 前端跨域携带cookie问题

在 Firefox 的 jQuery $ajax 调用中使用 xhrFields: withCredentials: true 时的状态码 = 0

CORS $.ajax 会话 cookie(访问控制允许凭据和 withCredentials=true)

如何将withCredentials = true添加到Jquery .load()?

Web API OWIN 从 $.AJAX POST withCredentials:true 接收空数据