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 文档:

In authentication, when the user successfully logs in using their credentials, a JSON Web Token will be returned and must be saved locally (typically in local storage, but cookies can be also used), instead of the traditional approach of creating a session in the server and returning a cookie.

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

JSESSIONID

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

Headers

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

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

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

不过,这行不通。无论如何,浏览器都会附加自己的。 也就是说,JSESSIONID 应该由浏览器 自动 附加到您的请求中。如果这不起作用,则 JSESSIONID cookie 未在浏览器中设置(检查 chrome 开发人员工具,您可以在应用程序选项卡中查看 cookie)或者您正在使用远程服务器 - 在不同的 port/server/protocol 比你的应用程序要多(在这种情况下,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')
            });
        }
    }