我使用Angulars $http
服务来调用后端的数据。让我们说JSON数据。这样做的示例URL类似于:
/get/data
在Angular中执行此操作可以很好地返回请求的数据。没问题。
但即使我使用带有$urlRouterProvider.otherwise('/');
的Angular UI路由器捕获所有其他 Angular路由,我仍然可以访问我的浏览器并输入mydomain.com/get/data
URL我有一页JSON代码。
如何在没有用户身份验证的情况下限制来自Angular的后端服务器调用,而不是来自我的浏览器URL?
N.B。 在节点上使用Express 4.X,我还为我的应用程序提供了一个“全能”的功能。路由到默认返回到我的前端index.html页面,如下所示:
router.get('*', function(req, res) {
res.sendFile(path.join(__dirname, '/index.html'));
});
谢谢!
答案 0 :(得分:2)
我的天啊!花了整个frikin一天来解决这个问题,终于解决了! 狗被抬起头 - 你必须在Angular http请求中指定一个,然后在节点中读取它。
首先 - 路线设置与本指南中的相同:https://scotch.io/tutorials/setting-up-a-mean-stack-single-page-application
在Angular http请求的前端,我指定一个接受的头类型为json:
$http.get('/blog/article', {
headers: {
'Accept': 'application/json;'
}
}).success(function(data) {
console.log(data);
})
.error(function(data) {
console.log('Error: ' + data);
});
在节点I的后端检查标头是否包含json类型。如果是这样,我会回送json数据,因此angular可以接收内容。如果没有,我强制节点加载index.html,控制器从中运行前面提到的带有标头的http请求,确保您获得数据。
app.get('/blog/article', function(req, res) {
if(/application\/json;/.test(req.get('accept'))) {
//respond json
//console.log("serving json data...");
blogItemModel.find({ "_id" : req.query.id }, 'title full_text publish_date', function(err, blog_item){
// if there is an error retrieving, send the error. nothing after res.send(err) will execute
if (err) res.send(err);
res.json(blog_item);
});
} else {
//respond in html
//console.log('Request made from browser adress bar, not through Angular, serving index page...');
res.sendfile('./public/views/index.html');
}
});
答案 1 :(得分:1)
这不是一个有角度的问题。当用户输入mydomain.com/get/data时,他们实际上从未加载角度应用程序,因此您的解决方案必须在其他地方完成。
例如,您可以将其添加到您网站的.htaccess文件中。它会将所有流量重定向到您域的根目录。
在这里查看这个答案: .htaccess Redirect based on HTTP_REFERER
答案 2 :(得分:1)
同意@HankScorpio
Angular应用程序路径和服务器应用程序访问URL路径的Angular UI路由是两回事。
Angular UI路由器允许您在单个页面应用程序中导航,就像您有多页面应用程序一样。这与访问实际的服务器应用程序端点无关。
所有限制都应在Web服务器和服务器Web应用程序端完成。因此,您必须实施一些身份验证/授权策略。
答案 3 :(得分:0)
你不能。
你的角度代码在他们的机器上,在他们的浏览器中运行。
因此,可以欺骗环境,在浏览器请求时捕获数据,在浏览器中编辑应用程序的JS,或其他各种方法。
为什么你还想要这样的限制?