Я новичок в PHP и работает над REST API в cakephp3 для моего приложения для Android.
после настройки PHP а также композитор и маршрутизацию я создал функция входа..
public function login() {
$this->request->allowMethod('post');
$this->loadModel('Users');
$entity = $this->Users->newEntity($this->request->data, ['validate' => 'LoginApi']);
if ($entity->errors()) {
$this->httpStatusCode = 400;
$this->apiResponse['message'] = 'Validation failed.';
foreach ($entity->errors() as $field => $validationMessage) {
$this->apiResponse['error'][$field] = $validationMessage[key($validationMessage)];
}
} else {
$hasher = new DefaultPasswordHasher();
$password = $hasher->hash($entity->password);
$user = $this->Users->find()
->where([
'email' => $entity->email,
'password' => $password
])
->first();
if (empty($user)) {
$this->httpStatusCode = 403;
$this->apiResponse['error'] = 'Invalid email or password.';
return;
}
$payload = ['email' => $user->email, 'name' => $user->name];
$this->apiResponse['token'] = JwtToken::generateToken($payload);
$this->apiResponse['message'] = 'Logged in successfully.';
isset($user);
isset($payload);
}
}
я использую 123456 за пароль и это мясорубка возвращает случайную строку каждый раз, но пароль, который уже сохранен в базе данных для 123456 является
$ 2y $ 10 $ f7K02jamD7ZeGHLcTkP6Weh6VsthMWHiwqHJmcqbsxuLCKGCQCGCu этот.
именно поэтому он дает неверный пароль в ответ.
Мой вопрос заключается в том, как сопоставить точно такую же строку или хеширование для запроса.
заранее спасибо.
Со ссылкой на это ответ
Используйте эту строку
password_verify($entity->password, $user->password)
вместо этого
$hasher = new DefaultPasswordHasher();
$password = $hasher->hash($entity->password);
Вы можете попробовать эту функцию
public function login()
{
$this->request->allowMethod('post');
$this->loadModel('Users');
$entity = $this->Users->newEntity($this->request->data, ['validate' => 'LoginApi']);
if ($entity->errors()) {
$this->httpStatusCode = 400;
$this->apiResponse['message'] = 'Validation failed.';
foreach ($entity->errors() as $field => $validationMessage) {
$this->apiResponse['error'][$field] = $validationMessage[key($validationMessage)];
}
} else {
$user = $this->Users->find()->where(['email' => $entity->email])->first();
if (count($user)) {
if (password_verify($entity->password, $user->password)) {
$payload = ['email' => $user->email, 'password' => $user->password];
$this->apiResponse['token'] = JwtToken::generateToken($payload);
unset($user->password);
$this->apiResponse['response'] = array($user);
unset($user);
unset($payload);
} else {
$this->httpStatusCode = 403;
$this->apiResponse['error'] = 'Incorrect password';
return;
}
} else {
$this->httpStatusCode = 403;
$this->apiResponse['error'] = 'Email not found';
return;
}
}
}
Общая идея заключается в хешировании в соответствии с указанным вами ключом.
Совет будет периодически менять ключ. Затем вам нужно будет снова разархивировать сохраненные данные в исходное состояние, используя старый ключ, затем перефразировать новый.
Я не уверен, доступен ли вам этот вариант, поэтому вы можете взять его с крошкой соли.
ура
Прежде всего, CakePHP поставляется с готовой функцией аутентификации, и я настоятельно рекомендую вам использовать ее вместо запуска собственной, учитывая, что это звучит так, как будто вы ищете детерминированные алгоритмы, это может быть очень легко обратный эффект.
Если вы используете CakePHP 3.5+, посмотрите в промежуточный плагин аутентификации (в настоящее время в фазе RC), для более ранних версий CakePHP используйте компонент аутентификации.
Для полноты, если вы сделаете это вручную, вы сначала запросите пользователя по его уникальному идентификатору (в вашем случае это адрес электронной почты), а затем сравните пароль на уровне PHP, используя хэши паролей. AbstractPasswordHasher::check()
реализация:
$user = $this->Users
->find()
->where([
'email' => $this->request->data('email')
])
->first();
if (!$user ||
$hasher->check($this->request->data('password'), $user->password) !== true
) {
// authentication failed
} else {
// authentication succeeded
}