验证后,Passport.js + Express.js将用户转发到原始目的地

时间:2013-01-02 15:50:10

标签: node.js authentication express passport.js

我的服务器上有Node + Express + Passport,客户端上有jQuery + Backbone.js。客户端在URL中使用哈希标记,但对于某些功能,用户登录是很重要的。

我希望通过网址访问该应用,例如: http://mydomain.com/app#cone/waffle/flavor/mint/toppings/sprinkles这样:

  • 如果用户已经登录,他们会直接转到请求的网址,而无需麻烦
  • 如果用户尚未登录,则会转到/login,然后转到请求的网址

在这篇SO帖子之后, Custom returnUrl on Node.js Passport's Google strategy,我知道了

  • 如果他们已经登录,他们会直接使用URL,哈希标签和所有
  • 如果他们没有被记录,则会将他们带到登录页面,然后到达请求的网址,但是......

登录后似乎从重定向中的原始网址中删除了哈希参数。

在将哈希参数重定向到原始目标时,有没有办法保留哈希参数?

在这篇文章中,Getting hash parameters from request url我认为服务器上没有哈希标签,这是使用哈希标签的全部要点。

所以我怀疑这是不可能的。也许以某种方式在本地缓存params并在重定向时检索它们,比如[original URL minus hastags] + #use-cached-params

2 个答案:

答案 0 :(得分:9)

哈希参数仅限浏览器,不会转到服务器。您可以使用此技术重定向返回,哈希标记和所有:

  • GET / some / page #with / hash
  • 已登录?然后渲染页面
  • 未登录?渲染一个页面上有一些JavaScript,比如'getHash.jade'
  • getHash.jade:复制完整的网址,然后重定向到'/ login& redirect ='+ originalURL
  • GET / login(现在您可以在服务器上保存哈希并从那里获取)

答案 1 :(得分:1)

以下是更详细地捕获锚链接的方法。适用于所有Web框架。

我将使用示例方案来说明:假设我们需要捕获未经身​​份验证的用户请求的深层网址http://server.com /#/ xyz ,以便将其重定向到登录后的深URL。

  1. 未经身份验证的用户请求http://server.com /#/ xyz (“#”以后的所有内容都不会发送到服务器)。

  2. 所有服务器都知道用户想要http://server.com/并且他们未经身份验证。服务器将用户重定向到登录表单。

  3. 这是一个聪明的一点:客户端仍然在等待他们的原始请求,所以如果服务器在登录表单中包含一个隐藏元素,其中一些JS引用了window.location.href,它可以捕获完整的URL < strong>原始请求完成锚点部分:

    <form action="/login" method="post">
      <div>
        <label>Username:</label>
        <input type="text" name="username"/><br/>
      </div>
      <div>
        <label>Password:</label>
        <input type="password" name="password"/>
      </div>
      <!-- XXXXXXXXX CLEVER BIT XXXXXXXXXX-->
      <script>
        document.write('<input type="hidden" name="from" value="'+document.location.href+'"/>');
      </script>
      <!-- XXXXXXXXXX-->
      <div>
        <input class="submit-button" type="submit" value="Submit"/>
      </div>
    </form>
    
  4. 用户对自己进行身份验证,并使用POST发送原始URL。然后,服务器可以将用户转发到原始的深层URL。