Linkedin OAUT с Rails - PullRequest
       3

Linkedin OAUT с Rails

1 голос
/ 20 февраля 2012

Мы уже некоторое время успешно подключаемся к 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, и я пробовал много раз, и все они приносятчто-то назад.Мы получаем много таких в день.После ошибки, если пользователь пытается снова, он работает нормально, поэтому я так растерялся.

есть мысли о том, что может вызвать это?

1 Ответ

4 голосов
/ 06 октября 2012

Исходя из вашего кода, похоже, что вы делаете запрос токена каждый раз, когда пользователь входит в ваше приложение. Это не правильный метод аутентификации. Вам действительно нужно получить токен запроса только один раз, а затем использовать его для обновления токена доступа (как вы делаете это в методе linkedin_auth). Оттуда просто сохраните токен доступа и секретный ключ в своей БД и извлекайте его в любое время, когда вам нужно сделать вызов API для этого конкретного пользователя.

Наша аутентификация более подробно описана здесь: https://developer.linkedin.com/documents/authentication

Кроме того, это всего лишь личное предпочтение, но мне нравится использовать гем OAuth для Rails, а не использовать оболочку 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-код в переменной сеанса или в памяти, а затем использовать его для получения токена доступа.

...