前端和后端分别部署(域)的 Cookie 的使用 [关闭]

Posted

技术标签:

【中文标题】前端和后端分别部署(域)的 Cookie 的使用 [关闭]【英文标题】:Usage of Cookies where Front end and Back end deployed separately (domain) [closed] 【发布时间】:2019-08-21 07:16:55 【问题描述】:

我研究了2天多没有找到解决办法。让我解释一下问题,

我有一个应用程序,其中 UI 使用 Angular 7 实现,后端使用 Java Spring。

它们都分别部署在不同的域中。假设 Angular 应用部署在 ang.ui.com 中,Java 部署在 java.back.com 中。

所有都是 REST Api,包括登录。 Cookie 用于存储 JWT 令牌,而不是本地存储。 我已经从双方都包含了CORS配置并且能够成功登录。

由于两者是分开部署的,Java 应用程序在过滤时无法获取 JWT Cookie。

请帮助我我需要遵循什么方法。

【问题讨论】:

如果您研究了 2 天,那么您一定找到了一些替代方案。什么对你有用? Cookie 将不起作用。您有一个 JWT 令牌,将其传递到标头中。 是的,另一种方法是使用本地存储存储它并使用Authorization 标头发送它。但是我正在搜索的是仅使用 Cookie 而不是 Authorization 标头 不能在这种情况下使用 cookie。除非您将应用程序部署在同一个域中,否则 Cookie 将永远无法工作。 这就是我想知道的。谢谢。 【参考方案1】:

服务器将无法从前端读取 cookie,您必须在发送的每个 HTTP 请求中发送存储在 cookie 中的令牌,最好是在 Authorization 标头中。

一种方法是使用 Angular 拦截器。 让我们通过创建一个名为jwt.interceptor.ts的新文件来创建一个新的拦截器

我们的拦截器类将被称为JwtInterceptor,它必须实现Angular HttpInterceptor 接口。我们将通过添加@Injectable 注解使其可注入。

我们的类应该是这样的:

@Injectable()
export class JwtInterceptor implements HttpInterceptor 

现在我们必须实现intercept 方法,我们发送的每个http 请求都会执行该方法。它有一个HttpRequest 和一个HttpHandler 参数,它返回一个HttpEvent observable。

intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> 

在此方法中,我们必须从 cookie 中读取令牌(假设它称为 jwtCookie)并添加到 HttpRequest 标头的 Authorization 部分。 假设您已经知道如何使用 cookie 服务,我将不再继续。 我们使用var token = cookie.get("jwtCookie"); 检索令牌 让我们验证 cookie 是否存在:if(token) 现在我们通过克隆请求对象并设置 Authorization 标头将我们的令牌添加到标头:

request = request.clone(
      setHeaders:  
           Authorization: `Bearer $token`
      
);

现在我们只需要调用并返回next.handle(request)来处理请求。

现在我们的类应该是这样的:

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

@Injectable()
export class JwtInterceptor implements HttpInterceptor 
  intercept(request: HttpRequest<any>, next: HttpHandler):Observable<HttpEvent<any>> 
    var token = cookie.get("jwtCookie);
    if(token) 
      request = request.clone(
        setHeaders:  
           Authorization: `Bearer $token`
        
      );
    
    return next.handle(request);
  

现在我们必须通过编辑app.module.ts 文件来注入我们的拦截器 先导入类:import JwtInterceptor from './jwt.interceptor';

然后将以下对象添加到@NgModule注解中的providers数组中:

provide: HTTP_INTERCEPTORS, useClass: JwtInterceptor, multi: true

现在我们的令牌将被添加到我们的 Angular 应用程序发送的每个请求中,并且我们的 JAVA 服务器可以读取它。

【讨论】:

我已经尝试过了,它工作正常。忘记在问题中包含此内容。我的错。感谢您的回复。

以上是关于前端和后端分别部署(域)的 Cookie 的使用 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

AWS CloudFront 为不同的主机(前端和后端)设置 cookie

ProxyPassReverseCookieDomain动态变量

如何部署分离的前端和后端?

跨域CORS

IT 行业:前端和后端分别是要做什么?哪个方向加班时间更多?

前端和后端有啥区别?