そのため、レール モバイル 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、および次のブログ投稿を参照する Devise Token Authentication : http://matteomelani.wordpress.com/2011/10/17/authentication-for-mobile-devices/
ユーザー名とパスワードでログインするユーザーをログインおよび検証する方法を理解できます。ただし、それが私の Facebook のログイン フローとどのように調和するかについては混乱しています。Facebook によって生成されたアクセス トークンを既に持っているユーザーに対して、devise でセッションを作成する方法がわかりません。
OAuth2 API を OAuth2 プロバイダーにするのは良い方法のように思えますが、ブラウザーにリダイレクトするのはばかげているようで、ブラウザーからアプリにリダイレクトできるかどうかはわかりません。
最初からの認証 これは私が使用することを考えているオプションですが、車輪を再発明することになります.
この長い投稿を読んでくれてありがとう!どんなアドバイスでも大歓迎です!