我想創建一個應用程序,將首次驗證用戶,並使用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