bar*_*dog 6 security authentication node.js ios jwt
我最近一直在努力解决我正在制作的iOS应用程序的安全性和用户身份验证问题,主要问题是如何允许用户注册任何第三方服务(或本机用户帐户)并仍然保持安全和模块化的过程.
我提出的解决方案非常复杂,我不是百分之百确定是否所有这些都是最佳实践,所以我想我会问我并得到任何建议和指示我可以解决的问题,什么工作正常,什么是坏的等等.
首先是认证问题.我喜欢将认证的概念与用户的想法分开.对我来说,身份验证是由设备或客户端执行的,独立于特定用户,而用户帐户是由于该身份验证而创建或检索的内容.这允许您做的是将客户端的身份验证视为一个进程,然后对用户进行身份验证(检查帐户是否存在等),以便有两层安全性.比如说客户端成功验证但是用户密码错误,整体验证失败并且松散耦合这两个概念是有益的.
为了实现身份验证,出于多种原因,我使用JWT(JSON Web令牌)而不是cookie.1)它们在移动设备上工作得更好2)是无会话的,这使得服务器实现变得更加容易,并且据我所知,它不受CORS攻击.在使用移动设备时,JWT似乎是更好的解决方案.我使用了很多npm库,最明显的是express-jwt和jsonwebtoken来在服务器端进行身份验证.
正如我上面提到的,我不仅尝试执行身份验证,还希望允许用户注册他们想要的任何第三方服务,例如Facebook,Twitter,以减少注册期间的用户摩擦.在考虑了一段时间并且谷歌搜索了很多之后,我想出了身份提供者的想法,身份提供者是一种身份验证系统,其中每个"帐户类型"被视为一个单独的身份提供者,并被推广为提供诸如access_token之类的信息,user_id,到期数据等.身份提供者很像你在许多应用程序设置页面中看到的"链接帐户".在iOS方面,我创建了一个抽象类,对于我想要支持的每个服务,我创建了一个具体的子类FacebookIdentityProvider,LocalIdentityProvider(电子邮件/密码)等.
在服务器端,我使用Passport模块来支持每种身份提供者.例如,他们有一个Facebook的令牌模块,一个是用户的电子邮件和密码等,所以我做了一个API的路线/authenticate,我们的客户主动要求与序列化的身份提供,且基于标识字符串,local,facebook-token,护照会召唤适当的子模块,用于根据提供的信息验证该提供者.
总的来说,安全流程如下所示:
verify端点发出请求.此端点将验证令牌是否仍然有效且未过期.refresh_token使用过期令牌向我的端点发出请求,该令牌将尝试重新发出令牌.如果失败,则客户端向我的authenticate端点发出请求,该请求只能由于用户操作而被调用.完成所有这些并完成后,我对一些事情仍然有点模糊.首先,我在express-jwt页面上阅读了有关撤销令牌的内容.什么时候我应该撤销令牌并让用户再次登录?每次无限期到期时,不断刷新令牌是没有意义的.
其次,当我将序列化身份提供者发送到服务器时,我会传递一份额外信息字典,这些信息将由护照用于根据流程进行身份验证.如果成功,则为该用户创建身份提供者并将其存储在数据库中.是否足够或者我应该使用access_token以及我从成功通话中获得的其他字段做得更多?特别是使用Facebook SDK,当客户端通过应用程序进行身份验证时,我会获得访问令牌,然后当客户端再次通过服务器进行身份验证时,我会获得另一个令牌.
我有一个额外的想法是有人通过标头或查询参数集成了每个请求传递的api密钥.api密钥将保密并在客户端保护.我认为这样做会为尚未完成身份验证过程的客户端添加另一层"身份验证".只有具有api-key的客户端才能够首先到达我的api,并且只有那些客户端才能尝试进行身份验证.
我的背景是正式的网络安全(我从来没有任何好处)和现在全栈移动开发,所以我对这些东西有更好的把握,然后大多数,但我觉得好像我没有做一些潜在的危险漏洞.我很遗憾不能发布代码,因为这是我的业务,但如果有什么我没有说清楚,只是评论,我很乐意详细说明.
另外我觉得我应该提一下,所有这些都是通过SSL完成的,我使用Nginx进行配置,所有iOS网络请求都是使用Overcoat完成的.最终我想使用Nginx作为负载均衡器,但那是另一天的帖子.
我最近刚用过类似的东西。撤销在 JWT 中被误解了,在客户端请求刷新令牌之前,您无法“撤销”它,您可以拒绝对特定令牌的请求,但在使用 Restful 服务器过期之前,您无法将其从客户端设备中删除。好吧,在客户端应用程序中,如果您收到服务器的拒绝,您当然可以删除令牌。
移动应用程序的问题是,您不想打扰用户不必要地询问身份验证数据,而且如果用户丢失设备或更换设备,他/她自然希望撤销旧设备的访问权限:
您可以将哈希密码保存在令牌中(加密),并且在每个请求中,您可以检查令牌中保存的哈希密码是否与数据库中用户记录中的相同。
您可以在数据库中使用另一个表来保存用户 ID、令牌 ID、设备信息、撤销字段(真/假)。您只需简单地跟踪此表中已撤销的令牌,当设备在过期时使用已撤销的令牌请求刷新时,您只需返回错误,并且您也可以从表中删除此行,因为过期的令牌不再是问题。
希望这可以帮助。
| 归档时间: |
|
| 查看次数: |
513 次 |
| 最近记录: |