6

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?

+0

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 –

risposta

4

Si scopre che ho dovuto impostare tokens su nil e quindi escogitare si occuperà di impostarlo per me. Ho trovato la risposta in 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