1

APIをラップするためのgemを作成しています。このサービスにはいくつかのログインパラメーターが必要なので、すべてのログイン値を渡し、インスタンス変数を使用して保存することで初期化するConnectionクラスを作成しました。これらの値の1つは@secret_access_key、明らかに秘密です。アプリ内では読み取ることができません。しかし、irbでgemをテストしているときに、オブジェクトが返されるときに、他のすべてのインスタンス変数とともに秘密鍵が表示されます。

mws = MWS::Connection.new :access_key => '1', :secret_access_key => 'SECRET!!!', :merchant_id => '3', :marketplace_id => '4'
 => #<MWS::Connection:0x007fbd22acef40 @access_key="1", @merchant_id="3", @marketplace_id="4", @secret_access_key="SECRET!!!">

秘密鍵がHerokuログ、アプリのエラーメッセージ、その他に表示されることを私は妄想しています。

心配する必要がありますか?もしそうなら、この情報を保存または非表示にするための最良の方法は何ですか?

また、私はこれを管理するためにhttparty gemを使用していますが、そのgemでもっと良いことができるでしょうか?

4

2 に答える 2

5

この回避策を使用できます。

class MWS::Connection
  def inspect
    "#<MWS::Connection:#{object_id}>"
  end
end

もちろん、秘密鍵には引き続きアクセスできますが、ログには表示されないはずです。

mws = MWS::Connection.new :access_key => '1', :secret_access_key => 'SECRET!!!', :merchant_id => '3', :marketplace_id => '4'
# => #<MWS::Connection:0x007fbd22acef40>
mws.instance_variable_get(:@secret_access_key) # => 'SECRET!!!'
于 2012-01-08T16:23:12.677 に答える
2
class MWS::Connection
  def initalize(opts)
    ...
    @secret_access_key = Cypher.encypher(opts[:secret_access_key]) if opts[:secret_access_key]
  end

  def secret_access_key
    Cypher.decypher @secret_access_key
  end
end

class Cypher
  def self.encypher(str)
    str + 'fancy_encryption_protocol'
  end

  def self.decypher(str)
    str.sub 'fancy_encryption_protocol$', ''
  end
end
于 2012-01-08T16:23:00.533 に答える