38

我正在使用 express 进行 cookie 会话管理,如下所示:

req.session.authentication = auth;

我用类似的东西验证了经过身份验证的网址

if(!req.session.authentication){res.send(401);}

现在我正在使用 mocha、superagentshould为 URL 构建测试,但是我似乎找不到使用 superagent 获取/设置 cookie 的方法。我什至尝试在经过身份验证的测试之前请求登录,但它不起作用,

我已经尝试在 mocha BDD 套件的 before 语句中将请求添加到登录名,但是它仍然告诉我该请求是未经授权的,我已经测试了从浏览器执行请求的身份验证,但是它不能从套房有什么想法为什么?

4

6 回答 6

32

使用superagent.agent()(而不是普通的 old superagent)使请求具有持久性 cookie。请参阅superagent 文档或代码示例中的“保留 cookie”:agent.jscontroller.test.js

于 2012-10-04T20:04:31.520 回答
20

似乎以下代码工作正常;

req.set('Cookie', "cookieName1=cookieValue1;cookieName2=cookieValue2");

于 2016-01-14T16:55:53.650 回答
10

如果问题在于为 CORS 请求发送 cookie,请使用此处描述.withCredentials()的方法

request
  .get('http://localhost:4001/')
  .withCredentials()
  .end(function(err, res) { })
于 2016-09-28T10:05:22.743 回答
5

既然你提到你需要获取设置cookie:

得到:

const request = await Superagent.get('...')

const cookie = request.header['set-cookie']

放:

Superagent.post('...').set('Cookie', 'cookie_info')
于 2016-07-06T21:28:19.440 回答
1

2020 +

一个干净的方法是:

  • 创建一个简单的 cookie 存储
  • 抽象设置 Cookie 以在每个请求中发送它
  • 仅在需要时更新 cookie

请注意,我保留相同的 URL,因为我使用 graphql,但您可以将其设为参数:

const graph = agent =>
  agent.post('/graph')
    .set('cookie', cookieStore.get());

const handleCookie = res =>
  cookieStore.set(res.headers['set-cookie'][0]);

let currentCookie="";
const cookieStore = {
  set: cookie=>{currentCookie=cookie},
  get: cookie=>currentCookie,
};

module.exports = {graph,connectTestUser,handleCookieResponse};

现在,您可以使用graph(agent)发送请求并在有可能更新 cookie(设置或清除)的响应时使用handleCookie(response ),例如:

graph(agent).end((err,res) => {
  if (err) return done(err);
  res.statusCode.should.equal(200);
  handleCookie(res);
  return done();
});
于 2020-05-02T02:13:41.063 回答
0

将 cookie 添加到代理 cookiejar:

const request = require('superagent');
const {Cookie} = require('cookiejar')
const agent = request.agent()

agent.jar.setCookie(new Cookie("foo=bar"))

  
于 2022-02-28T02:17:55.270 回答