Sto cercando di accedere a un utente esistente utilizzando devise_token_auth
versione 0.1.38
, ma sto colpendo un IndexError: string not matched
nella sessions_controller
della biblioteca.devise_token_auth & Rails 5 - IndexError: stringa non abbinati
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'
Il relativo codice da sessions_controller
è:
if @resource and valid_params?(field, q_value) and @resource.valid_password?(resource_params[:password]) and ([email protected]_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)
Ho aggiunto devise_token_auth
a un progetto esistente quindi è molto probabile che ho creato i dati non validi nella colonna tokens
. Ho provato vari modi di default di token
json nei miei utenti esistenti incluso l'imitazione del codice nello 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
ho visto una menzione di questo nella issue #101, ma che non hanno una specifica risoluzione. Qualche idea su dove sto andando male?
Per me, questo sembra accadere solo quando eseguo la mia app di rotaie su Heroku. La mia istanza locale non ha questo problema. Ho notato che la mia versione di Postgres (9.6.2) localmente differiva dalla versione di Heroku (9.6.4). Non sono sicuro se ciò sta causando il problema o no –