所以我现在已经把头发拉了几天,试图找出如何在我的rails mobile API中添加用户名/密码身份验证。
以下是我当前身份验证流程的简要概述:
用户在移动客户端,客户端上选择“使用Facebook登录” 重定向到Facebook应用并请求access_token
成功时,Facebook会使用访问令牌和客户端进行响应 重定向回我的应用程序。
客户端将访问令牌发送到我的API
我的API使用koala gem来检查访问令牌是否有效。
如果令牌有效,Facebook会将用户数据发送给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
创建用户后,他们可以使用访问令牌向我的API发出请求,如下所示:
在第2步中,API使用koala来验证用户访问令牌。这是通过将以下before_filter应用于所有控制器来完成的。
before_filter :current_user
和我的application_helper.rb
def current_user
@current_user ||= User.authenticate_user_from_facebook(params[:access_token])
end
每当用户向我的API发出请求时,koala gem用于检查令牌是否有效,然后处理请求。
我现在要添加的是仅使用用户名和密码进行身份验证。
我调查过的事情
我一直在提及Railscast 235,209,250,82并阅读OAuth2。我对身份验证的工作方式有基本的了解,但我无法将其应用到我当前的身份验证流程中。
设计令牌身份验证 参考Railscast 235,209和这篇博文: http://matteomelani.wordpress.com/2011/10/17/authentication-for-mobile-devices/
我可以了解如何登录并验证使用用户名和密码登录的用户。但是我对如何与我的Facebook登录流程进行筛选感到困惑。我不明白如何为已经拥有Facebook生成的访问令牌的用户创建一个带有设计的会话。
的OAuth2 让我的API成为一个OAuth2提供商似乎是一个很好的方法,但重定向到浏览器似乎有点愚蠢,我不知道是否可以从浏览器重定向到我的应用程序。
从头开始验证 这是我想要的选择,但我会重新发明轮子。
感谢阅读这篇长篇文章!任何建议表示赞赏!
答案 0 :(得分:1)
您可能需要查看Warden。无论您使用令牌,密码还是Facebook,Warden都可以轻松设置和使用不同的身份验证策略。它是基于Rack的,所以它也可以在Rails之外工作,如果你想在API中使用像Grape这样的东西,那就太好了。
这是RailsCast on Warden。 (需要专业订阅)