从模型访问 Rails 凭据



我有以下工作:

key = "xD1x9CxAAxFB/xF3xD7x10xAFxBAx97x97x00xDAxBFxC1xCExD6xCB*xCCxF4w<2xEA=ox1EYx16xE5"
attr_encrypted :client_id, key: key

然后我用这个密钥进行加密。

我尝试将相同的密钥存储在带引号和不带引号的凭据中,但似乎我无法从模型中访问它们

我试过了:

key_1 = Rails.application.credentials.dig(:encrypt, :xenon_a_1).to_s
attr_encrypted :client_id, key: key_1

key_1 = Rails.application.credentials.dig(:encrypt, :xenon_a_1)
attr_encrypted :client_id, key: key_1.to_s

并且两者都没有.to_s

我尝试通过以下两种方式使用 .to_s:

凭据:

encrypt:
xenon_a_1: "xD1x9CxAAxFB/xF3xD7x10xAFxBAx97x97x00xDAxBFxC1xCExD6xCB*xCCxF4w<2xEA=ox1EYx16xE5"

encrypt:
xenon_a_1: xD1x9CxAAxFB/xF3xD7x10xAFxBAx97x97x00xDAxBFxC1xCExD6xCB*xCCxF4w<2xEA=ox1EYx16xE5

我知道我的凭证设置正确,因为我能够从中使用 AWS、PayPal、Stripe 和 Braintree。

我只能假设,凭据无法从模型中访问吗?

我在传递表单时收到的错误与我的密钥为空或不是 32 位时收到的错误相同。

假设您的模型如下所示:

class Foo
key_1 = 'bar'
end

那行不通。该变量也可能不存在,因为您无法在类中的其他位置调用它。例如:

class Foo
key_1 = 'bar'
def self.baz
puts key_1
end
def baz
puts key_1
end
end

测试它:

Foo.new.baz
NameError: undefined local variable or method `key_1' for #<Foo:0x00007fc720299570>

和:

Foo.baz
NameError: undefined local variable or method `key_1' for Foo:Class

尝试查找变量,但找不到它:

Foo.instance_variables
=> []
Foo.class_variables
=> []
Foo.constants
=> []

相反,您应该将其实例化为类中的常量:

class Foo
KEY_1 = 'bar'
def self.baz
puts KEY_1
end
def baz
puts KEY_1
end
end

并对其进行测试:

Foo.baz
bar
Foo.new.baz
bar
Foo::KEY_1
=> "bar"

任何遇到这种情况并将 attr 加密的宝石与红宝石一起使用的人:

https://ankane.org/encryption-keys

这刚刚救了我^

提到我的确切问题与解决方案。

最新更新