2012-06-12 33 views
0

在我session_controller.rb我有這樣的:的Rails 3 LinkedIn寶石(如何獲得令牌後跨視圖操作認證)

require 'linkedin' 

class SessionController < ApplicationController 

    def connect 

    # get your api keys at https://www.linkedin.com/secure/developer 
    client = LinkedIn::Client.new(APP_CONFIG['linkedin']['apikey'], APP_CONFIG['linkedin']['secret_key']) 
    request_token = client.request_token(:oauth_callback => 
             "http://#{request.host_with_port}/session/callback") 
    session[:rtoken] = request_token.token 
    session[:rsecret] = request_token.secret 

    redirect_to client.request_token.authorize_url 

    end 

    def callback 

    client = LinkedIn::Client.new(APP_CONFIG['linkedin']['apikey'], APP_CONFIG['linkedin']['secret_key']) 
    if session[:atoken].nil? 
     pin = params[:oauth_verifier] 
     atoken, asecret = client.authorize_from_request(session[:rtoken], session[:rsecret], pin) 
     session[:atoken] = atoken 
     session[:asecret] = asecret 
    else 
     client.authorize_from_access(session[:atoken], session[:asecret]) 
    end 

    redirect_to 'users/index' 

    end 

end 

這工作得很好,我現在的問題是如何在檢查'用戶/索引'行動無論用戶是否已經通過Linkedin的OAuth流程?下面是我想要做的開始:

class UsersController < ApplicationController 
     respond_to :html, :js, :json 

     def index 
      if authenticated? 
       # set up a new LinkedIn client and show profile data 
      else 
       redirect_to 'session/connect' 
      end 
     end 

     ... 

    private 
     def authenticated? 
      # what should i do here?   
      # return true if the user authenticated 
      # return false if not 
     end 

我知道我可能應該檢查是否有一定的價值在會話設置,但我不知道我在找到底是哪一個。我知道將來我可能會推動'認證'?方法,所以它被稱爲所有的意見,但是這是好的。

任何幫助?謝謝!

回答

2

我處理這個問題的方法是將atoken和asecret值保存到我的用戶數據庫中的一列。然後,當我需要檢查用戶是否已經通過Linkedin的OAuth流程時,我會檢查這些變量是否存在。我的回調方法與添加兩行來存儲atoken和asecret非常相似。

def callback 
    @user = current_user 
    client = LinkedIn::Client.new("API Key", "Secret Key") 
    if session[:atoken].nil? || session[:atoken]=="" 
     @pin = params[:oauth_verifier] 
     atoken, asecret = client.authorize_from_request(session[:rtoken], session[:rsecret], @pin) 

     #Used to Store atoken and asecret for user 
     current_user.update_attribute(:link_tok, atoken) 
     current_user.update_attribute(:link_sec, asecret) 

    else 
     client.authorize_from_access(current_user.link_tok, current_user.link_sec) 
    end 

    sign_in @user 
    flash.now[:success] = "You can now import data from LinkedIn to complete your profile"  
    render 'settings' 
end 

而且,只是一個供參考,LinkedIn大約有第三方應用程序,從他們的API用戶數據保存,所以你需要確保你擁有所有正確的權限在地方,你這樣做之前,有嚴格的政策。

+0

+1謝謝你的回答,抱歉,遲到的迴應。我會試試這:) – botbot