Sto cercando di attuare quello che sembra un approccio molto semplice autenticazione tramite Sinatra e bcrypt ma chiaramente mi manca qualcosa ...Rubino bcrypt confronto hash
Gli utenti vengono preassegnati una password temporanea che è memorizzato in chiaro nel db.
Autentico contro la password temporanea e quindi creo sia un comando salt che password_hash e li scrivo come stringhe sul db (mongo in questo caso).
Per autenticare, recupero il db e la password utente da confrontare.
post "/password_reset" do
user = User.first(:email => params[:email], :temp_password => params[:temp_password])
if dealer != nil then
password_salt = BCrypt::Engine.generate_salt
password_hash = BCrypt::Engine.hash_secret(params[:password], password_salt)
user.set(:password_hash => password_hash)
user.set(:password_salt => password_salt)
end
end
post "/auth" do
@user = User.first(:email => params[:email])
@user_hash = BCrypt::Password.new(@user.password_hash) #because the password_hash is stored in the db as a string, I cast it as a BCrypt::Password for comparison
if @user_hash == BCrypt::Engine.hash_secret(params[:password], @user.password_salt.to_s) then
auth = true
else
auth = false
end
end
Il valore restituito da bcrypt :: Engine.hash_secret (params [: password], password_salt) è diverso da ciò che è memorizzato nel db (entrambi sono di classe bcrypt :: Password, ma non lo fanno incontro).
Cosa mi manca qui? Molte grazie in anticipo per qualsiasi intuizione!
Marc
grazie mille. Era esattamente quello che mi mancava, funziona perfettamente. Posso smettere di tirare i miei capelli (fino alla prossima cosa). – user1553220
si potrebbe fare @ user_hash.is_password? params [: password] invece di == ... Penso che sia più chiaro e soggetto a errori, perché se non sai che == è stato sovrascritto e invertito l'ordine di confronto (params [: password] == @user_hash), restituirà falso ... – rizidoro