我已经开发了一个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
1条答案
按热度按时间e1xvtsh31#
我现在已经解决了这个问题,但通过不同的路线。我的问题的解决方案是,现在我让后端托管前端(nodejs/express现在托管编译后的前端)。这解决了问题,但前端和后端运行在同一个docker容器中。