首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >本地开发HttpOnly应用程序时设置developing

问本地开发HttpOnly应用程序时设置developing
EN

Stack Overflow用户
提问于 2021-01-26 10:50:16
回答 1查看 566关注 0票数 1

我正在开发一个带有角+星云的web应用程序。Nebular正在工作,我从auth服务器获得了一个JWT令牌。auth服务器由Node组成,并为刷新令牌设置一个HTTPOnly cookie。我希望每个请求都能发送这个令牌。登录响应确实具有Set-Cookie头,但cookie从未设置过。我在Stack溢出中读到了很多答案,但我尝试过的一切都没有奏效。

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

不管怎么说,我到现在为止都是这么做的:

Node.js

我正在使用HTTP服务器,并使用以下内容设置cookie解析器的cookie:

代码语言:javascript
复制
res.cookie("refresh_token", token, {httpOnly: true, maxAge: ....});

我在app.js中设置了以下核心选项:

代码语言:javascript
复制
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 }发送来自角的请求,但很明显,当我在Node中查看cookie时,没有任何内容。

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

我怎么才能把这事做好?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-22 16:30:53

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

我用一个简单的本地代理来解决这个问题:

我在workdir的根目录上创建了proxy.json

代码语言:javascript
复制
{
  "/api": {
    "target": "http://<server_ip>:3000",
    "secure": false
  }
}

然后在angular.json上添加了这一行

代码语言:javascript
复制
"serve": {
  "builder": "@angular-devkit/build-angular:dev-server",
  "options": {
    "proxyConfig": "proxy.json", // Added this
    "ssl": false
  },
  ...

我还需要创建一个HttpInterceptor来拦截http请求,并将Access-Control-Allow-Credentials头添加到每个请求中。通常,我还使用一个Interceptor来添加我的项目所需的自定义标头,处理授权头,并在auth令牌过期时调用刷新令牌API。无论如何,最简单的拦截器是:

代码语言:javascript
复制
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上

代码语言:javascript
复制
export const environment = {
  app_name: "<app_name_dev>",
  production: false,
  api_path: 'http://localhost:4200/api',
};

因此,现在使用environment.api_path作为基本路径来调用我的身份验证API,可以正确地使用CORS,并且我获得了HTTP。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65899928

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档