是否有必要为移动应用程序构建单独的API端点以访问Rails Web应用程序?

jia*_*iax 13 authentication api mobile restful-architecture ruby-on-rails-4

我有一个在Ruby on Rails 4中实现的Web应用程序,需要一个Android原生应用程序,我对移动开发真的很陌生.

关于移动网络架构在这种情况下应该是什么样子,我有点困惑.我在网上做了一些研究,似乎有几种方法可以做到这一点,但我仍然有一些问题,我无法找到答案.提前感谢所有指针.

1)我真的需要一个单独的API用于移动应用程序吗?使用我的Rails应用程序的现有控制器有respond_to format.json什么问题?

2)我已经看到一些在线示例建议在Rails应用程序中使用单独的API命名空间来提供移动请求,例如class Api::ApiController < ActionController::Base为新控制器,然后添加namespace :api doroutes.rb.使用这种方法,是否意味着我需要在这个新的名称空间中为移动设备复制相当多的控制器功能?

3)关于身份验证,许多示例建议使用令牌身份验证,内置的Rails会话管理框架对于移动应用程序来说还不够好吗?或者是因为会话cookie在移动应用程序中的工作方式完全不同?

感谢你的时间.

dre*_*-hh 21

没有必要,但就像你说的那样,它被认为是最佳实践.

1 + 2)使用具有respond_to/respond_with逻辑的相同控制器乍一看是一个不错的主意.但是,根据我的经验,我可以说,总有一天API代码开始与HTML客户端代码不同.移动客户端可能具有不同的UI,并且很自然地会像您的Web客户端那样以另一种方式使用您的数据.Web客户端专门用于一个用例,其中API应该更通用,允许多种消费方式.

第二个问题是,您不能依赖移动用户始终拥有最新的应用程序版本,您可以使用Web应用程序.因此,对于HTML应用程序,您可以轻松地引入不兼容的更改,因为您正在提供适当的客户端,而移动API在哪里打破API至少是关注的.也许,你会想要保持向后兼容性,这将使你的所有目的控制器丑陋地狱.如果没有合适的api/v1命名空间,您甚至不能同时拥有两个不同的API版本.

您可以通过保持控制器非常瘦,并将逻辑移到模型中来避免重复逻辑(服务对象也是模型,而不仅仅是Active Records).

3)您的移动HTTP lib很有可能具有适当的自动cookie管理.基于令牌的身份验证再次成为最佳实践.如果它只是cookie中的一个令牌vs session_id,那么胜利就不会太多.我只能认为它会自动抵御CSRF攻击,你可以完全禁用这种保护,因为你的网站用户不会被允许使用API​​,只需登录网站(也许是额外的好处) .使用基于会话的身份验证,您必须在第一个API请求上生成CSRF令牌并在X-CSRF-Tokencookie中设置它.

基于令牌的身份验证的一大优势是它可以扩展到更高的安全性,例如引入过期令牌,HMAC令牌等,而会话身份验证则不然.请参阅使用会话与令牌进行API身份验证

我也鼓励你看看json:api.它来自ember.js的创建者,他们在构建API时考虑过要缩小决策.另一个有趣的事情是active_model_serializers gem.在Rails:Yehuda Katz的下一个五年中给出了它的介绍