[英]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.