Как запросить логин с электронной почтой и текстовым паролем в cakephp3

Я новичок в php и работаю над REST API в cakephp3 для своего приложения для Android.

после настройки php и composer и маршрутизации я создал функцию входа..

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< /strong> это $2y$10$f7K02jamD7ZeGHLcTkP6Weh6VsthMWHiwqHJmcqbsxuLCKGCQCGCu это.

вот почему он дает неверный пароль в ответ.

Мой вопрос заключается в том, как сопоставить ту же строку или хеширование для запроса. заранее спасибо.


person Cruiser Raga S    schedule 18.05.2018    source источник


Ответы (3)


Со ссылкой на этот ответ

Используйте эту строку

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;
        }
    }
}
person Anurag Shrivastava    schedule 23.05.2018

Общая идея состоит в том, чтобы хэшировать в соответствии с указанным вами ключом.

Совет будет заключаться в том, чтобы периодически менять ключ. Затем вам нужно будет снова дехэшировать ваше сохранение в чистое, используя старый ключ, а затем перехэшировать на новый.

Я не уверен, доступен ли вам этот вариант, поэтому вы можете принять его с долей скептицизма.

Ваше здоровье

person Rabih Melko    schedule 18.05.2018
comment
Что вы подразумеваете под дехэшем? - person Greg Schmidt; 19.05.2018
comment
Под дехешированием я подразумеваю расшифровку вашего хешированного сообщения. Имейте в виду, однако, что вы не можете обратить хэш (это не будет функция хеширования). Для ваших нужд вам придется использовать криптографическую функцию с лазейкой - person Rabih Melko; 21.05.2018

Прежде всего, 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
}
person ndm    schedule 18.05.2018