Rails API:使用用户名/密码或Facebook令牌从原生移动应用程序authentication用户

所以我一直拉我的头发了几天,现在试图找出如何添加用户名/密码authentication到我的轨道移动API。

以下是我目前身份validationstream程的简要概述:

在这里输入图像说明

  1. 用户在移动客户端select“使用Facebooklogin”,客户端redirect到Facebook应用并请求access_token

  2. 成功的时候,Facebook使用访问令牌进行响应,客户端redirect到我的应用程序。

  3. 客户端将访问令牌发送到我的API

  4. 我的API使用考拉gem来检查访问令牌是否有效。

  5. 如果令牌有效,则Facebook将用户数据发送到创build新用户的API。 如果用户已经存在,我的API会发送用户数据。

我的API在第4步中处理访问令牌,如下所示:

def self.authenticate_user_from_facebook(fb_access_token) user = User.new graph = Koala::Facebook::API.new(fb_access_token) profile = graph.get_object('me') #user['fb_id'] = profile['id'] #user['fb_token'] = fb_access_token # Generate user hash uhash = Hash.new uhash['provider'] = 'facebook' uhash['uid'] = profile['id'] uhash['info'] = Hash.new uhash['info']['nickname'] = profile['username'] uhash['info']['name'] = profile['name'] uhash['info']['email'] = profile['email'] uhash['info']['first_name'] = profile['first_name'] uhash['info']['last_name'] = profile['last_name'] uhash['info']['verified'] = profile['verified'] uhash['info']['urls'] = Hash.new uhash['info']['urls']['Facebook'] = profile['link'] uhash['credentials'] = Hash.new uhash['credentials']['token'] = fb_access_token uhash['extra'] = Hash.new uhash['extra']['raw_info'] = Hash.new #Save the new data user = User.apply_auth(uhash) return user end def self.apply_auth(uhash) User.where(:uid => uhash['uid'], :provider => uhash['provider']).first_or_create do |user| user.provider = uhash['provider'] user.uid = uhash['uid'] user.nickname = uhash['info']['nickname'] user.email = uhash['info']['email'] user.name = uhash['info']['name'] user.first_name = uhash['info']['first_name'] user.last_name = uhash['info']['last_name'] end end 

一旦用户被创build,他们可以使用他们的访问令牌向我的API发出请求,如下所示:

在这里输入图像说明

在步骤2中,API正在使用考拉来validation用户访问令牌。 这是通过将以下before_filter应用于所有控制器完成的。

 before_filter :current_user 

并在我的application_helper.rb

 def current_user @current_user ||= User.authenticate_user_from_facebook(params[:access_token]) end 

每次用户向我的API发出请求时,考拉gem用于检查令牌是否有效,然后处理请求。

我现在试图添加的是只有用户名和密码的身份validation。

我已经看过的东西

我一直在不断地提到Railscast 235,209,250,82和阅读OAuth2。 我对authentication的工作原理有了一个基本的了解,但是我很难将其应用到我当前的authenticationstream程中。

devise令牌authentication参考Railscast 235,209和这个博客文章: http : //matteomelani.wordpress.com/2011/10/17/authentication-for-mobile-devices/

我可以理解如何login和validation使用用户名和密码login的用户。 不过,我很困惑这将如何与我的Facebookloginstream。 我不明白如何为已经拥有由Facebook生成访问令牌的用户创build一个会话。

OAuth2使我的API是一个OAuth2提供者似乎是一个好方法,但是redirect到浏览器似乎很傻,我不知道是否有可能从浏览器redirect到我的应用程序。

从头authentication这是我正在考虑的select,但我会重新发明轮子。

感谢您阅读这篇长文章! 任何build议表示赞赏!

你可能想看看守望者 。 无论您使用代币,密码还是Facebook,守望者都可以轻松设置和使用不同的身份validation策略。 它是基于机架的,所以它也可以在Rails之外工作,如果你想使用像Grape这样的API,

这是监狱长的RailsCast 。 (需要专业订阅)