【问题标题】:Set HttpOnly Cookies while developing Web App locally在本地开发 Web App 时设置 HttpOnly Cookies
【发布时间】:2021-04-30 03:40:41
【问题描述】:

我正在开发一个带有 angular + nebular auth 的网络应用程序。 Nebular 身份验证正在工作,我从我们的身份验证服务器获得了一个 JWT 令牌。身份验证服务器是用 Node 制作的,并且还为刷新令牌设置了一个 HTTPOnly cookie。我希望这个令牌随每个请求一起发送。 登录响应确实具有 Set-Cookie 标头,但从未设置 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 标头,但我在浏览器控制台的 Cookies 选项卡中看不到 cookie。

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

所以我快疯了……这可能是 CORS 的问题,因为我是从 localhost 开发的,并且服务器在云端?

我怎样才能做到这一点?

【问题讨论】:

  • 您是否尝试在 https 而不是 http 上运行应用程序?我有一个类似的问题(虽然使用 .net 服务器)并在 https 上运行解决了它。
  • 我目前在使用自签名证书的 HTTPS 中运行时遇到问题。我尝试的每个请求都会收到 ERR_CERT_AUTHORITY_INVALID
  • 这是服务器和您的身份验证服务器之间的 b2b 请求吗?如果是这样,您可能需要确保您的服务器也信任自签名证书
  • 嘿@GiammarcoBoscaro 你找到答案了吗?
  • @NikitasIO 是的,我做到了。我刚刚发布了答案

标签: node.js angular cookies cross-domain


【解决方案1】:

所以我找到的初始解决方案只是简单地在 localhost 上运行 Node 服务器。服务器很轻,所以没问题,但这不是最好的解决方案。

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

我在工作目录的根目录上创建了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 标头添加到每个请求中。通常我还使用拦截器来添加项目所需的自定义标头,处理授权标头,并在身份验证令牌过期时调用刷新令牌 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 作为调用我的身份验证 API 的基本路径与 CORS 一起正常工作,并且我得到了我的 HTTP Only Cookie。

【讨论】:

  • 感谢您的回答。原来我的问题更深了,因为它与 creating a custom HttpInterceptor to handle 'withCredentials' 和在我的 Node.js API 中配置我的 'Access-Control' 标头有关。
  • 哦,当然,你也需要那个。我很久以前就已经说过了,因为我的身份验证系统和 Hasura 需要一个拦截器。所以我完全忘记了这个问题也需要它。我会编辑我的答案
猜你喜欢
  • 2015-05-02
  • 2021-07-26
  • 2016-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-17
  • 2020-05-30
  • 2020-03-12
相关资源
最近更新 更多