Rails API:使用用户名/密码或facebook令牌从本机移动应用程序验证用户

时间:2013-09-25 02:57:11

标签: ios api rest oauth-2.0 omniauth

所以我现在已经把头发拉了几天,试图找出如何在我的rails mobile API中添加用户名/密码身份验证。

以下是我当前身份验证流程的简要概述:

enter image description here

  1. 用户在移动客户端,客户端上选择“使用Facebook登录” 重定向到Facebook应用并请求access_token

  2. 成功时,Facebook会使用访问令牌和客户端进行响应     重定向回我的应用程序。

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

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

  5. 如果令牌有效,Facebook会将用户数据发送给API     创建新用户的位置。如果用户已存在,我的API会向下发送用户数据。

  6. 我的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发出请求,如下所示:

    enter image description here

    在第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提供商似乎是一个很好的方法,但重定向到浏览器似乎有点愚蠢,我不知道是否可以从浏览器重定向到我的应用程序。

    从头开始验证 这是我想要的选择,但我会重新发明轮子。

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

1 个答案:

答案 0 :(得分:1)

您可能需要查看Warden。无论您使用令牌,密码还是Facebook,Warden都可以轻松设置和使用不同的身份验证策略。它是基于Rack的,所以它也可以在Rails之外工作,如果你想在API中使用像Grape这样的东西,那就太好了。

这是RailsCast on Warden。 (需要专业订阅)