Как запросить логин с электронной почтой и паролем в текстовом виде в cakephp3 - PullRequest
0 голосов
/ 18 мая 2018

Я новичок в 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 для пароль и это hasher возвращает случайную строку каждый раз, но пароль, который уже сохранен в базе данных для 123456 , равен $ 2y $ 10 $ f7K02jamD7ZeGHLcTkP6Weh6VsthMWHiwqHJmcqbsxuLCKGCQCGCu

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

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

Ответы [ 3 ]

0 голосов
/ 18 мая 2018

Прежде всего, 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
}
0 голосов
/ 23 мая 2018

Применительно к этому ответу

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

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;
        }
    }
}
0 голосов
/ 18 мая 2018

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

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

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

Ура

...