【发布时间】:2022-07-05 01:03:31
【问题描述】:
我有一个在 azure webapp 服务上运行的 api (nodejs + express) 和一个在本地和 cloudlfare 上运行的前端 (nuxtjs)。我的身份验证流程使用 passportjs LocalStrategy,并且在我开发它并在本地运行 api 时运行良好。现在我已经在 azure app 服务上部署了 api,我的前端总是得到 401 未授权响应。我很确定前端 nuxt 应用程序没有问题,因为该问题仅在尝试使用 azure 托管 api 时出现。
我正在使用带有 postgres 数据库的 express-session 来存储会话信息。
const sessionPool = new Pool() //if this becomes problematic consider sessionPool.end() in logout
auth.use(session({
resave: false,
saveUninitialized: true,
secret: process.env.SESSION_SECRET,
cookie: {maxAge: 1000 * 60 * 60 * 24}, //one day
store: new (require('connect-pg-simple')(session))({
SameSite: 'none',
pool: sessionPool,
tableName: 'session'
}),
}))
一开始似乎一切正常。用户凭据被发送到后端,它们针对数据库运行,如果它们与现有用户匹配,它会创建一个会话并声明在响应中发送用户信息。 (一些) cookie 存在于前端,但似乎有些丢失了。在前端本地运行应用程序时 stores 5 cookies 但在生产中似乎只有store 3. 所有需要授权的 api 调用都返回 401 未授权,即使客户端似乎有正确的信息并且后端显示他们有一个实时会话(我可以在db 表)。
//req.isAuthenticated() always returns false on the azure web app, but true when run locally
auth.get("/user", async (req, res) => {
try {
if (req.isAuthenticated()) {
res.json({ user: req.user });
} else {
console.log("User not authenticated");
res.sendStatus(401);
}
} catch (err) {
console.log(err);
res.sendStatus(500);
}
});
我认为这是 azure 应用服务阻止我的授权流程的问题。应用服务使用节点 16 运行时和 windows 操作系统(因此它使用 iisnode)。有人有什么见解吗?
【问题讨论】:
-
不,Azure 应用服务没有问题。你在做一些错误。在 localhost 中运行的代码并不总是在服务器上运行,它们是不同的环境。尝试正确配置所有内容,包括检查环境变量、数据库配置等。
-
嘿@马修戴维斯!它是否解决了您的问题,否则您可以分享更多详细信息以便我进行故障排除?
标签: node.js express azure-web-app-service passport.js