gpt4 book ai didi

node.js - Chrome 获取 Set-cookie header 但未将其放入新请求中

转载 作者:行者123 更新时间:2023-12-05 06:12:42 27 4
gpt4 key购买 nike

我正在开发一个移动应用程序,前端使用 React Native,后端使用 NodeJs。我为这个应用程序设置了一个身份验证机制。后端工作正常。我已经和 postman 一起测试过了。使用正确的数据登录请求后,服务器在“Set-cookie” header 中向我发送一个 cookie。然后我把我的下一个请求 header 作为“cookie”,我得到了我的数据。但是,当我使用 React Native 部分时,它的工作方式有所不同。我目前正在使用 Chrome 浏览器 来测试应用程序,我可以看到浏览器从登录请求的响应中获取了一个 set-cookie header ,(另外我还看到服务器使用用户创建了一个新的 cookie其中的信息)。但是对于下一个请求(比如它的“/home”),它不会发回 cookie,因此服务器无法识别用户并创建一个新的 cookie(其中没有用户信息)并返回 403 响应。

人们建议您应该执行一些解决方案。我在这里分享这些,但没有一个对我有用。

  1. 在您的请求或 axios 对象中加入 withCredentials: true(没有解决问题)
  2. 为服务器中的cookie设置httpOnly:false(没有解决问题)
  3. 将 corsOptions 设置为 var corsOptions = { origin: '*',credentials: true,exposedHeaders: ["Set-Cookie"]}; (还是不行)
  4. 我也使用universal-cookie库从前端获取cookie数据,但也无法获取cookie值
  5. 在 url 中使用 127.0.0.1 而不是“localhost” 也不起作用(有人说 cookie 在一级域中不起作用)

这是我的 React Native - Axios 代码

const axiosObj = axios.create({
baseURL:"http://localhost:3000/",
headers: {
'Content-Type': 'application/json',
},
responseType: 'json',
withCredentials: true,
});

export function get(url){
return new Promise(function(resolve,reject){
axiosObj.get(url).then(res => {
console.log(res)
return res.data
})
})
};

export function post(url,data){
return new Promise(function(resolve,reject){
axiosObj.post(url,data).then(res => {
console.log(res.headers)
const cookies = new Cookies(res.headers.cookie);
console.log("document cookie",document.cookie)
console.log(cookies.getAll());
resolve(res)
})
})
}

后台是相关代码

 var app = express();
app.use(cookieParser('keyboard cat'));


var corsOptions = {
origin: '*',
credentials: true,
exposedHeaders: ["Set-Cookie"]
};
app.use(cors(corsOptions))
app.use(logger('dev'));
app.use(express.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(express.urlencoded({ extended: false }));
app.use(express.static(path.join(__dirname, 'public')));

//session settings
app.use(session({
genid: (req) => {
console.log('Inside the session middleware')
console.log(req.sessionID)
return uuidv4(); // use UUIDs for session IDs
},
store: new FileStore(),
secret: 'keyboard cat',
resave: false,
saveUninitialized: true,
cookie: { httpOnly: false,
expires: new Date(Date.now() + (30 * 86400 * 1000))}
}))

这是登录后我在服务器上的 session 文件

{"cookie":{"originalMaxAge":2591995208,"expires":"2020-09-22T20:22:56.993Z","httpOnly":false,"path":"/"},"passport":{"user":{"_id":"5f307fc99f5c667918a56122","username":"test","__v":0}},"__lastAccess":1598214181785}

这里可能是什么问题?有什么想法吗?

编辑:我从前端 (JS) 了解到未达到“Set-cookie”是正常的。 (虽然在某些网站上说可以在 cookie 设置中加入 httpOnly: false 就可以解决这个问题)。因此,如果我没有到达前端代码中的 header ,实际上并不重要。我的响应 header 中有“set-cookie” header ,chrome 无法识别该 cookie 并将其放入 f12 的 cookies 部分(也没有在 req.header 中设置)。 就是这样问题在这里

编辑 2:我对我的问题有一些想法。

  • 由于我正在使用 React Native 并且它不应该在 Chrome 浏览器中工作,所以它可能以某种方式导致浏览器未设置 cookie。我将创建一个 React 项目并尝试从那里访问 cookie。 => 我解决了与那个问题无关的问题。虽然我在测试 React 应用程序时解决了问题

  • 我的 react-native 代码出现“service-worker.js”错误。看起来它不会影响代码的功能,但它可能会以某种方式影响这种 cookie 情况 => 解决问题后我仍然遇到此错误,因此与此无关。

我还尝试了一个针对 cookie 的 React native 应用程序 (react-native-cookie),但它的代码仅适用于 android 或 ios,因此不适用于浏览器。

最佳答案

我解决了我的问题。看起来我的代码有 2 个问题。第一个是在具有 cors 设置的服务器中。第一个版本是这样的:

var cors = require('cors');
var corsOptions = {
origin: '*',
credentials: true,
exposedHeaders: ["set-cookie"]
};
app.use(cors(corsOptions))

所以基本上我使用 cors 模块进行设置。当我为测试创建一个 React 应用程序时,我遇到了一个 cors 错误(源错误)。不知何故,我的 cors 设置不适用于库。所以我用下面的代码更改了这段代码。

app.use(function (req, res, next) {
// Website you wish to allow to connect
res.setHeader('Access-Control-Allow-Origin', '*');
// Request methods you wish to allow
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
// Request headers you wish to allow
res.setHeader('Access-Control-Allow-Headers', 'Origin,X-Requested-With,content-type,set-cookie');
// Set to true if you need the website to include cookies in the requests sent
// to the API (e.g. in case you use sessions)
res.setHeader('Access-Control-Allow-Credentials', true);

// Pass to next layer of middleware
next();
});

我仍然有一些 cors 错误。您可能遇到 cors 错误的另一个原因是 chrome 同源策略。我使用的是 Windows 10,所以我打开下面的搜索栏并粘贴到那里

 chrome.exe --user-data-dir="C://Chrome dev session" --disable-web-security

打开了一个没有网络安全策略的新 chrome 浏览器。然后我的 React 应用程序运行良好。我可以使用 document.cookie 访问 cookie,也在应用程序选项卡下的 f12 >> cookies 中,我可以看到我的 cookie。所以谷歌浏览器保存了我的cookie。在同一个 chrome 窗口中,我运行了我的 native react 应用程序,它也成功运行。所以我认为这只是因为 chrome 的安全策略和更改我的 cors 设置,我又开始出错。

总而言之,我必须改变两件事。

  1. Cors 模块不工作,我手动设置了 header 并且它们工作正常。
  2. 我不得不禁用 Chrome 的同源策略

关于node.js - Chrome 获取 Set-cookie header 但未将其放入新请求中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63551902/

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