没有客户端JavaScript的服务器端渲染

时间:2019-01-31 02:07:02

标签: javascript reactjs express

我正在尝试创建一个可以通过ajax和传统形式的请求发布数据的应用程序。我对在网上找不到有关该主题的信息感到惊讶。我想这些天我们都假设我们可以访问客户端JS?

我参加了快速会议,但是对于确定实际发生的事情有多么困难,我感到沮丧。据我了解,它是在客户端上缓存cookie数据,并以某种方式自动将其包含在请求中?那么可以安全地假设没有客户端JavaScript支持,这种格式将无法工作吗?

给出如下形式:

 ^     
 (?:
      #  1.00  -  1.99
      1
      \.
      (?:
           0 \d 
        |  [1-9] \d 
      )
   |  
      #  2.00  -  10.00
      (?:
           [2-9] 
        |  10
      )
      \.00
 )
 $

我通过ajax发送的请求将通过auth(由于具有会话数据):

<form method="post" action="/create">
    <input name="value1" onChange={this.handleInput} value={this.state.value1} />
    <button onClick={this.submitForm}
</form>

被使用快速会话和通行证的身份验证中间件所提取:

event.preventDefault();
    postUrl(`/create`, {value1: this.state.value1})
    .then(jsonRes => {
       // works
});

可保护用于创建的非常简单的api路由:

module.exports.secured = (loginUrl = "/employers") => {
    return (req, res, next) => {
        if ( (req.isAuthenticated()) ) { return next(); }
        req.session.returnTo = req.originalUrl;
        res.redirect(loginUrl);
        return next();
    };
};

我的想法是,即使启用了JS,我也可以在此路由上处理请求,但是问题在于身份验证。

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

我记得在Rails或PHP之类的传统Web堆栈中,某些令牌在隐藏字段中或在渲染操作中被渲染到表单中。如果这行得通,有谁知道如何获取“重要数据”,以便从快速会话中说出并作为令牌发送?不可能吗?

查看在服务器端渲染中解析的req对象的router.post('/create', secured(), (req, res) => { req.cookies,我看不到有什么用处。

1 个答案:

答案 0 :(得分:1)

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

通常,对您登录名的响应将发送一个Set-Cookie标头,以指示客户端应存储所述cookie,这意味着它将被用来识别自己的身份

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

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

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