Passport.js + Express.jsauthentication后将用户转发到原来的目的地

我有一个应用程序,是在服务器上的Node + Express + Passport和客户端上的jQuery + Backbone.js。 客户端使用URL中的哈希标签,但对于某些function来说,重要的是用户login。

我希望应用可以通过URL访问,例如http://mydomain.com/app#cone/waffle/flavor/mint/toppings/sprinkles ,以便:

  • 如果用户已经login,他们直接去请求的URL没有麻烦
  • 如果用户还没有login,他们去/login ,然后去请求的URL

在这个SOpost之后, 在Node.js Passport的Google策略上自定义returnUrl ,我已经这么做了

  • 如果他们已经login,他们直接去URL,哈希标签和所有
  • 如果他们没有logging,它会把他们带到login页面,然后到请求的url,但…

它似乎从login后redirect的原始url中去掉散列参数。

有没有办法保存哈希参数时redirect到原来的目的地?

从这篇文章, 从请求url获取散列参数我得到的想法是散列标签不可用在服务器上,这是使用散列标签的整个点。

所以我怀疑这是不可能的。 也许caching在本地参数不知何故,检索他们redirect,说[original URL minus hastags] + #use-cached-params

哈希参数是仅浏览器,他们不会去服务器。 你可以使用这个技术来redirect回来,散列标签和所有:

  • GET / some / page#with / hash
  • login? 然后渲染页面
  • 未login? 渲染一个有一些JavaScript的页面,说'getHash.jade'
  • getHash.jade:复制完整的URL,然后redirect到“/ login&redirect ='+ originalURL
  • GET /login(现在你可以把散列保存在服务器上并从那里拿走)

这里是如何捕获锚链接更详细一点。 适用于所有Web框架。

我将使用一个示例场景来说明:假设我们需要捕获未经身​​份validation的用户请求的深层URL http://server.com /#/ xyz ,以便他们可以在login后redirect到该深层URL。

  1. 未经身份validation的用户请求http://server.com /#/ xyz (从#开始的所有内容都不会发送到服务器)。

  2. 所有的服务器知道的是,用户希望http://server.com/ ,他们是未经authentication的。 服务器将用户redirect到login表单。

  3. 这里是聪明点:客户端仍然在等待原来的请求,所以如果服务器在login表单中包含一个隐藏的元素与一些引用window.location.href的JS,它可以捕获完整的原始请求的 URL主播部分:

     <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. 用户对自己进行身份validation,并使用POST发送原始URL。 然后,服务器可以将用户转到原始的深层URL。