Rails API和原生移动应用程序authentication

我知道有很多关于这个话题的信息,但我找不到任何最新的信息。 我看到这样的主题涉及到rails和android身份validation,但我看到TokenAuthenticatable现在从devise中删除 。

我的问题很简单:是否有一种很好的方法来使用Rails 4从本机Android和iPhone应用程序validation用户? 有谁知道很好的教程或提供解决scheme的文章?

亚当·怀特添加赏金:

我刚刚在这个问题上打开了500金币,因为我找不到从iOS应用程序到Rails API的用户身份validation的正确方法。 这是我正在考虑做的,但不知道它是否安全?!:

我们假设我们有一个Userlogging。 用户已经注册了一个已经在数据库中创build了Userlogging的帐户,其中包含一个email列和一个password_digest列。

当用户login时,我希望该用户在移动应用上保持身份validation状态,直到明确退出。

我想我们将需要一个基于令牌的authentication。 我可能创build一个ApiKeylogging,当User被创build并且保存为Userlogging中的一个关联。

当用户login/注册时,响应将包含一个API令牌(类似于SecureRandom.hex ),该令牌将被保存在iOS密钥链中,并与所有后续请求一起用于validation用户,方法是将用户传入头并validation就像是:

 before_filter :restrict_access private def restrict_access authenticate_or_request_with_http_token do |token, options| ApiKey.exists?(access_token: token) end 

这是安全的吗? 我是否应该用每个请求刷新令牌并将其包含在回复中?

我还有什么其他的select? Facebook,Twitter和Pinterest喜欢做什么?

我知道OAuth2.0,但不是为了授予外部应用程序吗?

是否有gempipe理这些?

对不起,这里完全不确定。

500最好的答案。

Solutions Collecting From Web of "Rails API和原生移动应用程序authentication"

从我的研究的一个解决scheme的要点。 随意编辑,更正,无效等

 SessionsController < ApplicationController skip_before_filter :authenticate_user, :only => [:create] def create user = User.where("username = ? OR email = ?", params[:username_or_email], params[:username_or_email]).first if user && user.authenticate(params[:password]) api_key = user.find_api_key if !api_key.secret_key || api_key.is_expired? api_key.set_expiry_date api_key.generate_secret_key end api_key.save render json: api_key, status: 201 else status: 401 end end 

注意ApiAuth.authentic? 方法和请求对象。 该请求必须在客户端上使用HMACalgorithm进行签名。

 ApplicationController < ActionController::Base respond_to :json force_ssl protect_from_forgery with: :null_session before_filter :authenticate_user private def authenticate_user if authenticate_user_from_secret_key return true else head :unauthorized end end def authenticate_user_from_secret_key userid = ApiAuth.access_id(request) currentuser = userid && User.find_by_id(userid) if ApiAuth.authentic?(request, currentuser.find_api_key.secret_key) return true else return false end false end 

用户创build/注册

 UsersController < ApplicationController skip_before_filter :authenticate_user, :only => [:create] def create user = User.create(user_params) if !user.new_record? render json: user.find_apit_key, status: 201 else # error end end 

Api关键模型。 类似于#352 railscast中的API密钥模型,唯一的区别是ApiAuth密钥的生成。

 class ApiKey < ActiveRecord::Base before_create :generate_secret_key, :set_expiry_date belongs_to :user def generate_secret_key begin self.secret_key = ApiAuth.generate_secret_key end while self.class.exists?(secret_key: secret_key) end 

用户模型。

 class User < ActiveRecord::Base has_secure_password before_save :ensure_api_key has_many :api_keys def find_api_key self.api_keys.active.ios.first_or_create end 

在客户端,必须使用HMACalgorithm来签署请求。

代码来自:[SHA1 HMAC密钥生成/authentication] https://github.com/mgomes/api_auth [控制器和模型] https://github.com/danahartweg/authenticatable_rest_api

您处于正确的轨道上,但用户的标记只能用于标识哪个用户发出请求。 您仍然需要某种身份validation,因为当您猜测每个请求上的令牌被更改时,黑客可能会拦截数据stream,获取令牌,然后在随后的请求中“成为”该用户。

通过更改每个请求的标记,可以消除拦截问题,但是一旦有人截获了令牌,他们就可以通过继续拦截甚至修改响应来进一步利用系统。 对此的一个解决scheme是使用HMAC(由Amazon Web Services使用)。 它是一种为请求提供签名(散列)的algorithm,对于每个请求都是唯一的,不需要更改密钥,也不能为将来的请求预测。

在rails中有一个ruby gem,在服务器端实现HMAC来签署HMAC请求,并且在进行服务器到服务器的通信时生成它们。 对于客户端到服务器的请求,您需要在iOS或Android端生成签名,并在服务器上进行身份validation。

考虑ApiAuth gem来完成服务器端的工作。 在iOS客户端,考虑生成签名的HBHMAC库。 看一下ApiAuth的具体实现,因为它为数据添加了一个时间戳以防止重放攻击,所以在将数据传递给HBHMAC之前,可能需要添加一个字段。

总之,使用HMACauthentication将通过利用单向哈希algorithm来避免中间人攻击和重放攻击,即使他们能够拦截有效的请求,也可以防止攻击者生成可信的请求。

我有这个问题,我是一个API开发人员。 你可以用令牌和自定义授权的方式做到这一点,但是我会告诉你我们用我们的应用程序来做什么,这个应用程序是以六位数的forms为用户服务的。

至less在iOS上,设备将为您处理会话,这意味着如果iOS应用上的/users/sign_in使用参数向/users/sign_in发出POST请求

 user: { password: 'mypassword', email: 'testuser@example.com', remember_me: true # optional } 

iOS设备将为您安全持久地存储会话。

现在,如果你想要去OAuth 2路线,我实际上维护了一个名为OAuth 2的rails 4 gem,我添加了一个非常酷的function,允许你让用户通过“授权”屏幕,因为显然如果你开发的软件,你不需要用户确认他们信任你。

如果您决定使用OAuth 2,则需要使用所谓的隐式访问令牌。 这是一个漫长而无聊的OAuth2规范

rails 4项目可以在github上findhttps://github.com/bwheeler96/devise-oauth2-provider-rails4

如果你不在4号轨道上,你可以使用原来的gem https://github.com/socialcast/devise_oauth2_providable

顺便说一句,gem需要工作,所以如果有人读这个谁想要帮助改善,请通过一切手段叉这个存储库

如果你想在rails上使用OAuth2.0,你可以使用Doorkeeper,你可以在这里看到一个例子(不是免费的):

http://railscasts.com/episodes/353-oauth-with-doorkeeper

但是你可以在SecureRandom.hex中使用一个标记,一个例子(不是免费的)在这里(在6级):

https://www.codeschool.com/courses/surviving-apis-with-rails

我希望我的回答能帮助你!