1

我有一个 yaml 文件,它存储OAuth::AccessToken通过使用 oauth gem 进行身份验证返回的值。我读了这个文件,以节省自己每次都进行身份验证。

:access_token: !ruby/object:OAuth::AccessToken
  token: 0fXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  secret: eXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  consumer: !ruby/object:OAuth::Consumer
    key: 2aXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    secret: 181XXXXXXXXXXXXXXXXXXXXX
    options:
      :signature_method: HMAC-SHA1
      :request_token_path: /oauth/request_token/
      :authorize_path: /oauth/authorize
      :access_token_path: /oauth/access_token/
      :proxy: 
      :scheme: :header
      :http_method: :get
      :oauth_version: '1.0'
      :site: http://api.mendeley.com
    http_method: :get
    http: !ruby/object:Net::HTTP
      address: api.mendeley.com
      port: 80
      curr_http_version: '1.1'
      no_keepalive_server: false
      close_on_empty_response: false
      socket: 
      started: false
      open_timeout: 30
      read_timeout: 30
      continue_timeout: 
      debug_output: 
      use_ssl: false
      ssl_context: 
      enable_post_connection_check: true
      compression: 
      sspi_enabled: false
      ssl_version: 
      key: 
      cert: 
      ca_file: /etc/ssl/certs/ca-certificates.crt
      ca_path: 
      cert_store: 
      ciphers: 
      verify_mode: 1
      verify_callback: 
      verify_depth: 5
      ssl_timeout: 
  params:
    :oauth_token: 0fXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    oauth_token: 0XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    :oauth_token_secret: efXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    oauth_token_secret: eXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

yaml当我使用gem阅读这个文件时,一切正常。但是我正在使用 Jekyll 并且必须用safe_yamlgem 阅读这个,即使 yaml 似乎正确地指示了课程,当我这样做时:

auth_contents = YAML::load(File.open("auth.yaml"))
$access_token = auth_contents[":access_token"]

$access_token以哈希的形式返回;类声明丢失。这意味着我当然不能应用诸如$access_token.get等之类的方法。我该如何解决这个问题?有什么方法可以说服 ruby​​ 识别正确的类?

4

1 回答 1

2

首先:确保您确实要加载类。在我看来,您控制了 YAML 文件,但如果由于某种原因从您不信任的地方加载它,您可能需要手动反序列化哈希。

也就是说,您可以使用以下命令将受信任类型列入白名单safe_yaml

SafeYAML.whitelist!(OAuth::AccessToken, OAuth::Consumer, Net::HTTP)
于 2013-07-17T04:34:32.137 回答