【问题标题】:authentication conflict between sessions in Express serverExpress 服务器中会话之间的身份验证冲突
【发布时间】:2019-05-16 17:39:11
【问题描述】:

我正在玩this 库,我遇到了一个烦人的场景,我认为这是由于 cookie 或标头身份验证中的某种冲突造成的。

当我登录一个帐户时,一切正常。但是当尝试登录另一个帐户时,它只是忽略提供的新数据并使用 old 数据进行身份验证并连接到 old 帐户。不管email 还是password 是否存在。 (也尝试使用假数据)。

该库没有正确的 logout 方法,这是有意义的,你真的不需要一个,因为当你在你的机器上简单地使用 node 运行它而不涉及任何服务器并且没有 cookie 或任何类型的数据在记忆中,一切都很好。我可以登录任意数量的帐户。

问题在于在 Express 服务器上运行它时。

代码:

// api.js

const OKCupid = require("./okc_lib");
const Promise = require("bluebird");
const okc = Promise.promisifyAll(new OKCupid());

async function start(req, res, next) {
  const {
    body: {
      username,
      password
    }
  } = req;

  try {
    await okc.loginAsync(username, password);

    okc.search(
      searchOpt,
      (err, resp, body) => {
        if (err) return console.log({ err });

        const results = body.data;

        // do dsomething with results
        return res.status(200).json({ message: "OK" });
        });
      }
    );
  } catch (error) {
    res.status(400).json({ message: "Something went wrong", error });
  }
}

module.exports = { start };

// routes.js

const express = require("express");
const router = express.Router();
const { start, login } = require("../actions/okc");

router.post("/login", login);
router.post("/start", start);

module.exports = router;

因此,当首先尝试发布到 url/login 时,它工作正常。但是,当您尝试使用不同的 username 和 password 再次执行此操作时,它只是通过并忽略新数据并连接到旧数据。

作为调查的一部分,我查看了库的源代码,发现了一个方法clearOAuthToken,它可以从标头中清除令牌。然而它并没有真正做任何事情。所以我试图从requester 助手中删除jar 初始化,这是唯一帮助我继续前进并登录到另一个帐户的东西。 但是它只是用于试验,不能作为解决方案,因为您确实需要这些 cookie 用于库的其他部分。这只是证明问题不在标题中,而是在 cookie 中。

知道如何在每次调用之间“重置”服务器状态吗?

【问题讨论】:

    标签: javascript node.js http express cookies


    【解决方案1】:

    “当尝试登录另一个帐户时,它只是忽略提供的新数据并使用旧数据进行身份验证并连接到旧帐户。”

    正如评论中提到的 OP,这不是 authorization 标头问题,而是 cookie 问题。

    要实现注销接口,可以手动清除cookies:

    OKCupid.prototype.logout = function(){
      request = request.defaults({jar: request.jar()}) // reset the cookie jar
      headers.clearOAuthToken(); // just in case
    }
    

    【讨论】:

    • 很抱歉没有提及,但我已经尝试过了。似乎这不是标题问题,而是 cookie 问题。唯一对我“有效”的是从Requester 中删除jar 初始化,然后我才能登录到另一个帐户。但是它不能像这样使用,因为那样你就不能使用 lib,因为它依赖于 jar 中的其他 cookie,它只是为了测试问题来自哪里。
    • 你能在问题中添加这个重要信息吗?
    • 已添加。很抱歉
    • @obiwankenoobi 我已经更新了我的答案,请检查
    • 我可以在那里设置cookie_jar 或者使用request 实例吗?它们都不存在于这个范围内。两者都是在Requester.js 中创建而不是在client.js 中创建的,否则它将与新实例一起使用?
    猜你喜欢
    • 2011-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-02
    • 2015-12-02
    • 1970-01-01
    • 1970-01-01
    • 2012-12-06
    相关资源
    最近更新 更多