devise_token_auth & Rails 5 - IndexError: 字符串不匹配



我正在尝试使用devise_token_auth版本0.1.38登录现有用户,但我在图书馆的sessions_controller中遇到了IndexError: string not matched

IndexError (string not matched):
devise_token_auth (0.1.38) app/controllers/devise_token_auth/sessions_controller.rb:37:in `[]='
devise_token_auth (0.1.38) app/controllers/devise_token_auth/sessions_controller.rb:37:in `create'
actionpack (5.0.0) lib/action_controller/metal/basic_implicit_render.rb:4:in `send_action'
actionpack (5.0.0) lib/abstract_controller/base.rb:188:in `process_action'
actionpack (5.0.0) lib/action_controller/metal/rendering.rb:30:in `process_action'
actionpack (5.0.0) lib/abstract_controller/callbacks.rb:20:in `block in process_action'

sessions_controller的相关代码是:

  if @resource and valid_params?(field, q_value) and @resource.valid_password?(resource_params[:password]) and (!@resource.respond_to?(:active_for_authentication?) or @resource.active_for_authentication?)
    # create client id
    @client_id = SecureRandom.urlsafe_base64(nil, false)
    @token     = SecureRandom.urlsafe_base64(nil, false)
    #  !! Next line is line 37 with the error !!
    @resource.tokens[@client_id] = {  
      token: BCrypt::Password.create(@token),
      expiry: (Time.now + DeviseTokenAuth.token_lifespan).to_i
    }
    @resource.save
    sign_in(:user, @resource, store: false, bypass: false)

我已将devise_token_auth添加到现有项目中,因此很可能我在tokens列中创建了错误数据。我已经尝试了各种将 json 默认token到现有用户中的方法,包括模仿sessions_controller中的代码。

add_column :users, :tokens, :json, null: false, default: {}
User.reset_column_information
client_id = SecureRandom.urlsafe_base64(nil, false)
token     = SecureRandom.urlsafe_base64(nil, false)
User.find_each do |user|
  user.uid = user.email
  user.provider = 'email'
  user.tokens[client_id] = {
      token: BCrypt::Password.create(token),
      expiry: (Time.now + DeviseTokenAuth.token_lifespan).to_i
  }
  user.save!
end

我在问题 #101 中看到过这一点,但没有具体的解决方案。知道我哪里出错了吗?

事实证明,

我需要将tokens设置为 nil ,然后 devise 会负责为我设置它。我在这个设计问题中找到了答案。

def change
  add_column :users, :provider, :string, null: false, default: "email"
  add_column :users, :uid, :string, null: false, default: ""
  add_column :users, :tokens, :text
  reversible do |direction|
    direction.up do
      User.find_each do |user|
        user.uid = user.email
        user.tokens = nil
        user.save!
      end
    end
  end
  add_index :users, [:uid, :provider], unique: true
end

最新更新