2014-04-01 40 views
0

我想創建一個應用程序,將首次驗證用戶,並使用LinkedIn API將用戶詳細信息保存到數據庫。 用戶下次登錄linkedin時,只需登錄,不必再次將此API數據拉出。如何結合Omniauth和OAuth登錄linkedin並檢索API數據?

爲了達到這個目的,我看到有2個獨立的授權方法,Omniauth(使用omniauth-linkedin gem)和OAuth(使用linkedin Gem)。據我瞭解,Omniauth寶石用於單獨登錄,而LinkedIn gem可用於請求和保存API數據。

下面的控制器工作正常,但有兩個問題,一個用於驗證Omniauth(登錄),第二次驗證Oauth(API pull Linkedin)驗證。

是否有任何方法來結合這兩個授權,以便用戶只需登錄一次linkedin,如果他/她是第一次用戶,它也將直接授權使用OAuth(不知何故,從Omniauth傳遞access_token callback-創建動作到的Oauth回調)

視圖

<%= link_to "Sign in with LinkedIn", "/auth/linkedin" %> 

會話控制器。

def create 
    auth = request.env["omniauth.auth"] 
    user = User.find_by_provider_and_uid(auth["provider"], auth["uid"]) || User.create_with_omniauth(auth) 
    session[:user_id] = user.id 
    redirect_to '/linkedin_oauth_url' 
    end 

    def generate_linkedin_oauth_url 
    if LinkedinOauthSetting.find_by_user_id(current_user.id).nil? 
    client = LinkedIn::Client.new("75xxxxxxxxxxxx", "jaXxxxxxxxxxxx") 
    request_token = client.request_token(:oauth_callback => "http://#{request.host}:#{request.port}/oauth_account") 
    session[:rtoken] = request_token.token 
    session[:rsecret] = request_token.secret 
    redirect_to request_token.authorize_url 
    else 
    redirect_to "/oauth_account" 
    end 
    end 

    def oauth_account 
    client = LinkedIn::Client.new("75xxxxxxxxxxxx", "jaXxxxxxxxxxxx") 
    pin = params[:oauth_verifier] 
    if pin 
     atoken, asecret = client.authorize_from_request(session[:rtoken], session[:rsecret], pin) 
     LinkedinOauthSetting.create!(:asecret => asecret, :atoken => atoken, :user_id => current_user.id) 
    end 
    redirect_to "/session_index" 
    end 

的routes.rb

match '/oauth_account', to: "sessions#oauth_account", via: :get 
    match '/linkedin_oauth_url', to: 'sessions#generate_linkedin_oauth_url', via: :get 

模型(DB模式)

LinkedinOauthSettings

create_table "linkedin_oauth_settings", force: true do |t| 
    t.string "atoken" 
    t.string "asecret" 
    t.integer "user_id" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 

用戶

create_table "users", force: true do |t| 
    t.string "provider" 
    t.string "uid" 
    t.string "name" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 

回答