具有休息后端的令牌认证足够安全

时间:2014-08-03 15:48:57

标签: authentication playframework ionic-framework

我想保护我的移动应用程序(混合应用程序,使用离子框架构建)。在后端站点我使用play框架。我会实施以下案例。应用程序的用户应通过电子邮件和密码进行身份验证以休息后端,如果凭据更正后端生成令牌,则将生成令牌返回到客户端,否则后端返回错误请求。如果用户尝试使用不正确的凭据登录超过10次,则用户将停用1小时。 移动应用程序将使用ajax调用从后端加载json数据,在标头中的每个调用中将设置字段'X-AUTH-TOKEN'和生成令牌。后端检查令牌,如果令牌是正确的,客户端从状态为ok的服务器获取数据,否则客户端将获取无数据并且状态未经授权。如果用户注销,则令牌将在服务器端和客户端销毁。只要用户登录,令牌就不会改变,在最坏的情况下,令牌不会超过很多天。我可以实现,在每次调用时,最后一次调用的日期可以保存,如果最后一次调用超过x天,则服务器返回未授权并销毁令牌。因此用户应该登录。案例是否足够安全,还是应该实现更多逻辑?

1 个答案:

答案 0 :(得分:1)

您所描述的内容与OAuth2的许多实现非常相似,如果不相同的话。有关这些类型的流程(包括图表)的更多信息,请查看Google如何在此处描述其OAuth2流程:https://developers.google.com/accounts/docs/OAuth2

我不熟悉游戏框架,但您应该与框架专家交谈,看看是否有针对Play Framework的经过充分测试,经过严格考验的oauth2实现。如果是这样,你想要使用它。你真的不想(也不应该)推出你自己的实现,除非你知道你正在做什么,并愿意付钱给人们进行测试。真的,如果不确定,请不要这样做。

在Ionic Framework / Angular / Cordova方面,您基本上是正确的,但应始终考虑一些基本的安全注意事项:

我的猜测是你使用本地存储来存储访问令牌。在REST中,我们没有传统Web服务器场景中的会话,因此我们使用令牌代替会话。当然,缺点是如果有人在设备上拥有root访问权限并且能够以自己的方式进入应用程序沙箱并且确切地知道从本地存储中获取什么api密钥,则可以轻松地检查本地存储以获取访问密钥。如果某人拥有对设备的root或物理访问权限,那么你就会遇到更大的问题,所以这不是一个设计缺陷。在某种程度上,使用此方法,您依赖于操作系统/浏览器的本地存储沙箱,以防止其他应用访问您的离子应用中的本地存储。这是我愿意做的赌注,但你需要根据你的安全性和可用性需求来判断。

你真正应该关注的是保护令牌免受可能正在听电话的人(想想咖啡店的无线网络)。这意味着将auth rest服务器设置为仅使用HTTPS(不要故障回复到HTTP)。这可能有缺点,但值得保护用户的数据。您还使用令牌标头正确识别。除了标题或POST数据之外,您不应该传递任何身份验证令牌。

一般来说,您所描述的内容应该可以安全地用于消费级应用。这假设您不会在应用中无意中使用任何恶意第三方代码。与往常一样,您应该特别警惕第三方代码,并且只使用您绝对信任的代码。从应用程序内部运行的任何代码都可以访问Cordova /浏览器本地存储沙箱中的本地存储,理论上可以导出api令牌以用于其他软件以访问您的API。话虽如此,你问的是身份验证而不是授权。请记住,您的用户只需要有权根据用户角色或某种ACL在应用中执行某些操作。此授权超出了本答案的范围,但您需要确保在服务器端完成此操作,并对共享资源进行速率限制或软删除,以防止恶意用户删除所有内容。

离子好运,玩得开心。