我正在尝试创建一个可以通过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.cookiesreq.session中,我看不到任何有用的东西。

最佳答案

我该怎么做才能在这些“非js”请求中发送会话数据?

通常,对您登录名的响应将发送一个Set-Cookie标头,以指示客户端应存储该cookie,这意味着它将用于标识自己。

谁存储饼干?它不是JavaScript而是浏览器,因此,如果您使用curl或抓取工具,则您的客户端将必须获取返回的Cookie,并将其包含在后续请求中

您在表单中提到的令牌不是用于身份验证,而是用于跨站点请求伪造,这意味着由于您提供了令牌(并以某种方式将其存储在服务器端),因此您将仅接受包含所述令牌的登录请求(证明有人导航到您网站的登录页面),以防止其他未登录到您的网站或客户端尝试发布信息(例如:抓取工具)

此外,会话不一定意味着认证,现代框架倾向于发出会话,无论是否通过认证

10-05 20:46
查看更多