Node.js和Angular routing - 如何使浏览器URL无法访问REST API

时间:2015-03-04 22:40:29

标签: angularjs node.js rest angular-ui-router

我使用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'));
});

谢谢!

4 个答案:

答案 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,或其他各种方法。

为什么你还想要这样的限制?