保护 Node.js RESTful API

Posted

技术标签:

【中文标题】保护 Node.js RESTful API【英文标题】:Securing Node.js RESTful APIs 【发布时间】:2018-09-13 16:42:48 【问题描述】:

我是 Node.js 的新手,只想用它为我在 Unity3D 中的游戏创建 RESTful API。就在游戏结束时,如果他/她想分享,我想从玩家那里获得一些信息,例如姓名和电话号码等。我知道如何实现这个服务器,但我的问题是安全性。我在 Node.js 中搜索了很多关于安全性的信息,但我还没有弄清楚。在我的搜索中,我看到有一个 npm 包,它是 JWT 并想出了如何使用它。据我所知,我们向服务器发送一个请求,作为响应,它返回一个不记名令牌,我们可以用它设置我们的标头并使用 GET、POST 或其他方法。我的问题是任何人都可以向该 URL 发送请求并获取该令牌并做其他事情(我认为我犯了一个错误)。那么这种服务器的安全解决方案是什么?

【问题讨论】:

【参考方案1】:

有多种身份验证策略(基本、oauth、令牌、cookies)。由于您已经选择了 JWT 策略,我将尝试解释它。

    用户注册(电子邮件、密码、电话、姓名等...) 您的服务器返回一个 201 和一个为该用户 jwt.sign( id: user.id, role: user.role , 'secret', expiresIn: 60 * 60) 签名的 JWT 令牌 然后您可以在路由中添加一个中间件,以验证令牌是否在身份验证标头中以及令牌是否有效。 jwt.verify(token, 'your secret') 由于您在标头中使用令牌,因此您应该使用 HTTPS 来加密您的 http 请求 您还需要一个登录端点来接收 ID 和密码并为该用户生成一个新令牌,因为令牌可能会过期。

通常我使用这个包:https://github.com/auth0/node-jsonwebtoken,你还可以在其中设置加密算法和更多选项。

另一种含图片说明:https://***.com/a/45978644/4120554

【讨论】:

感谢您的回答。游戏中没有任何注册或登录面板。在游戏结束时,如果玩家想要分享,我只想要玩家的电话号码和真实姓名等信息。那么这个策略能做到吗? 您的情况非常具体,因此您不需要特定的身份验证,您只想存储玩过您游戏的用户的数据,对吗?您可以在用户开始游戏时生成一个令牌,然后如果他们共享了他们的数据,则将该令牌发送到服务器。在您的服务器中,您可以验证该令牌是否由您生成。 (很简单的解决方案) 是的,没错。很抱歉问这个问题,但我如何验证该令牌是否由我生成? 我的第二个问题是关于 JWT 策略的,如果客户端之外的人,向服务器发送注册请求(首先可能吗?)然后接收该令牌并将其他信息发送到服务器? 第一个问题:您可以简单地使用只有您知道的私有令牌生成一个令牌,当客户端发送该令牌时,您可以验证该令牌是否由您的服务器签名。第二:如果您的服务器暴露在网络上,每个人都可以向您的 API 发出请求,这就是为什么如果您想处理该请求或返回 401,您需要验证令牌。您的客户不想共享令牌,否则任何人都可以使用它并向您的服务器发出请求,但如果有人提供密码,那也是一样的:D

以上是关于保护 Node.js RESTful API的主要内容,如果未能解决你的问题,请参考以下文章

如何保护移动和 AJAX 调用的 JSON RESTful API?

node js可以进行restful服务调用吗

Node.js 调用 restful webservice

[Node.js] Test Node RESTful API with Mocha and Chai

如何在 Node.js 中最好地创建 RESTful API [关闭]

Node.js RESTful API