2013-07-17 47 views
1

我有一个yaml文件,存储通过使用oauth gem进行身份验证返回的OAuth::AccessToken值。我读了这个文件来保存我自己的验证每一次。从safe_yaml读取红宝石对象时获取正确的类

: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读这个文件时,一切正常。但我使用杰基尔并与safe_yaml宝石阅读本在,即使在YAML似乎正确地决定了类,当我这样做:

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

我得到$access_token回为一个散列;类声明丢失。这意味着我当然不能使用像$access_token.get等方法。我该如何解决这个问题?有什么方法说服红宝石认识正确的课程?

回答

2

首先:确保你真的想在课堂上加载。在我看来,你似乎控制着YAML文件,但如果它出于某种原因从某个你不信任的地方加载,你可能想要手动反序列化散列。

这就是说,你可以用whitelist trusted typessafe_yaml

SafeYAML.whitelist!(OAuth::AccessToken, OAuth::Consumer, Net::HTTP) 
+0

完美,谢谢。是的,文件是在本地控制的。 – cboettig