Auth :: значение попытки всегда ложно - PullRequest
1 голос
/ 13 апреля 2020

У меня возникла проблема, когда я хочу войти в систему. У меня проблема с моим Auth::attempt всегда ложным значением. Неужели у меня что-то не так в моем коде?

Контроллер:

public function register(Request $register)
{
    $validator = Validator::make($register->all(), [
        'name' => 'required',
        'email' => 'required|email',
        'password' => 'required',
    ]);
    if ($validator->fails()) {
        return response()->json(['error' => $validator->errors()], 401);
    } else {
        $name = $register->input('name');
        $email = $register->input('email');
        $pwd = $register->input('password');
        $c_pwd = $register->input('c_password');

        // Crypting password & c_password to md5
        $md5_pwd = md5($pwd);
        $md5_c_pwd = md5($c_pwd);

        // Salt password & c_password 
        $password = crypt($md5_pwd, "asd");
        $c_password = crypt($md5_c_pwd, "asd");

        $data = new User();

        if ($password == $c_password) {
            $user = User::create([
                'name' => $name,
                'email' => $email,
                'password' => $password,
            ]);
            $success['token'] = $user->createToken('SSOApp')->accessToken;
            return response()->json([
                'success' => true,
                'token' => $success,
                'user' => $user
            ]);
        } else {
            return response()->json(['error' => "Password doesn't match"], 401);
        }
    }
}

public function login()
{
    $email = request('email');
    $pwd = request('password');
    $md5 = md5($pwd);
    $password = crypt($md5, "asd");
    if (Auth::attempt(['email' => $email, 'password' => $password])) {
        $user = Auth::user();
        $success['token'] = $user->createToken('SSOApp')->accessToken;
        return response()->json([
            'success' => true,
            'token' => $success,
            'user' => $user
        ]);
    } else {
        return response()->json([
            'success' => false,
            'message' => 'Invalid Email or Password',
        ], 401);
    }
}

Ответы [ 5 ]

1 голос
/ 13 апреля 2020

Laravel Auth использует хеширование bcrypt при сохранении пароля через модель, вы можете использовать любой из двух методов:

$account->password = bcrypt("YOUR_PASSWORD"); или $account->password = Hash::make("YOUR_PASSWORD");

Тогда, если вы имеете дело с функция попытки авторизации, просто вызовите метод, подобный этому

if($account = Auth::attemp(['email' => "YOUR_EMAIL@DOMAIN.COM",  'password' => "YOUR_PASSWORD"])){
    //success login, do your extra job here
}else{
    //invalid credentials here
}
1 голос
/ 13 апреля 2020

Вместо использования md5 или crypt используйте \Hash::make() это очень безопасно
Я реорганизовал ваш код, и он делает то же самое
Вам нужно только переименовать ваш c_password в password_confirmation
Источник
Ниже код делает то же самое, что и ваш код

public function register(Request $register)
{
    $this->validate($register, [
        'name' => 'required',
        'email' => 'required|email',
        'password' => 'required|confirmed',
    ]);

    $user = User::create([
        'name' => $register->input('name'),
        'email' => $register->input('email'),
        'password' => $register->input('password'),
    ]);
    $success['token'] = $user->createToken('SSOApp')->accessToken;

    return response()->json([
        'success' => true,
        'token' => $success,
        'user' => $user,
    ]);
}

public function login(Request $request)
{
    $request->merge(['password' => \Hash::make($request->input('password'))]);

    if (Auth::attempt($request->only(['email', 'password']))) {
        $user = Auth::user();
        $success['token'] = $user->createToken('SSOApp')->accessToken;

        return response()->json([
            'success' => true,
            'token' => $success,
            'user' => $user,
        ]);
    }

    return response()->json([
        'success' => false,
        'message' => 'Invalid Email or Password',
    ], 401);
}

когда вы хэшируете пароль с помощью crypt, у него есть ключ для его разблокировки, поэтому есть это decrypt, но когда вы используете Hash::make(), у него нет ключа для его взлома или разблокировки, он проверит свой алгоритм, чтобы увидеть, соответствует ли данный пароль алгоритму, который уже существует в базе данных, поэтому crypt небезопасно и Ха sh :: make намного безопаснее

1 голос
/ 13 апреля 2020

Ваша проблема в том, что laravel по умолчанию хэширует пароль. поэтому, когда вы наберете Auth::attempt, у вас будет sh пароль, который вы указали. И результат, который вы получаете, всегда будет ложным.

Вместо этого вам нужно Другие методы аутентификации .

Auth::login($user);

// Login and "remember" the given user...
Auth::login($user, true);

Вышеуказанный самый простой способ исправить ваш код.

Рекомендуется иметь sh ваш пароль вместо шифрования пароля.

Хеширование пароля в laravel также

Hash::make($password);

И тогда вы можете использовать Auth::attempt для входа в систему.

1 голос
/ 13 апреля 2020

Я предполагаю, что вы запутались с Laravel Системой хеширования паролей по умолчанию

public function register(Request $register)
{
    $validator = Validator::make($register->all(), [
        'name' => 'required',
        'email' => 'required|email',
        'password' => 'required',
        'c_password' => 'required|same:password',
    ]);
    if ($validator->fails()) {
        return response()->json(['error' => $validator->errors()], 401);
    } else {
        $name = $register->input('name');
        $email = $register->input('email');
        $pwd = $register->input('password');
        $c_pwd = $register->input('c_password');


        // $data = new User();

        $user = User::create([
                'name' => $name,
                'email' => $email,
                'password' => bcrypt($password . 'salt'),
        ]);

        $success['token'] = $user->createToken('SSOApp')->accessToken;
        return response()->json([
                'success' => true,
                'token' => $success,
                'user' => $user
        ]);

    }
}

public function login()
{
    $email = request('email');
    $pwd = request('password');

    if (Auth::attempt(['email' => $email, 'password' => $password . 'salt'])) {
        $user = Auth::user();
        $success['token'] = $user->createToken('SSOApp')->accessToken;
        return response()->json([
            'success' => true,
            'token' => $success,
            'user' => $user
        ]);
    } else {
        return response()->json([
            'success' => false,
            'message' => 'Invalid Email or Password',
        ], 401);
    }
}
1 голос
/ 13 апреля 2020

Попробуйте этот код. Я не знаю, что случилось с вашим кодом относительно пароля, который вы пытались зашифровать в attempt.

public function login(LoginRequest $request) {
      if(!Auth::attempt([
        'email' => $request->email,
        'password' => $request->password,
        'active' => true
      ])) {
        return response()->json('Email or Password is incorrect', 500);
      }

      $this->user = Auth::user()->load('roles');
      return $this->createUserAccessTokenResponse();
    }

protected function createUserAccessTokenResponse() {
      return response()->json([
        'status' => 'success',
        'data' => [
          'token' => $this->user->createToken($this->user->name)->accessToken,
          'user' => $this->user
        ],
      ], 200);
    }
...