我正在尝试创建一个可以通过ajax和传统形式的请求发布数据的应用程序。我对在网上找不到有关该主题的信息感到惊讶。我想这些天我们都假设我们可以访问客户端JS?
我参加了快速会议,但是对于确定实际发生的事情有多么困难,我感到沮丧。据我了解,它是在客户端上缓存cookie数据,并以某种方式自动将其包含在请求中?那么可以安全地假设没有客户端JavaScript支持,这种格式将无法工作吗?
给定这样的形式:
<form method="post" action="/create">
<input name="value1" onChange={this.handleInput} value={this.state.value1} />
<button onClick={this.submitForm}
</form>
我通过ajax发送的请求将通过auth(由于具有会话数据):
event.preventDefault();
postUrl(`/create`, {value1: this.state.value1})
.then(jsonRes => {
// works
});
被使用快速会话和通行证的身份验证中间件接收:
module.exports.secured = (loginUrl = "/employers") => {
return (req, res, next) => {
if ( (req.isAuthenticated()) ) { return next(); }
req.session.returnTo = req.originalUrl;
res.redirect(loginUrl);
return next();
};
};
它保护了用于创建的非常简单的api路由:
router.post('/create', secured(), (req, res) => {
我的想法是,即使启用了JS,我也可以按此路由处理请求,但是问题在于身份验证。
我该怎么做才能在这些“非js”请求中发送会话数据?
我记得在传统的Web堆栈(如Rails或PHP)中,某种令牌在隐藏字段中或在渲染操作中被渲染到表单中。如果这行得通,有谁知道如何获取“重要数据”,以便从快速会话中说出并作为令牌发送?不可能?
在服务器端渲染中解析的req对象的
req.cookies
或req.session
中,我看不到任何有用的东西。 最佳答案
我该怎么做才能在这些“非js”请求中发送会话数据?
通常,对您登录名的响应将发送一个Set-Cookie
标头,以指示客户端应存储该cookie,这意味着它将用于标识自己。
谁存储饼干?它不是JavaScript而是浏览器,因此,如果您使用curl
或抓取工具,则您的客户端将必须获取返回的Cookie,并将其包含在后续请求中
您在表单中提到的令牌不是用于身份验证,而是用于跨站点请求伪造,这意味着由于您提供了令牌(并以某种方式将其存储在服务器端),因此您将仅接受包含所述令牌的登录请求(证明有人导航到您网站的登录页面),以防止其他未登录到您的网站或客户端尝试发布信息(例如:抓取工具)
此外,会话不一定意味着认证,现代框架倾向于发出会话,无论是否通过认证