我使用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));
答案 0 :(得分:9)
这是好的做法吗?
不,这不是好习惯。
来自JWT文档:
在身份验证中,当用户使用其凭据成功登录时,将返回JSON Web令牌并且必须在本地保存(通常在本地存储中,但也可以使用cookie),而不是在服务器中创建会话并返回cookie的传统方法。
参考:https://jwt.io/introduction/https://jwt.io/introduction/
<强> JSESSIONID 强>
您需要知道浏览器中存储了多种类型的Cookie。其中许多都可以从JS代码访问,但其中一些是httpOnly
。这意味着浏览器能够在JS代码上透明地附加每个请求(您不会在代码中看到cookie)。服务器端JSESSIONID
的默认实现是httpOnly
cookie的示例。这种设计有多种安全原因 - 您网页上的JS恶意软件将无法从客户端窃取会话。
<强>接头强>
myHeader.append('SET-COOKIE', 'JSESSIONID=<jsessionid>');
这不是将Cookie传递给服务器的有效方法。这是向客户端发送响应并在客户端上设置cookie的正确方法。如果您想传递cookie,可以使用:
myHeader.append('Cookies', 'JSESSIONID=<jsessionid>');
但是,这不起作用。浏览器无论如何都会附加自己的。
这就是说,JSESSIONID
应该通过浏览器自动附加到您的请求。如果这不起作用,则JSESSIONID
cookie未在浏览器中设置(检查chrome开发人员工具,您可以在应用程序选项卡中查看cookie)或者您正在使用远程服务器 - 在不同的端口/服务器/协议上你的应用程序(在这种情况下,CORS会进入并破坏你的应用程序)。
答案 1 :(得分:0)
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')
});
}
}