2012-02-20 72 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保存在会话变量或内存中,然后使用它获取访问令牌。