尽管 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?
在 Firefox 的 jQuery $ajax 调用中使用 xhrFields: withCredentials: true 时的状态码 = 0
CORS $.ajax 会话 cookie(访问控制允许凭据和 withCredentials=true)