在Lambda函数中使用axios时,根据先前的请求设置cookie

DrkStr

我在NodeJs应用程序中使用Axios进行HTTP请求。

我使用不需要在标题中设置cookie的发布请求登录。

const instance = axios.create({ baseURL: 'https://some_url.com' , withCredentials: true});
const response = await instance.post('auth/login', data);

这将set-cookie在其标头中返回a ,我需要在所有后续API调用中使用它。这是我为此尝试过的代码。

const getResponse = await instance.get('/getStuff?$top=10', { withCredentials: true });

这总是返回“未登录错误”。我没有访问服务器的权限,但是我认为这是因为我的get请求未在其标头中发送cookie。

在lambda中运行所有这些命令,不确定是否会有所作为。

问题:如何从第一个post请求中获取cookie并在get请求中使用它

hlfrmn

withCredentials选项适用于axios的浏览器版本,并依赖于浏览器来存储当前站点的cookie。

由于在Node中使用它,因此您必须自己处理存储。

TL; DR登录请求后,将cookie保存在某处。在发送其他请求之前,请确保您包括该cookie。

要读取Cookie,请检查response.headers对象,该对象应具有set-cookie标题(实际上所有cookie都是-带有一些特殊约定的标题,这些约定已经演变为某种标准)。

要将Cookie包含在HTTP请求中,请设置cookie标头。


一般例子

如果您需要比“保存一个我知道会得到的简单cookie”更好的东西,则还可以寻找一些“ cookie处理”库。

// 1. Get your axios instance ready
function createAxios() {
    const axios = require('axios');
    return axios.create({withCredentials: true});
}
const axiosInstance = createAxios();

// 2. Make sure you save the cookie after login.
// I'm using an object so that the reference to the cookie is always the same.
const cookieJar = {
    myCookies: undefined,
};

async function login() {
    const response = await axiosInstance.post('http://localhost:3003/auth', {});
    cookieJar.myCookies = response.headers['set-cookie'];
}

// 3. Add the saved cookie to the request.
async function request() {
    // read the cookie and set it in the headers
    const response = await axiosInstance.get('http://localhost:3003',
        {
            headers: {
                cookie: cookieJar.myCookies,
            },
        });
    console.log(response.status);
}

login()
    .then(() => request());

axios.defaults一旦获得它,您还可以使用它对所有请求强制执行cookie:

async function login() {
    const response = await axios.post('http://localhost:3003/auth', {});
    axios.defaults.headers.cookie = response.headers['set-cookie']
}

async function request() {
    const response = await axios.get('http://localhost:3003');
}

只要您可以保证在致电login之前request就可以,就可以了。

您还可以探索其他axios功能,例如拦截器这可能有助于将所有与“ axios config”相关的代码保存在一个地方(而不是麻烦您的login函数中的默认值或对login和中的cookie进行调整request)。


拉姆达

AWS Lambda可能会为收到的每个请求生成一个新实例,因此您可能需要注意一些实例生命周期详细信息。

您的选择是:

  1. 什么都不做:您不必担心每次运行lambda都会发送“登录请求”。它对您的响应时间影响不大,另一个api也不介意您发送多个登录请求。另外,另一个api可能会同时存在多个cookie(例如,如果同时登录10个lambda实例)也没有问题。

  2. lambda实例中的缓存:您有一个lambda实例,该实例偶尔会被使用一次,但是通常您在任何时候都不会运行多个实例。您仅出于性能原因而缓存cookie。如果多个lambda实例正在运行,则每个实例将获得一个cookie。当心另一个api不允许多次登录。

    如果这是您需要的,请确保将axios配置放入单独的模块中并导出配置的实例。它将在该一个lambda实例的运行之间进行缓存。此选项与拦截器用法配合使用。

    const instance = axios.create({...});
    instance.interceptors.response.use(() => {}); /* persist the cookie */
    instance.interceptors.request.use(() => {}); /* set the cookie if you have one */
    export default instance;
    
  3. lambda实例之间的缓存:这稍微复杂一些。您将需要在外部缓存cookie。您可以将其存储在数据库中(键值存储,关系型,面向文档-无关紧要),也可以尝试使用共享磁盘空间(我相信lambda实例共享某些目录,例如/tmp,但不能100%确定)。

    您可能需要处理lambda同时被多个请求击中的情况,他们都认为自己没有cookie,因此他们都尝试同时登录。基本上是通常的分布式系统/缓存问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在构造函数中使用lambda时,“ this”引用转义

在Java中使用HTTP请求发送cookie

在默认cookiestore中手动设置cookie并在okhttp请求中使用它

使用CORS请求设置Cookie

使用带有vue.js的axios取消先前的请求

如何在Vue.js中使用Axios设置获取请求的超时

用axios搜索:取消新字符时的先前请求

在mutate函数中使用先前的值

在DRF api上使用axios响应请求将引发错误(禁止设置CSRF cookie)。

在Axios请求中使用Promise

使用axios发送请求时如何设置代理?

使用axios构造函数时模拟axios

在ReactJs和Laravel中使用Axios时请求失败

Axios:在单独的文件中使用baseUrl会导致在axios请求标头中设置身份验证令牌时出现问题

使用React Axios POST请求时未设置Express Session Cookie

在React函数中使用Axios

使用chai在请求上设置cookie

在列表中使用Lambda函数时发生Python:Syntax错误

如何通过在 python 中使用请求来设置 cookie?

在函数中使用请求时 Laravel 控制器错误

开发 AWS Lambda 函数时要在 API Gateway 代理请求事件中使用哪些属性?

无法使用 axios get 请求设置状态?

Javascript - 在新请求中使用先前请求中的数据

nginx:根据标头值在请求中设置 cookie

在 Nodejs 中使用 axios 的多个获取请求

如何使用 Node、Express、Axios 在 ReactJS 前端中使用 JWT 令牌设置 cookie

在 Nestjs 中使用 https 和 Axios 请求

Vue 3 在 vee-validate 中使用 axios 请求时无法设置值

反应使用状态。为什么文档建议在设置状态时传递具有先前状态的函数?