我有一个拥有REST api的应用。我想要它,以便可以对REST API进行的唯一请求是源自应用程序本身的请求。我怎样才能做到这一点? 我也在使用node.js + express服务器。
编辑:该应用程序完全是一个公共网络应用程序。
答案 0 :(得分:4)
只需在您的请求中定义标头,它的作用是什么,它只允许来自某个域的请求,并立即拒绝任何其他域。
response.set('Access-Control-Allow-Origin', 'domain.tld');
编辑:如果你真的喜欢网络抓取,你可以做一个功能来仔细检查客户的来源。
function checkOrigin (origin) {
if (origin === "your.domain.tld") {
return true;
} else {
return false;
}
}
/* Handling it in response */
if (checkOrigin(response.headers.origin)) {
// Let client get the thing from API
} else {
response.write("Send them error that they're not allowed to use the API");
response.end();
}
以上示例应该适用于默认的HTTP / HTTPS模块,如果我没有弄错的话,也应该适用于Express。
编辑2:为了支持我的说法,它也适用于Express,我在他们的文档中找到了这个引用;
req(request)和res(响应)是Node提供的完全相同的对象,因此您可以调用req.pipe(),req.on('data',callback)以及其他任何事情。表达参与。
答案 1 :(得分:0)
我建议使用客户端的API密钥。 CORS过滤器太容易规避。
答案 2 :(得分:0)
保护How to implement a secure REST API with node.js
的简单方法以上帖子概述:
因为用户可以创建资源(也就是POST / PUT操作),所以您需要保护您的API。您可以使用oauth或者您可以构建自己的解决方案,但请记住,如果密码很容易被发现,所有解决方案都可能被破坏。基本思想是使用用户名,密码和令牌(即apitoken)对用户进行身份验证。可以使用node-uuid生成此apitoken,并且可以使用pbkdf2对密码进行哈希处理
然后,您需要在某处保存会话。如果将其保存在普通对象的内存中,如果您终止服务器并再次重新启动它,会话将被销毁。此外,这不可扩展。如果您使用haproxy在计算机之间进行负载平衡,或者您只是使用工作程序,则此会话状态将存储在单个进程中,因此如果同一用户被重定向到另一个进程/计算机,则需要再次进行身份验证。因此,您需要将会话存储在一个公共位置。这通常使用redis完成。
当用户通过身份验证(用户名+密码+ apitoken)时,会为会话生成另一个令牌,即accessstoken。再次,使用node-uuid。向用户发送accesstoken和userid。用户ID(密钥)和accessstoken(值)以redis存储,并且过期时间,例如, 1H。
现在,每次用户使用其余的api进行任何操作时,都需要发送用户ID和accessstoken。