2012-02-20 101 views
1

我們已經連接到Linkedin一段時間,現在已經成功。但是,我們不時會發現一些錯誤,我希望有人能夠幫助解決這個問題。下面是我們的代碼:Linkedin Oauth with Rails

def linkedin_login 
    request_token = Linkedin.client.request_token(oauth_callback: "http://#{SITE_URL}/linkedin/auth/") 
    session[:linkedin_request_token] = request_token.token 
    session[:linkedin_request_secret] = request_token.secret 
    redirect_to request_token.authorize_url 
end 

def linkedin_auth 
    raise "Don't have proper session or oauth_verifier" if session[:linkedin_request_token].blank? or session[:linkedin_request_secret].blank? or params[:oauth_verifier].blank? 
    access_token = Linkedin.client.authorize_from_request(session[:linkedin_request_token], session[:linkedin_request_secret], params[:oauth_verifier]) 
    raise "Nil access token" if access_token.blank? 
    redirect_to linkedin_process_path(token: access_token.first, secret: access_token.second) 
end 

我們打了「加薪‘沒有適當的會話或oauth_verifier’」比我期望的那樣。在查看ENV的錯誤時,這些人沒有從原始方法中設置會話值。我們在應用程序控制器上設置了before_filters,以便初始化會話,所以我知道它是活動的。

我的下一個想法是「request_token」是否生成一個request_token值,我已經嘗試了很多次,並且都帶回了一些東西。我們每天都會收到很多。出現錯誤後,如果用戶再次嘗試,它可以正常工作,這就是爲什麼我很困惑。

有什麼想法可能導致這種情況?

回答

4

根據您的代碼,看起來您每次用戶登錄到應用程序時都會發出請求令牌調用。這不是驗證的正確方法。您只需要一次獲取請求令牌,然後使用它來升級訪問令牌(就像您在linkedin_auth方法中那樣)。從那裏,只需在數據庫中保存訪問令牌和祕密,並在需要爲特定用戶進行API調用時隨時獲取它。

我們的認證在這裏詳細描述更多:https://developer.linkedin.com/documents/authentication

而且,這僅僅是個人喜好,但我喜歡使用的Rails的OAuth的寶石,而不是使用LinkedIn包裝。它使用簡單,重量輕。

只是作爲一個例子,你可以做你的權威性是這樣的:

require 'oauth' 

def auth 

    api_key = 'XXXXXXXXX' 
    api_secret = 'XXXXXXXXX' 
    configuration = { :site => 'https://api.linkedin.com', 
        :authorize_path => 'https://www.linkedin.com/uas/oauth/authenticate', 
        :request_token_path => 'https://api.linkedin.com/uas/oauth/requestToken', 
        :access_token_path => 'https://api.linkedin.com/uas/oauth/accessToken' } 

    consumer = OAuth::Consumer.new(api_key, api_secret, configuration) 

    #Request token 
    request_token = consumer.get_request_token 

    # Output request URL to console 
    puts "Please visit this URL: https://api.linkedin.com/uas/oauth/authenticate?oauth_token=" + request_token.token + " in your browser and then input the numerical code you are provided here: " 

    # Set verifier code 
    verifier = $stdin.gets.strip 

    # Retrieve access token object 
    @access_token = request_token.get_access_token(:oauth_verifier => verifier) 
end 

你只需要調用該方法,當用戶第一次授權您的應用程序。保存其訪問令牌,然後將其用於後續的API調用。請注意,我的示例使用控制檯輸入PIN驗證器。在真實世界的例子中,您希望以編程方式將PIN保存在會話變量或內存中,然後使用它獲取訪問令牌。