我正在尝试使用Devise
/ Rails
应用iOS
实施用户身份验证。我遇到了麻烦,因为我主要是Devise的“用户”,并且正在将它用于纯网络应用程序,所以不需要为幕后发生的事情烦恼太多。现在我必须为基于API的应用程序构建身份验证,这完全是一个不同的世界。
我已经阅读了网络上每个处理此主题的教程(由于token_authenticatable
已被弃用,但大多数已过时)但仍然无法理解我需要做什么。
我还阅读了原来的GitHub
关于this issue的要点,但仍然不明白他们在谈论什么。
我确信那里的人和我一样只是Devise
的“用户”,所以不知道幕后发生了什么。
任何人都可以为移动应用程序实现基于API的身份验证系统提供简洁的解决方案吗?我的意思是它不可能那么复杂,Devise
过去非常棒,因为我需要做的只是运行rails generate
,但这对我来说是个噩梦。
答案 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应用中。根据您在应用中使用的框架,这可能与下面的代码不同。
我在此示例中使用了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)您不受其他开发人员的假设约束。
答案 4 :(得分:0)
您可以结合使用devise gem和doorkeeper gem来支持Web和移动身份验证。
例如,我使用设计来注册用户并处理忘记密码和电子邮件确认流程。对于移动客户端,我使用门卫gem作为oauth2提供商来保护我的api。门卫宝石支持许多oauth2授权流程,我建议你可以看看这些。
这里a link!开始