重置设计导轨的密码给出"数组到字符串的隐式转换"错误



我正在尝试重置密码-默认的设计密码控制器#create方法,当devise尝试生成令牌时,我收到了一个错误。这在使用rails服务器的开发中是突破性的。

我不是在自定义密码控制器,我只是在使用这个方法的默认设计控制器。

我尝试过搜索,但没有发现类似的问题,除了RubyonRails:没有将数组隐式转换为字符串(DEVISE(,这似乎没有关联。我试着清除rails缓存并使用隐姓埋名的浏览器,但这并没有改变任何事情。我现在正在寻找其他可以尝试的东西,但似乎碰壁了。

配置:

设计使用用户名而不是电子邮件进行身份验证:

config.authentication_keys = [:username]
config.reset_password_keys = [:username]

我的用户被分类为"user::Admin"等,它看起来像:

class User < ApplicationRecord
devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable
validates :email, uniqueness: true
validates :username, uniqueness: true
validates :user_type, presence: true
self.inheritance_column = :user_type

最终误差图像的图像

我的日志与堆栈跟踪:

Started POST "/users/password" for 127.0.0.1 at 2018-07-16 14:27:44         -0700
Processing by Users::PasswordsController#create as HTML
Parameters: {"utf8"=>"✓",    "authenticity_token"=>"rS7qFIRbbpd/M3QoAD1OLeDRDoliWAQK+PRE/qG2CgK2COvwwVCNFA6aMpcY0P81AEKo0fEpfNe4SRqLk7WDAw==", "user"=>{"username"=>"timtim"}, "commit"=>"Send me reset password instructions"}
User Load (0.9ms)  SELECT  "users".* FROM "users" WHERE "users"."username" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["username", "timtim"], ["LIMIT", 1]]
↳ /Users/timchipperfield/.rvm/gems/ruby-2.5.1/gems/activerecord-5.2.0/lib/active_record/log_subscriber.rb:98
Completed 500 Internal Server Error in 5ms (ActiveRecord: 0.9ms)

TypeError (no implicit conversion of Array into String):
/Users/timchipperfield/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/openssl/pkcs5.rb:14:in `pbkdf2_hmac'
/Users/timchipperfield/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/openssl/pkcs5.rb:14:in `pbkdf2_hmac'
/Users/timchipperfield/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/openssl/pkcs5.rb:19:in `pbkdf2_hmac_sha1'
activesupport (5.2.0) lib/active_support/key_generator.rb:23:in `generate_key'
activesupport (5.2.0) lib/active_support/key_generator.rb:38:in `generate_key'
devise (4.4.3) lib/devise/token_generator.rb:29:in `key_for'
devise (4.4.3) lib/devise/token_generator.rb:17:in `generate'
devise (4.4.3) lib/devise/models/recoverable.rb:90:in `set_reset_password_token'
devise (4.4.3) lib/devise/models/recoverable.rb:51:in `send_reset_password_instructions'
devise (4.4.3) lib/devise/models/recoverable.rb:136:in `send_reset_password_instructions'
devise (4.4.3) app/controllers/devise/passwords_controller.rb:15:in `create'

如果有帮助的话,在它到达控制器之前,堆栈跟踪还有很多。

我正在运行以Passenger作为我的应用服务器的设备(4.4.3(

我的env看起来像:

ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin17]
Rails 5.2.0
Bundler version 1.16.2
rvm 1.29.3

由于您使用的是Rails 5.2.0,我猜您也用encrypted credentials替换了secret_key_base。然而,默认情况下,design仍然尝试使用secret_key_base来生成安全散列。

你应该得到一个类似的错误:

TypeError in User::PasswordsController#create
no implicit conversion of Hash into String
def pbkdf2_hmac(pass, salt, iter, keylen, digest)
OpenSSL::KDF.pbkdf2_hmac(pass, salt: salt, iterations: iter,
length: keylen, hash: digest)
end

有两个选项可以解决此问题:

1( 在initializers/device.rb:中取消注释config.secret_key

config.secret_key = 'SOME_RANDOM_VALUE'

2( 将该SOME_RANDOM_VALUE添加到encrypted_credentials:

首次运行:

rails credentials:edit

添加类似的行:

devise:
secret_key: SOME_RANDOM_VALUE

然后从设计初始化器调用该密钥:

config.secret_key = Rails.application.credentials.devise[:secret_key]

最新更新