【问题标题】:Linkedin Oauth with Rails使用 Rails 的 Linkedin Oauth
【发布时间】:2012-03-10 22:09:05
【问题描述】:

我们已经成功连接到 Linkedin 一段时间了。但是,我们不时会遇到一些错误,我希望有人可以帮助阐明这一点。这是我们的代码:

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,我已经尝试了很多次,它们都带来了一些东西。我们一天会收到很多这样的东西。报错后,如果用户再试一次,它就可以正常工作,这就是我如此困惑的原因。

有什么想法会导致这种情况吗?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 oauth linkedin


    【解决方案1】:

    根据您的代码,您似乎每次用户登录到您的应用程序时都在进行请求令牌调用。这不是验证的正确方法。您实际上只需要获取一次请求令牌,然后使用它来升级访问令牌(就像您在linkedin_auth 方法中所做的那样)。从那里,只需将访问令牌和机密保存在您的数据库中,并在您需要为该特定用户进行 API 调用时随时获取它。

    这里更详细地描述了我们的身份验证:https://developer.linkedin.com/documents/authentication

    另外,这只是个人喜好,但我喜欢使用 Rails 的 OAuth gem,而不是使用 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 保存在会话变量或内存中,然后使用它来获取访问令牌。

    【讨论】:

      猜你喜欢
      • 2012-12-30
      • 2018-06-24
      • 2019-11-19
      • 1970-01-01
      • 2018-05-31
      • 2016-02-10
      • 1970-01-01
      • 2011-09-11
      • 2013-07-24
      相关资源
      最近更新 更多