【问题标题】:Token authentication with rest backend secure enough具有足够安全后端的令牌身份验证
【发布时间】:2014-08-04 12:51:38
【问题描述】:

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

【问题讨论】:

    标签: authentication playframework ionic-framework


    【解决方案1】:

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

    我不熟悉 play 框架,但您应该咨询框架专家,看看是否有适用于 Play 框架的经过充分测试、久经考验的 oauth2 实现。如果是这样,您想使用它。你真的不想(也不应该)推出你自己的实现,除非你知道你在做什么并且愿意花钱请人来渗透它。真的,如果不确定,请不要这样做。

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

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

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

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

    祝你好运,玩得开心。

    【讨论】:

      猜你喜欢
      • 2013-02-12
      • 2013-08-19
      • 2015-09-02
      • 2017-04-27
      • 2018-11-19
      • 1970-01-01
      • 2013-03-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多