2012-02-20 6 views
1

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を生成していたかどうかということでした。何度も試してみました。私たちは、これらの多くを1日に得る。エラーの後、ユーザーが再度試してみるとうまくいくので、私はとても混乱しています。

これを引き起こす原因は何ですか?

答えて

4

コードに基づいて、ユーザーがアプリケーションにログインするたびにリクエストトークンを呼び出すように見えます。それは認証するための適切な方法ではありません。実際には、リクエストトークンを一度だけ取得してから、それを使用して(リンクイン_オートメソッドで行っているように)アクセストークンをアップグレードする必要があります。そこからアクセストークンとシークレットをDBに保存して、その特定のユーザーのAPI呼び出しを行う必要があるときはいつでも取得してください。

当社の認証は、ここでさらに詳細に説明されていますhttps://developer.linkedin.com/documents/authentication

はまた、これは単なる個人的な好みですが、LinkedInのラッパーを使用するのではなく、私はRailsのためのOAuthの宝石を使用して好きです。使いやすく軽量です。

は一例として、この方法あなたの認証を行うことができます。ユーザーが最初にアプリを許可する場合

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をプログラムで保存し、それを使用してアクセストークンを取得したいとします。