Я работаю над интернет-порталом электронной коммерции laravel 5.
У меня возникла проблема, когда пользователь обновляет пароль, используя готовые сценарии.
Проблема в том, что я могу отправить ссылку клиенту совершенно без проблем, и клиент также может изменить свой пароль. Но при выходе и повторном входе я получаю сообщение об ошибке как Invalid credentials
,
В моем rout.php у меня есть это:
Route::controllers([
'auth' => 'Auth\AuthController',
'password' => 'Auth\PasswordController',
]);
Это страница входа в систему:
<form class="form-horizontal" role="form" method="POST" action="{{ url('/login') }}">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<div class="form-group">
<label class="col-md-4 control-label">E-Mail Address</label>
<div class="col-md-6">
<input type="email" class="form-control" name="email" value="{{ old('email') }}">
</div>
</div>
<div class="form-group">
<label class="col-md-4 control-label">Password</label>
<div class="col-md-6">
<input type="password" class="form-control" name="password">
</div>
</div>
<div class="form-group">
<div class="col-md-4"></div>
<div class="col-md-4">
<a href="{{url('/password/email')}}">Forgot Password</a>
</div>
</div>
<div class="form-group">
<div class="col-md-6 col-md-offset-4">
<button type="submit" class="btn btn-primary btn-block">Login</button>
</div>
</div>
</form>
Я не могу войти снова после того, как я вышел из системы после сброса пароля.
РЕДАКТИРОВАТЬ 1:
Когда кнопка входа в систему нажата на странице формы входа, postLogin
метод называется. Вот код
public function postLogin( Request $request ) {
$this->validate( $request, [
'email' => ['required', 'exists:users,email,role,customer'],
'password' => 'required'
]);
$credentials = $request->only('email', 'password');
if ( \Auth::attempt($credentials) ) {
\Session::flash('logged_in', 'You have successfully logged in.');
return redirect('/');
}
return redirect('/login')->withInput($request->all())->withErrors(['email' => 'Invalid Email Address Or Password']);
}
РЕДАКТИРОВАТЬ 2:
Я просто понимаю, что логин не проверяет хэш и, следовательно, возвращает false
, делая dd(\Hash::check($request->password, $user->password))
, после обновления пароля и повторного входа в систему. В чем может быть проблема с этим?
Где я ошибся? Пожалуйста, ведите меня.
Заранее спасибо.
ПостскриптумЯ использую значения по умолчанию только для обновления пароля, остальное все, я сделал контроллеры и модели, которые все работают нормально, без каких-либо проблем.
Если новый пароль не работает после изменения, то при смене пароля что-то идет не так.
Скорее всего подозрительным является шифрование. Вполне возможно, что вы не используете Hash :: make ($ password) и сохраняете его в текстовом формате.
Вы можете дважды проверить, правильно ли сохранен хеш в БД с помощью функции Hash :: check ($ password, $ hash);
Во время входа в систему вы можете проверить пароль как
public function postLogin( Request $request ) {
$user=User::where('email', $request->email);
Log::debug("Testing $request->password $user->password ". Hash::check($request->password, $user->password));
}
Если проверка Hash :: false, то при сохранении нового пароля что-то пошло не так. $ user-> пароль должен быть в хешированном виде.
Я тоже наткнулся на это и нашел ответ Вот, просто добавив это для дальнейшего использования ..
Причина в том, что, как только вы добавите setPasswordAttribute
метод на вашем User
В этой модели пароль хешируется дважды при использовании встроенной функции сброса пароля Laravel. Как объяснено на странице Laracast, все, что ему нужно, это проверка уже хешированного пароля, например:
// Add Hash facade
use Illuminate\Support\Facades\Hash;
class User extends Authenticatable
{
// ...
/**
* Automatically hash password
*
* @param String $value The password, maybe hashed already
*
* @return string|null
*/
public function setPasswordAttribute($value)
{
if ($value) {
$this->attributes['password'] = Hash::needsRehash($value) ? Hash::make($value) : $value;
}
}
}