你如何使用superagent处理cookies?

40

我正在使用类似以下的方式在express中管理cookie session:

req.session.authentication = auth;

我使用类似以下方式验证经过身份验证的URL:

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

我正在使用mocha、superagentshould为URL构建测试,但我似乎找不到一种在superagent中设置/获取cookie的方法。我甚至尝试在验证测试之前请求登录,但它没有起作用。

我在mocha BDD套件的before语句中添加了登录请求,但仍然告诉我该请求未经授权。我已经从浏览器中进行了请求以进行身份验证,但从套件中却不起作用。有任何想法为什么?

6个回答

34

3
请注意,superagent.agent()在处理cookie方面存在严重的、未记录的问题,对于大多数请求定义而言,任何比get(url,opts,cb)更复杂的操作都需要钩入未记录的私有方法。 - Stuart P. Bentley
4
实际上,这份文档也没有提到关于cookies的内容。我本来很喜欢这个库,并对作者充满期望,但如果你想使用会话cookie,它就变得毫无用处了。 - Steve
2
这个没有起作用,如果有的话也不够充分...有人能提供一个如何工作的例子吗? - Zargold

22

看起来以下代码可以正常工作;

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


使用Django时,这对我没有起作用 {"Cookie": "csrftoken=token here"} - Kevin Hernandez

10

如果问题出现在CORS请求发送cookie上,请使用 .withCredentials() 方法,参见此处

request
  .get('http://localhost:4001/')
  .withCredentials()
  .end(function(err, res) { })

5

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

获取:

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

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

设置:

Superagent.post('...').set('Cookie', 'cookie_info')

3

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();
});

1
难道不应该是 res.header['set-cookie'] 而不是 res.headers['set-cookie'] 吗? - E net4

0

将一个cookie添加到代理cookiejar中:

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

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

  

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接