gpt4 book ai didi

javascript - 公理 : How exactly to preserve session after successful authorization and send with subsequent request - while testing without browser

转载 作者:行者123 更新时间:2023-12-05 01:55:44 25 4
gpt4 key购买 nike

在这个测试用例中,我发送一个带有用户 ID 和密码的 axios post 请求到本地运行 passportjs 的 ExpressJS 服务器。服务器以状态代码 200 响应,并使用 set-cookie 发送适当的 header 。

我需要将后续请求视为授权请求,因为尝试了以下选项,但似乎都没有用。它被拒绝,状态代码为 401。

第一次使用用户名和密码调用,响应状态为 200

const userDoc = {
userId: 'test-user-1',
userName: 'Test User 1',
emailId: 'test.user.1@abc.xom',
password: 'test-password'
} ;

let resp

resp = await axios({method : 'post', url : 'http://localhost:4040/auth/local', data : {userId: userDoc.userId, password: userDoc.password },withCredentials: true })

以下选项用于发送下一个请求

  1. 发送作为第一个请求的一部分收到的 cookie

     const headers = { headers : {Cookie: resp.headers['set-cookie'][0] } };
  2. 发送作为第一个请求的一部分收到的 header

     const headers = { headers : resp.headers};
  3. 发送 withCredentials: true 以及上述 header 。

使用上述任一选项进行第二次调用

resp = await axios({method : 'post', url : 'http://localhost:4040/v1/master/account', data : accountDoc , headers, withCredentials: true})
  1. 使用 httpAgent,keepAlive 与 axios 实例
const axios = require('axios')
const http = require("http")
const httpAgent = new http.Agent({keepAlive : true , timeout :1000})
const instance = axios.create({httpAgent})

const resp1 = await instance({method : 'post', url : 'http://localhost:4040/auth/local', data : {userId: userDoc.userId, password: userDoc.password, } , withCredentials: true })

const resp2 = await instance({method : 'post', url : 'http://localhost:4040/v1/master/account', data : accountDoc , withCredentials: true })

已拒绝,状态码为 401

--   Error: Request failed with status code 401
at createError (/home/Projects/FinAccounts2003/node_modules/axios/lib/core/createError.js:16:15)
at settle (/home/Projects/FinAccounts2003/node_modules/axios/lib/core/settle.js:17:12)
at IncomingMessage.handleStreamEnd (/home/Projects/FinAccounts2003/node_modules/axios/lib/adapters/http.js:269:11)
at IncomingMessage.emit (events.js:412:35)
at endReadableNT (internal/streams/readable.js:1334:12)
at processTicksAndRejections (internal/process/task_queues.js:82:21)

服务器代码是标准的 passport-js 本地代码,与浏览器兼容。

它可能与某些问题重复,给出的解决方案是 1) withCredentials: true,上面已经尝试过 2) Authorization: Bearer ${token} - not适用于这种情况,在passport js中,直接设置cookie,并没有获取token。

最佳答案

对我有用的一个解决方案是使用模块 tough-cookieaxios-cookiejar-support .我将它们组合在一个 persistent-client.js 文件中,然后我能够在请求之间维护 session (commonJS):

const axios = require('axios').default;
const { CookieJar } = require('tough-cookie');
const { wrapper } = require('axios-cookiejar-support');

module.exports = function () {
const jar = new CookieJar();

const client = wrapper(axios.create({ jar }));

return client;
}

关于javascript - 公理 : How exactly to preserve session after successful authorization and send with subsequent request - while testing without browser,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70113882/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com