Web客户端和移动REST api安全性的推荐配置

时间:2012-01-28 22:13:46

标签: django mobile oauth-2.0 restful-authentication django-piston

我意识到关于这个问题有很多问题,我现在已经研究了几天了。我想确保我的问题尽可能具体,因为我还没有充分了解最佳方法。

目前我有一个开发的django网站,网络客户端可能通过django-piston json REST api进行大约95%的通信。另外5%是一些重新登录功能,仍然通过具有CSRF保护的POST表单。理想情况下,我想将其余部分也移到REST API中。

我现在正处于需要找到最佳推荐解决方案的地步,以便以可重用且愉快地共存的方式保护Web客户端和移动客户端(应用程序尚未开发)。我已经阅读了很多帖子,最终为移动端推荐OAuth2(和https),但我仍然对如何设置Web客户端安全性感到困惑。我也在理解OAuth2方面以及我是否可以使用双腿形式。就目前而言,Web客户端是经过django身份验证的。从技术上讲,jsonp功能在活塞中仍然有效,所以我认为任何人都可以使用第三方应用程序的api,只要他们的网络会话有auth cookie?

我的api用法摘要:

  1. API是服务器应用程序的完全私有界面
  2. 如果第三方Web客户端mashup无法广泛重用API,那将是理想的。
  3. 数据不是necc敏感的。它只是一个社交类型的网站,其中最个人的信息是电子邮件,地址等基本用户档案。
  4. 我的问题摘要:

    1. OAuth2是保护移动应用访问安全的最佳推荐方法吗?它与Web客户端方面有什么关系吗?如果推荐OAuth2,它应该是应用程序版本的应用程序版本吗?
    2. Web客户端是否应该使用通过ajax传递的CSRF,并且只是禁用jsonp以确保其始终相同的来源?基本上,我是否单独处理Web客户端安全性?
    3. 我应该如何组织网址/应用实例/子域或建议维护网络与移动安全的任何内容?我是否只需要单独的网址前缀,一个用于使用不同规则的移动设备?
    4. 我正在寻找解决这些问题的django-piston特定建议。我已经分支了我的项目,并开始使用这个分叉版本的活塞:https://bitbucket.org/jespern/django-piston-oauth2

      我有一个想法是创建一个活塞资源,首先检查它是否同源,然后只强制执行django auth,否则它强制执行oauth2,但我不确定这是否合适。

      2012年1月1日更新

      根据Spike提供的信息,我开始使用piston-oauth2。我最终创建了一个fork来为nonrel django(mongodb)添加一些修复程序,我分叉了一些例子也使用了oauth2和活塞:

      https://bitbucket.org/justinfx/django-piston-oauth2-nonrel-example

      现在只是我的一个问题,真正把它连接到我自己的项目并让它工作。但这些测试都很有效。

1 个答案:

答案 0 :(得分:4)

我全都是OAuth2,所以我会根据该解决方案回复。

  

OAuth2是保护移动应用程序的最佳推荐方法   访问?它与Web客户端方面有什么关系吗?而如果   如果它是应用程序范围的密钥,则建议使用OAuth2   版本与应用程序版本?

是的,OAuth2目前被广泛认为是推荐的方法。它比OAuth1容易得多。我建议实际阅读the spec而不是关于规范的博客文章,因为规范本身写得很清楚。除了规范之外,查看已建立的实现(例如Facebook'sFoursquare's是有用的,因为它们不会以各种方式遵循规范,而是进行一些修改以使其更实用且易于使用。

对于版本的发布版本,从教条的REST角度来看,这是frowned upon。但是,从更务实的角度来看,这是非常常见的做法,使API开发人员和客户端的生活变得更加简单。我建议阅读Apigee博客,因为他们有很多关于versioning等主题的帖子。

  

Web客户端是否应该使用通过ajax传递的CSRF   禁用jsonp以确保其始终相同的原点?基本上,我   单独处理Web客户端安全性?

如果您使用完整的oauth2解决方案,则需要启用跨站点api请求。要拒绝您不知道的应用程序,您可以在查看传入的access_tokens时添加对此的检查。这里有一些关于您拥有的不同选项的阅读:

http://blog.apigee.com/detail/crossing_the_streams_handling_cross-site_api_requests/

  

我应该如何组织网址/应用实例/子网域或   什么建议维护网络与移动安全?我   只需要单独的url前缀,一个用于使用不同的移动设备   规则?

决定什么对你有用。如今,很多人的移动网站都在“m.mysite.com”或“mobile.mysite.com”。如果您使用完整的OAuth2实现,则此决定与整个身份验证讨论无关。

  

我正在寻找django-piston特定的解决方案   这些问题。我已经分支了我的项目并开始玩   用这个分叉版的活塞:   https://bitbucket.org/jespern/django-piston-oauth2

我不熟悉这个,因为我使用tastypie。如果它不适合您,我使用了一个优秀的Django OAuth2独立服务器:

https://github.com/hiidef/oauth2app