使用Node Express和Passport捕获锚链接/路由
许多JavaScript框架利用锚标签在SPA内build立路由。 是否有可能捕获锚路由保存在我的会话存储进行身份validation?
例如,利用快递和护照,我有:
routes.js
//node stuff above app.get('/', auth.savePath, pages.index);
auth.js
exports.savePath = function (req, res, next) { if (!req.isAuthenticated()) { req.session.returnPath = req.originalUrl return res.redirect('/login') } next() }
req.originalUrl不捕获锚path,只有应用程序path和查询stringvariables – 任何想法? 我没有看到任何可以让我捕获这些信息的快速文档。
散列片段(您称之为锚点)永远不会发送到浏览器,因此您无法捕获它。 要么改变你的URLscheme不使用散列片段,或者甚至更好:使用客户端库来执行客户端的逻辑。 存在许多这样的库,通常称为“客户端路由器”。
你可以使用app.param
来解释这个
以下是一些代码。 req.params.id捕获“id”。
app.param('id', /^\d+$/); app.get('/user/:id', function(req, res){ res.send('user ' + req.params.id); });
使用Angular-ui-router ,我相信你可以解决以上的目的:
var myApp = angular.module('myApp', ['ui.router']); myApp.config(function($stateProvider, $urlRouterProvider) { // Now set up the states $stateProvider .state('/', { url: "/", templateUrl: "partials/loginQuestion" })
快速路由器将包含如下内容:
app.get('/partials/:name', function (req, res) { var name = req.params.name; console.log(name); res.render('partials/' + name); });
我最近不得不这样做:login后redirect到散列URL。 我的解决scheme是从document.location.hash中捕获散列片段,并将其存储在login表单的隐藏字段中。 然后在护照本地策略function,我捕捉它
req.flash('redirectHash' : req.body.myHiddenFieldName).
身份validation后,默认redirect到我的主页,但在该路线我检查,看看是否req.flash('redirectHash')
为空; 如果它不为空,我用它来完成我的redirect到所需的位置。
没有跨浏览器testing,但在铬中工作。
这里是如何捕获锚链接。 适用于所有Web框架。
我将使用一个示例场景来说明:假设我们需要捕获未经身份validation的用户请求的深层URL http://server.com /#/ xyz ,以便他们可以在login后redirect到该深层URL。
-
未经身份validation的用户请求http://server.com /#/ xyz (从#开始的所有内容都不会发送到服务器)。
-
所有的服务器知道的是,用户希望http://server.com/ ,他们是未经authentication的。 服务器将用户redirect到login表单。
-
这里是聪明点:客户端仍然在等待原来的请求,所以如果服务器在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>
-
用户对自己进行身份validation,并使用POST发送原始URL。 然后,服务器可以将用户转到原始的深层URL。