在本地开发 Web App 时设置 HttpOnly Cookies

Set HttpOnly Cookies while developing Web App locally

我正在使用 angular + nebular auth 开发一个网络应用程序。 Nebular 身份验证正在运行,我从我们的身份验证服务器获得了一个 JWT 令牌。身份验证服务器是用 Node 制作的,并且还为刷新令牌设置了一个 HTTPOnly cookie。我希望这个令牌随每个请求一起发送。 登录响应确实有 Set-Cookie header,但从未设置 cookie。我在 Stack Overflow 中阅读了很多答案,但我尝试的所有方法都不起作用。

授权服务器在云服务器中,而我在本地开发应用程序。这可能已经是个问题了。

无论如何,这是我到目前为止所做的:

Node.js

我正在使用 HTTP 服务器,并使用 cookie-parser 设置 cookie:

res.cookie("refresh_token", token, {httpOnly: true, maxAge: ....});

我在 app.js 中设置核心选项是这样的:

app.use(cors({
 credentials: true,
 origin: ["http://localhost:4200", "http://127.0.0.1:4200"]
 exposedHeaders = ["Content-Length", .....],
 allowedHeaders = ["Content-Type", "Authorization", "Set-Cookie", ....],
}));

当我收到登录响应时,我确实收到了 Set-Cookie header,但我在浏览器控制台的“Cookie”选项卡中看不到该 cookie。

无论如何,我尝试从 Angular 发送请求,使用 { headers: headers, withCredentials: true } 但很明显,当我检查 Node 中的 cookie 时,什么也没有。

所以我要疯了...这可能是 CORS 的问题,因为我是从本地主机开发的,而服务器在云端?

我怎样才能使这个工作?

所以我找到的最初解决方案只是 运行 本地主机上的节点服务器。服务器很轻,所以没问题,但这不是最好的解决方案。

我在 Angular 中用一个简单的本地代理解决了这个问题:

我在 workdir

的根目录下创建了 proxy.json
{
  "/api": {
    "target": "http://<server_ip>:3000",
    "secure": false
  }
}

然后在 angular.json

上添加了这一行
"serve": {
  "builder": "@angular-devkit/build-angular:dev-server",
  "options": {
    "proxyConfig": "proxy.json", // Added this
    "ssl": false
  },
  ...

我还需要创建一个 HttpInterceptor 来拦截 http 请求并将 Access-Control-Allow-Credentials header 添加到每个请求中。通常我还使用拦截器来添加项目所需的自定义 headers,处理授权 headers 并在身份验证令牌过期时调用刷新令牌 API。不管怎样,最简单的拦截器是这样的:

import { Injectable } from '@angular/core';
import {
  HttpEvent, HttpInterceptor, HttpHandler, HttpRequest
} from '@angular/common/http';

import { Observable } from 'rxjs';

/** Inject With Credentials into the request */
@Injectable()
export class HttpRequestInterceptor implements HttpInterceptor {

  intercept(req: HttpRequest<any>, next: HttpHandler):
    Observable<HttpEvent<any>> {
    
      req = req.clone({
        withCredentials: true
      });
      
      return next.handle(req);
  }
}

终于在我的environment.ts

export const environment = {
  app_name: "<app_name_dev>",
  production: false,
  api_path: 'http://localhost:4200/api',
};

所以现在使用 environment.api_path 作为基本路径来调用我的身份验证 APIs 与 CORS 一起正常工作,我得到了我的 HTTP Only Cookie。