6

Ich versuche, in einem vorhandenen Benutzer anmelden mit devise_token_auth Version 0.1.38, aber ich bin ein IndexError: string not matched in der Bibliothek sessions_controller schlagen.devise_token_auth & Rails 5 - Indexerror: string abgestimmt nicht

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' 

Der entsprechende Code aus sessions_controller ist:

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) 

I devise_token_auth zu einem bestehenden Projekt hinzugefügt haben, so dass es sehr gut möglich, dass ich schlechte Daten in der tokens Spalte erstellt haben. Ich habe verschiedene Möglichkeiten ausprobiert token json in meine vorhandenen Benutzer einschließlich des Imitierens des Codes in 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 

Ich habe einen Hinweis in issue #101 gesehen, aber das hat nicht eine bestimmte Auflösung hat. Irgendeine Idee, wo ich falsch liege?

+0

Für mich scheint dies nur passieren, wenn ich meine Rails App auf Heroku laufen. Meine lokale Instanz hat dieses Problem nicht. Ich habe bemerkt, dass sich meine Postgres-Version (9.6.2) lokal von der Heroku-Version (9.6.4) unterscheidet. Nicht sicher, ob das das Problem verursacht oder nicht –

Antwort

4

Es stellt sich heraus, dass ich die tokens zu nil setzen musste, und dann wird sich devise darum kümmern, das für mich einzustellen. Ich fand die Antwort 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