繁体   English   中英

HTTP 请求中的 Angular2 Set-Cookie JSESSIONID

[英]Angular2 Set-Cookie JSESSIONID in HTTP requests

我正在使用 auth0/angular2-jwt 库在每个请求上附加 JWT。

我想知道如何在每个请求上也添加 JSESSIONID cookie,以便我点击服务器端会话?

这是一个好习惯吗?

我试过这个没有成功

let myHeader = new Headers();
myHeader.append('SET-COOKIE', 'JSESSIONID=<jsessionid>');

this.authHttp.get(endpoint, {headers: myHeader, withCredentials: true}).map(res => res.json()).subscribe(
  jwt => {
    ...
  },err => console.log(err));

这是好的做法吗?

不,这不是好的做法。

来自 JWT 文档:

在认证中,当用户使用他们的凭据成功登录时,将返回一个 JSON Web Token 并且必须保存在本地(通常在本地存储中,但也可以使用 cookie),而不是传统的创建会话的方法服务器并返回一个cookie。

参考: https : //jwt.io/introduction/https : //jwt.io/introduction/

会话ID

您需要知道浏览器中存储了多种类型的 cookie。 其中许多可以从 JS 代码访问,但其中一些是httpOnly 这意味着浏览器能够将它们透明地附加到 JS 代码的每个请求上(您不会在代码中看到 cookie)。 服务器端JSESSIONID默认实现是httpOnly cookie 的示例。 这种设计有多种安全原因 - 您页面上的 JS 恶意软件将无法从客户端窃取会话。

标题

myHeader.append('SET-COOKIE', 'JSESSIONID=<jsessionid>');

这不是将 cookie 传递给服务器的有效方式。 这是向客户端发送响应并在客户端上设置 cookie 的正确方法。 如果你想传递cookies,你可以使用:

myHeader.append('Cookies', 'JSESSIONID=<jsessionid>');

尽管如此,这还是行不通。 无论如何,浏览器都会附加它自己的。 也就是说,浏览器应该自动JSESSIONID附加到您的请求中。 如果这不起作用,则JSESSIONID cookie 未在浏览器中设置(检查 chrome 开发人员工具,您可以在应用程序选项卡中查看 cookie)或者您使用的是远程服务器 - 与您的应用程序在不同的端口/服务器/协议上(然后在这种情况下,CORS 会进入并破坏您的应用程序)。

Easiest Solution

constructor(public restProvider: RestProvider) { }
    intercept(request: HttpRequest<any>, next: HttpHandler):
        Observable<HttpEvent<any>> {
        if (this.restProvider.getToken() != null) {
            const clonedRequest = request.clone({
                headers: request.headers.set('X-Requested-With', 'XMLHttpRequest')
            });
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM