devise_token_auth & Rails 5 - IndexError: string not matched
devise_token_auth & Rails 5 - IndexError: string not matched
我正在尝试使用 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
列中创建了错误数据。我已经尝试了多种方法将 token
json 默认设置为现有用户,包括模仿 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
我在 issue #101 中看到了这一点,但没有具体的解决方案。知道我哪里出错了吗?
原来我需要将 tokens
设置为 nil
,然后 devise 会为我进行设置。我在 this devise issue.
中找到了答案
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
我正在尝试使用 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
列中创建了错误数据。我已经尝试了多种方法将 token
json 默认设置为现有用户,包括模仿 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
我在 issue #101 中看到了这一点,但没有具体的解决方案。知道我哪里出错了吗?
原来我需要将 tokens
设置为 nil
,然后 devise 会为我进行设置。我在 this devise issue.
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