【问题标题】:Nodejs API on azure app service passport auth not workingazure应用服务护照身份验证上的Nodejs API不起作用
【发布时间】: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


【解决方案1】:

Azure 应用服务是一个反向代理,这意味着客户端详细信息不会像典型请求中的预期那样。例如,客户端 IP 地址可从 x-forwarded-for 标头中获得。

你需要告诉 express 你的应用在代理后面运行:

app.set("trust proxy", 1);

同时,您应该明确定义 cookie 域并确保启用httpOnly,以帮助防止会话被 XSS 攻击窃取。

cookie: {
    domain: 'my.website.com',
    httpOnly: true,
    maxAge: 24*3600000, // 24 hours
}

Learn more 关于在代理后面运行 express。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-25
    • 2015-08-21
    • 1970-01-01
    • 2018-04-29
    • 2016-10-29
    • 2016-01-19
    • 1970-01-01
    • 2013-06-28
    相关资源
    最近更新 更多