使用新设备对移动应用进行身份验证

时间:2014-01-21 03:46:34

标签: ruby-on-rails authentication mobile devise

我正在尝试使用Devise / Rails应用iOS实施用户身份验证。我遇到了麻烦,因为我主要是Devise的“用户”,并且正在将它用于纯网络应用程序,所以不需要为幕后发生的事情烦恼太多。现在我必须为基于API的应用程序构建身份验证,这完全是一个不同的世界。

我已经阅读了网络上每个处理此主题的教程(由于token_authenticatable已被弃用,但大多数已过时)但仍然无法理解我需要做什么。

我还阅读了原来的GitHub关于this issue的要点,但仍然不明白他们在谈论什么。

我确信那里的人和我一样只是Devise的“用户”,所以不知道幕后发生了什么。

任何人都可以为移动应用程序实现基于API的身份验证系统提供简洁的解决方案吗?我的意思是它不可能那么复杂,Devise过去非常棒,因为我需要做的只是运行rails generate,但这对我来说是个噩梦。

5 个答案:

答案 0 :(得分:3)

我正在做同样的事情,

为此你必须使用令牌认证而不是简单 设计,在gemfile中添加以下gem

  # Use device for authentication
    gem 'devise'
    gem 'simple_token_authentication'

按照文件simple_token_authentication

Use Api like this

curl -v https://example.com/users/sign_in -X POST -H "Accept: application/json" -H "Content-Type: application/json" -d '{"user": {"login": "7838712847" ,"password": "8489", "mobile_type": "ios", "mobile_key": "APA91bG6G4UvjeCWvb8mMAH1ZO3I-8FB3nkRPyCHnwZiXgd16HK18GgoV5n7gjJtZNs038iaFGutzdxnhes3WyaXEX52-xmOyvuEK8S1abBdpuhD9AD5bzLWeu-1Ow_yZRTVg3Nypz1z"}}'

I am using mobile number to login so customize gem according your need

如果不能正常工作,请告诉我(邮寄给我:er.mukeshsharma.rj21@gmail.com)

答案 1 :(得分:1)

最近,我们还必须为我们的webapp设置基于令牌的身份验证(用于API访问) - 我们也偶然发现它已从Devise中删除。

我们选择了Simple Token Authentication,效果非常好。

答案 2 :(得分:1)

在Rails应用程序中使用Devise进行身份验证时,这是一种非常适合我的方法。如果首先测试令牌(您可以通过任何iOS,Android,...应用程序设置令牌)并回退到您的网络用户的默认身份验证方法。

滑轨

将自己的令牌添加到用户模型,方法是添加:api_token字符串列,并使用每个用户的唯一值填充该列。使用Digest :: SHA1的某些用户数据(如id + email)是一个很好的起点,但是在生成唯一令牌时你可以(而且应该)疯狂。

创建一个通过该令牌进行身份验证的方法。您可以将它添加到主ApplicationController以便于访问(不要忘记将该方法放在控制器的私有部分中);

def authenticate_user_by_token
  @api_token = request.headers['HTTP_AUTHORIZATION']

  if @api_token.present? && @user = User.find_by_api_token(@api_token)
    sign_in @user
    return @user
  else
    return false
  end
end

接下来创建一个(私有)方法,并在使用过滤器方法之前将此方法链接到设计(例如:authenticate_user!)。将其放在与上述方法相同的控制器中,以便于访问;

def authenticate_by_token_or_devise!
  return authenticate_user! unless authenticate_user_by_token
end

现在替换当前的before_filter调用:authenticate_user!到新创建的; :authenticate_by_token_or_devise !,就像这样;

before_filter :authenticate_by_token_or_devise!

或者,从 rails 4 Rails 4: before_filter vs. before_action)开始,使用before_action;

before_action :authenticate_by_token_or_devise!

的iOS

现在,您所要做的就是将该令牌添加到您的iOS应用中。根据您在应用中使用的框架,这可能与下面的代码不同。

我在此示例中使用了AFNetworking(https://github.com/AFNetworking/AFNetworking)。这是您在AFHTTPRequestOperationManager中设置Authorization标头标记的方式,以便将其添加到您发出的每个请求中。

NSString *apiToken = @"your-token-here";
[[_manager requestSerializer] setValue:apiToken forHTTPHeaderField:@"Authorization"];

可选

此外,您可以创建一个允许访问基于令牌的身份验证的前置过滤器方法(例如,如果您有一组只需要使用令牌访问的/ api路由),就像这样;

def authenticate_user_by_token!
  if !authenticate_user_by_token
    render nothing: true, status: :unauthorized and return
  end
end

答案 3 :(得分:0)

当我最近实施API时,我勉强遵循建议使用基于机架的身份验证宝石Warden。我的感觉是,需要您编写自己的身份验证的身份验证gem已被破坏。但是这个宝石提供了恰到好处的控制水平。我唯一的抱怨是gem不能很好地处理POST参数。 I was able to work around it,但这种关注应由(IMO)由宝石处理。

使用它之后,我强烈推荐这个gem适用于任何需要非通用身份验证的场景。滚动您自己的身份验证策略是一种乐趣,因为(a)它非常简单,(b)您不受其他开发人员的假设约束。

为了帮助您入门,here is my config/initializers/warden.rb file

答案 4 :(得分:0)

您可以结合使用devise gem和doorkeeper gem来支持Web和移动身份验证。

例如,我使用设计来注册用户并处理忘记密码和电子邮件确认流程。对于移动客户端,我使用门卫gem作为oauth2提供商来保护我的api。门卫宝石支持许多oauth2授权流程,我建议你可以看看这些。

这里a link!开始