【问题标题】:Security with Play! from Outside ApplicationPlay 安全!来自外部应用程序
【发布时间】:2013-02-25 06:01:26
【问题描述】:

我正在使用 Play 编写私有 REST API!我将通过移动应用程序拨打电话,但我对如何保证它的安全感到困惑。

在处理 Play! 文档中的 Yet Another Blog Engine 示例时,我使用了他们的 authentication example,它处理通过浏览器登录的问题。根据我对 Play! 的 Secure 模块的了解,它有助于浏览器会话。此外,我看到的每个 StackOverflow 问题都与网络上的管理模块有关,而且这些问题也与会话有关。

Does the Play! framework have any built in mechanism to prevent session hijacking?

Enforce Https routing for login with play framework

我目前对安全性应该如何工作的理解:

  • 移动应用“登录”到网络应用并获取某种令牌
  • 每次后续调用时,令牌都会附加到 API 调用的末尾
  • 如果移动用户“注销”或令牌过期,Web 应用程序将删除令牌
  • 每个 API 调用都使用 HTTPS 以维护安全

我是否可以从移动应用程序向我使用 Play 创建的 Web 应用程序发出 HTTP 请求!框架同时保持安全?

我是不是错误地处理了整个情况?

这是第一次播放!我创建的应用程序,这是我第一次使用 Heroku。如果它更容易/更有效/更适合解决这个问题,我会反对切换到其他东西。

编辑:另外,在 Play! 的 YABE 教程中,他们似乎以纯文本形式检查密码。只是从一般的角度来看,这不是安全问题吗?

编辑 2: 我查看了 OAuth 提供者信息,似乎可以解决问题。我唯一担心的是 v2.0 存在已知的安全漏洞,而 v1.0 似乎很难实现,因为我只需要移动应用程序和 Web 应用程序之间的安全连接。如果我让每个调用都需要 SSL,我是否可以让每个 Play 方法只将用户名和密码作为参数而完全忽略 OAuth?

【问题讨论】:

  • “在 Play! 的 YABE 教程中,他们似乎以纯文本形式检查密码” - 取决于您所说的纯文本是什么意思。如果是通过 HTTPS,在请求中发送密码是没有问题的。如果他们以纯文本形式将密码存储在数据库中,那就不好了。当教程“为简单起见”完全忽略基本安全性时感到羞耻。
  • 从您使用的链接看来,您使用的是 Play 1.x。有什么理由不使用 2.x?
  • Heroku 默认使用 Play 1.2.4。我现在不知道升级它的原因,时间对于移动应用程序来说是最重要的。

标签: java security heroku playframework


【解决方案1】:

您使用 Web 应用程序对自己进行授权的移动应用程序示例是通过像 OAuth 这样的授权框架实现的。这允许网络应用程序让用户登录,然后向移动应用程序发出访问令牌,以便以该用户的身份发出请求,而移动应用程序不必处理用户的密码。

查看 Play 的 OAuth provider 模块。如果您使用 Google 搜索,您可能会找到一个用于 Play 的 OAuth client 模块,但这是针对 OAuth 的另一端的,它允许您的 Web 应用程序针对第三方提供商进行授权。然后,您将在您的移动应用程序中使用 OAuth 客户端库来处理获取访问令牌。

它甚至可以是用于 OAuth 的通用 Java 库 - Play 2.0 documentation for OAuth 声明它没有提供 OAuth 2.0 模块,因为它非常简单,甚至不需要库。不过有a few Java libraries available

这是一个项目,有人将一些 OAuth 提供者的东西与 Play 放在一起(引用自 this forum post):

https://github.com/mashup-fm/playframework-oauthprovider

【讨论】:

  • 我最初查看了 OAuth,但我觉得我气馁了,因为我只找到了客户端模块信息。在你的最后一句话中,你的意思是说移动应用程序,对吧?所以我会在 Web 应用程序(Play!)中使用 OAuth 提供程序,在移动应用程序中使用 OAuth 客户端?
  • 是的,抱歉,已修复。另请参阅我的补充 - 它不一定是 Play 模块,因为它是一个相当简单的工作流程,您可以自己滚动。
  • 好的,我查看了 OAuth 提供者信息,似乎可以解决问题。我唯一担心的是 v2.0 存在已知的安全漏洞,而 v1.0 似乎很难实现,因为我只需要移动应用程序和 Web 应用程序之间的安全连接。如果我让每个调用都需要 SSL,我是否可以让每个 Play 方法只将用户名和密码作为参数而完全忽略 OAuth?
  • 如果它通过 SSL 并且您愿意在设备上不受保护地存储用户的用户名和密码,您可以这样做。您可能会将其实现为 Play @Before 拦截器,而不是检查每个单独的控制器方法。
  • 如果您要使用用户名/密码路由(如上所述),请善待用户并发送用户名/哈希值。很少有理由以纯文本形式存储密码,而且您真的不需要任何双向加密(如 AES)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 2011-03-10
相关资源
最近更新 更多