Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs Node.js和Angular routing-如何使浏览器URL无法访问REST API_Angularjs_Node.js_Rest_Angular Ui Router - Fatal编程技术网

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

Angularjs Node.js和Angular routing-如何使浏览器URL无法访问REST API,angularjs,node.js,rest,angular-ui-router,Angularjs,Node.js,Rest,Angular Ui Router,我使用Angulars$http服务在后端调用数据。比如说JSON数据。这样做的URL示例如下: /get/data 从内部执行此操作将返回请求的数据。没问题 但是,即使我使用带有$urlRouterProvider的Angular UI路由器捕获所有其他角度路由,我仍然可以在浏览器中键入mydomain.com/get/dataURL,它为我提供了一页JSON代码 如何在没有用户身份验证的情况下限制后端服务器调用仅来自Angular,而不是来自我的浏览器URL N.B. 使用节点上的Expr

我使用Angulars
$http
服务在后端调用数据。比如说JSON数据。这样做的URL示例如下:

/get/data
从内部执行此操作将返回请求的数据。没问题

但是,即使我使用带有
$urlRouterProvider的Angular UI路由器捕获所有其他角度路由
,我仍然可以在浏览器中键入
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'));
});

谢谢

这不是一个真正的角度问题。当用户进入mydomain.com/get/data时,他们从未实际加载angular应用程序,因此您的解决方案必须在别处完成

例如,您可以将其添加到网站的.htaccess文件中。它会将所有流量重定向到您域的根目录

请在此处查看此答案:

这不是一个真正的角度问题。当用户进入mydomain.com/get/data时,他们从未实际加载angular应用程序,因此您的解决方案必须在别处完成

例如,您可以将其添加到网站的.htaccess文件中。它会将所有流量重定向到您域的根目录

请在此处查看此答案:
同意@hankscopio

角度应用程序路径的角度UI路由和服务器应用程序访问URL路径是两件不同的事情

Angular UI router允许您在单页应用程序中导航,就像您拥有多页应用程序一样。这与访问实际的服务器应用程序端点完全不同


所有限制都应在web服务器和服务器web应用程序端执行。因此,您必须实施一些身份验证/授权策略

同意@hankscopio

角度应用程序路径的角度UI路由和服务器应用程序访问URL路径是两件不同的事情

Angular UI router允许您在单页应用程序中导航,就像您拥有多页应用程序一样。这与访问实际的服务器应用程序端点完全不同


所有限制都应在web服务器和服务器web应用程序端执行。因此,您必须实施一些身份验证/授权策略

我的上帝!花了整整一天的时间来解决这个问题,终于解决了! 狗被埋入报头中-您必须在http请求中指定一个,然后在节点中读取它

第一步-布线设置与本指南中的相同:

在Angular http请求的前端,我将接受的头类型之一指定为json:

$http.get('/blog/article', { 
    headers: {
        'Accept': 'application/json;'
    }
}).success(function(data) {
    console.log(data);
})
.error(function(data) {
    console.log('Error: ' + data);
});
在节点的后端,我检查头部是否包含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');    
}

}); 

天哪!花了整整一天的时间来解决这个问题,终于解决了! 狗被埋入报头中-您必须在http请求中指定一个,然后在节点中读取它

第一步-布线设置与本指南中的相同:

在Angular http请求的前端,我将接受的头类型之一指定为json:

$http.get('/blog/article', { 
    headers: {
        'Accept': 'application/json;'
    }
}).success(function(data) {
    console.log(data);
})
.error(function(data) {
    console.log('Error: ' + data);
});
在节点的后端,我检查头部是否包含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');    
}

}); 
你不能

您的角度代码正在他们的机器上、浏览器中运行

因此,用户可以欺骗环境,根据浏览器的请求捕获数据,在应用程序位于浏览器中时编辑应用程序的JS,或者使用各种其他方法

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

你不能

您的角度代码正在他们的机器上、浏览器中运行

因此,用户可以欺骗环境,根据浏览器的请求捕获数据,在应用程序位于浏览器中时编辑应用程序的JS,或者使用各种其他方法


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

你应该看看PassportJS。这会让你开始。我对passport很熟悉,但因为它没有身份验证级别,我想知道除了在应用程序中添加一个全新的安全层之外,它是否可以被修复。身份验证正是你所需要的-无法逃避我很抱歉谢谢你的努力,那我就试试验证吧!无需身份验证,最接近此目的的方法是让angular应用程序发送自定义头,并在后端要求该头。然而,任何试图获取原始数据的人都可能欺骗这一点。另外,原始数据在网络选项卡中很容易获得。你应该看看PassportJS。这会让你开始。我对passport很熟悉,但因为它没有身份验证级别,我想知道除了在应用程序中添加一个全新的安全层之外,它是否可以被修复。身份验证正是你所需要的-无法逃避我很抱歉谢谢你的努力,那我就试试验证吧!无需身份验证,最接近此目的的方法是让angular应用程序发送自定义头,并在后端要求该头。然而,任何试图获取原始数据的人都可能欺骗这一点。另外,原始数据很容易在网络选项卡中获得。这是否仍然允许异步角度请求从应用程序中获取我的数据?这一点很好。我认为不会。我已经编辑了我的答案。Chec