Получение "RuntimeError: сеанс SSL не инициализирован"

В настоящее время я общаюсь с API, который использует трехстороннюю защиту OAuth.

Для связи мне нужен токен доступа каждый раз. Ток доступа действителен в течение 1 года с даты создания.

Я сохранил его в базе данных (сериализованный объект класса AccessToken).

Но при вызове API я получаю следующую ошибку. Вот мой основной поток

1) Получить access_token

consumer = OAuth::Consumer.new API_KEY,
  API_SECRET,
  {
  site: 'https://example.com',
  header: { Accept: 'application/nd.v3+json' },
  http_method: :get,
  request_token_url: @request_token_uri,
  access_token_url: @access_token_uri,
  authorize_url: @authorizerequest_token_uri
  }

  puts '***** Fetching request token *****'
  request_token = consumer.get_request_token({}, 'oob')
  puts "Request Token received - #{request_token.token}"
  puts
  puts 'Goto to url mentioned below to authorize. Paste the access token verifier'
  puts request_token.authorize_url

  verifier = gets.chomp
  puts
  puts
  puts '***** Fetching access token *****'
  access_token = request_token.get_access_token(oauth_verifier: verifier)

2) Храните файл access_token в базе данных

access_token_user.rb

  class AccessTokenUser < ActiveRecord::Base
    belongs_to :user
    serialize :access_token
  end

  atu = AccessTokenUser.create(user_id: 1, access_token: access_token)

3) Извлеките токен, и мы его вызываем API

access_token = AccessTokenUser.find_by(user_id: 1).access_token

access_token.get('/organizations')

При получении подробностей организаций я получаю следующую ошибку

RuntimeError: SSL Session wasn't initialized.
        from /home/test/.rvm/rubies/ruby-2.0.0-p643/lib/ruby/2.0.0/net/http.rb:916:in `time'
        from /home/test/.rvm/rubies/ruby-2.0.0-p643/lib/ruby/2.0.0/net/http.rb:916:in `connect'
        from /home/test/.rvm/rubies/ruby-2.0.0-p643/lib/ruby/2.0.0/net/http.rb:862:in `do_start'
        from /home/test/.rvm/rubies/ruby-2.0.0-p643/lib/ruby/2.0.0/net/http.rb:851:in `start'
        from /home/test/.rvm/rubies/ruby-2.0.0-p643/lib/ruby/2.0.0/net/http.rb:1373:in `request'
        from /home/test/.rvm/gems/ruby-2.0.0-p643/gems/oauth-0.4.7/lib/oauth/consumer.rb:161:in `request'
        from /home/test/.rvm/gems/ruby-2.0.0-p643/gems/oauth-0.4.7/lib/oauth/tokens/consumer_token.rb:25:in `request'
        from /home/test/.rvm/gems/ruby-2.0.0-p643/gems/oauth-0.4.7/lib/oauth/tokens/access_token.rb:12:in `request'
        from /home/test/.rvm/gems/ruby-2.0.0-p643/gems/oauth-0.4.7/lib/oauth/tokens/access_token.rb:27:in `get'
        from (irb):18
        from /home/test/.rvm/gems/ruby-2.0.0-p643/gems/railties-4.0.13/lib/rails/commands/console.rb:90:in `start'
        from /home/test/.rvm/gems/ruby-2.0.0-p643/gems/railties-4.0.13/lib/rails/commands/console.rb:9:in `start'
        from /home/test/.rvm/gems/ruby-2.0.0-p643/gems/railties-4.0.13/lib/rails/commands.rb:62:in `<top (required)>'
        from bin/rails:4:in `require'
        from bin/rails:4:in `<main>'

Может ли кто-нибудь сообщить мне, как я могу исправить эту проблему?

Ответ 1

Сеанс SSL не сохраняется после сериализации объекта AccessToken и записи его в вашу базу данных. Возможно, вам придется повторно инициализировать токен доступа после извлечения из базы данных.

Сериализованные столбцы обычно используются для хэшей и массивов, а не для целых классов. Поэтому вы можете захотеть сохранить access token verifier в таблице access_token_users вместо самой access_token, а затем вызвать:

 verifier = AccessTokenUser.find_by(user_id: 1).verifier
 request_token = consumer.get_request_token({}, 'oob')
 access_token = request_token.get_access_token(oauth_verifier: verifier)
 access_token.get('/organizations')