【问题标题】:Getting "RuntimeError: SSL Session wasn't initialized" error rails获取“RuntimeError:SSL 会话未初始化”错误轨道
【发布时间】:2016-09-21 03:26:23
【问题描述】:

目前,我正在与使用 3-legged OAuth 安全性的 API 进行通信。

为了通信,我每次都需要访问令牌。访问令牌自创建之日起有效期为 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>'

谁能告诉我如何解决这个问题?

【问题讨论】:

    标签: ruby-on-rails oauth


    【解决方案1】:

    当您序列化 AccessToken 对象并将其写入数据库后,SSL 会话不会被持久化。从数据库中检索访问令牌后,您可能需要重新初始化它。

    序列化列通常用于散列和数组,而不是整个类。因此,您可能希望将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')
    

    【讨论】:

    • 我们不能多次使用验证器。
    • 尝试了您的解决方案,但收到 OAuth::Unauthorized: 400 Bad Request 错误。
    • 没有看到完整的回溯和随附的代码,很难调试。但是,现在您收到的是 400 错误,而不是 RuntimeError: SSL Session was not initialized,因此该错误可能来自您要连接的 API。您应该检查该 API 的文档并确定它返回 400 的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-14
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多