12

そのため、レール モバイル API にユーザー名/パスワード認証を追加する方法を見つけようと、数日間頭を悩ませてきました。

以下は、現在の認証フローの簡単な概要です。

ここに画像の説明を入力

  1. ユーザーがモバイル クライアントで「Facebook でログイン」を選択すると、クライアントは Facebook アプリにリダイレクトし、access_token を要求します。

  2. 成功すると、Facebook はアクセス トークンで応答し、クライアントはアプリにリダイレクトされます。

  3. クライアントはアクセス トークンを API に送信します

  4. 私の API はkoala gem を使用して、アクセス トークンが有効かどうかを確認します。

  5. トークンが有効な場合、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、および次のブログ投稿を参照する Devise Token Authentication : http://matteomelani.wordpress.com/2011/10/17/authentication-for-mobile-devices/

ユーザー名とパスワードでログインするユーザーをログインおよび検証する方法を理解できます。ただし、それが私の Facebook のログイン フローとどのように調和するかについては混乱しています。Facebook によって生成されたアクセス トークンを既に持っているユーザーに対して、devise でセッションを作成する方法がわかりません。

OAuth2 API を OAuth2 プロバイダーにするのは良い方法のように思えますが、ブラウザーにリダイレクトするのはばかげているようで、ブラウザーからアプリにリダイレクトできるかどうかはわかりません。

最初からの認証 これは私が使用することを考えているオプションですが、車輪を再発明することになります.

この長い投稿を読んでくれてありがとう!どんなアドバイスでも大歓迎です!

4

1 に答える 1

1

Wardenを調べるとよいでしょう。Warden を使用すると、トークン、パスワード、Facebook のいずれを使用する場合でも、さまざまな認証戦略を簡単にセットアップして使用できます。これは Rack ベースなので、Rails の外でも動作します。これは、API に Grape のようなものを使用したい場合に便利です。

これが Warden 上のRailsCastです。(Proサブスクリプションが必要です)

于 2013-09-26T17:26:02.100 に答える