nginx 使用NodeJS部署Angular前端/使用Docker部署Express后端

mrphzbgm  于 2023-10-17  发布在  Nginx
关注(0)|答案(1)|浏览(134)

我已经开发了一个Web应用程序,前端使用Angular,后端使用NodeJS/Express。一切都在本地运行良好,我想将应用程序移动到Docker容器。不幸的是,现在出现了以下问题:
我使用一个保存我的会话令牌的cookie。在本地,这工作没有问题,但一旦我尝试整个事情与容器,整个事情不工作了。
当我尝试登录时,我可以在浏览器的网络分析中看到cookie是从后端(会话令牌)发送的。不幸的是,浏览器不保存此。即使我手动添加cookie,cookie也不会发送回后台进行授权。
下面是一些代码片段来理解我所做的:
前端:

public login(email: string, password: string): Observable<ResponseMessage> {
    const loginObservable = this.http.post<ResponseMessage>(this.server + '/api/login', {
      email: email,
      password: password
    }).pipe(shareReplay());
    loginObservable.subscribe({
      next: () => {
        this.loggedIn = true;
      },
      error: () => {
        this.loggedIn = false;
      }
    });
    return loginObservable;
  }

后端(生成cookie的部分):

private async generateSession(user:User, response:Response): Promise<void>{
      try{
        const sessionId = uid.sync(24);
        await user.createSession({sessionId: sessionId});
        response.cookie('sessionId', sessionId, { httpOnly: true, maxAge: 1000 * 60 * 60 * 24 });
        return;
      }catch(err){
        console.error(err);
      }
    }

当我已经有一个会话令牌时,它在后台被下面的代码检查:

public async authorize(request: Request, response: Response, next: NextFunction): Promise<void> {
      try{
        const sessionId = request.cookies.sessionId;
        console.log(request.cookies.sessionId);        //<-- This prints undefined when using Docker
        if (!sessionId) return next();
        const session:Session = await Session.findOne({
          where: {
            sessionId: sessionId
          },
        });
        if (!session) return next();
        response.locals.session = session;
        // Überprüfen ob ein User zur Session existiert
        const user:User = await session.getUser();
        if (!user) return next();
        response.locals.user = user;
        return next();
      }catch(err){
        console.error(err);
      }

    }

当直接在浏览器中打开URL进行授权时(localhost:3000/API/auth),它返回true(只要我有cookie),但当我在docker容器中的前端询问时,它返回false。
我在监督什么?
我用NGINX配置文件尝试了一些东西。

# CORS settings
add_header 'Access-Control-Allow-Origin' 'localhost';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE';
add_header 'Access-Control-Allow-Headers' 'Origin, X-Requested-With, Content-Type, Accept, Authorization, Credentials';
add_header 'Access-Control-Allow-Credentials' 'true';

不幸的是,这没有帮助。
编辑:
这是前端从后端返回的内容:
link to the screenshot of the browser-networkanalysis window

e1xvtsh3

e1xvtsh31#

我现在已经解决了这个问题,但通过不同的路线。我的问题的解决方案是,现在我让后端托管前端(nodejs/express现在托管编译后的前端)。这解决了问题,但前端和后端运行在同一个docker容器中。

相关问题