Чат Telegram
Группа ВКонтакте
Новый комментарий


Sparkqy 03.10.2018 в 17:44

Можешь кинуть код реализации ?

ivashkevich 04.10.2018 в 07:18

Код экшена? Или вообще весь?)

Sparkqy 04.10.2018 в 16:35

У меня почему-то не получается разлогинить пользователя, я пытаюсь удалить куки с токеном и после этого вызвать getUserByToken() что бы "удалить" пользователя (null), но безуспешно. Или это по другому делается?

ivashkevich 06.10.2018 в 14:23

Просто удаляйте куки и перенаправляйте на другую страницу.

Sparkqy 08.10.2018 в 09:35

так при этом же остается объект пользователя на всех страницах, то есть любой контроллер да и вьюхи будут его видеть и это = что он все еще в системе (у нас же все проверки в шаблонах и контроллерах на !empty($user)). Разве не так?

ivashkevich 08.10.2018 в 23:06

Он у вас там берется из cookie. Не будет куки - не будет и юзера.

Kirill.K 14.10.2018 в 17:29

Header:

<td colspan="2" style="text-align: right">
            <?php if(!empty($user)): ?>
            Привет, <?= $user->getNickname() ?>  | <a href="http://myproject.loc/users/logOut">Выйти</a>
            <?php else: ?>
            <a href="http://myproject.loc/users/login">Войти</a> | <a href="http://myproject.loc/users/register">Зарегестрироваться</a>
            <? endif; ?>
        </td>

UsersController:

public function logOut()
    {
        setcookie('token', '', -1, '/', '', false, true);
        header('Location: /');
    }

routes:

'~^users/logOut~' => [\MyProject\Controllers\UsersController::class, 'logOut'],
ivashkevich 15.10.2018 в 23:03

Отлично!

tomsonst 20.12.2018 в 19:48
header.php
<tr>
        <td colspan="2" style="text-align: right">
            <?= !empty($user) ? 'Привет, ' . $user->getNickname() . ' | <a href = " ../users/exit">Выйти</a>' : '<a href="../users/login">Войдите на сайт</a> | <a href="../users/register">Зарегистрироваться</a>' ?>
        </td>
    </tr>

UsersContoroller.php

public function exit()
{
    setcookie('token', $token, 0, '/', '', false, true);
    header('Location: /');
}

ну и конечно роут '~^users/exit~' => [\MyProject\Controllers\UsersController::class, 'exit'],

ivashkevich 20.12.2018 в 19:55

Отлично!

AxLT 14.02.2019 в 02:13

После успешного логина почему то куки принимают вид:
Set-Cookie: token=3%3A; path=/; HttpOnly
Почему токен так задается не правильно? Из-за этого у меня не определяет юзера и соответственно не работает ничего.
class UsersAuthService:

 /**
     * @param User $user
     */
    public static function createToken(User $user)
    {
        $token = $user->getId() . ':' . $user->refreshAuthToken();
        setcookie('token', $token, 0, '/', '', false, true);
    }

    /**
     * @return User
     */
    public static function getUserByToken(): ?User
    {
        $token = $_COOKIE['token'] ?? '';

        if (empty($token)) {
            return null;
        }

        [$userId, $authToken] = explode(':', $token, 2);

        $user = User::getById((int) $userId);

        if ($user === null) {
            return null;
        }

        if ($user->getAuthToken() !== $authToken) {
            return null;
        }

        return $user;
    }

Models/User.php:

/**
     * @param array $loginData
     * @return User
     * @throws InvalidArgumentException
     */
    public static function login(array $loginData): User
    {
        if (empty($loginData['email'])) {
            throw new InvalidArgumentException('Enter email');
        }
        if (empty($loginData['password'])) {
            throw new InvalidArgumentException('Enter password');
        }
        $user = User::findOneByColumn('email', $loginData['email']);
        if ($user === null) {
            throw new InvalidArgumentException('Can\'t find user with this email');
        }
        if (!password_verify($loginData['password'], $user->getPasswordHash())) {
            throw new InvalidArgumentException('Incorrect password!');
        }
        /*if (!$user->isConfirmed) {
            throw new InvalidArgumentException('Пользователь не подтверждён');
        }*/

        $user->refreshAuthToken();
        $user->save();

        return $user;
    }

    /**
     * @return string
     */
    public function getPasswordHash(): string
    {
        return $this->passwordHash;
    }

    public function refreshAuthToken()
    {
        $this->authToken = sha1(random_bytes(100)) . sha1(random_bytes(100));
    }

    public function getAuthToken()
    {
        return $this->authToken;
    }

UsersController:

public function login()
    {
        if (!empty($_POST)) {
            try {
                $user = User::login($_POST);
                UsersAuthService::createToken($user);
                header('Location: /');
                exit();
            } catch (InvalidArgumentException $e) {
                $this->view->renderHtml('users/login.php', ['error' => $e->getMessage()]);
                return;
            }
        }

        $this->view->renderHtml('users/login.php');
    }
ivashkevich 17.02.2019 в 21:51

Ну что же вы, на 30-ом уроке такие вопросы задавать неуместно. Пора уже самостоятельно находить такие ошибки :) Используйте дебаггер и смотрите, какие куки отправляются с сервера, где и как они формируются.

excent63 06.04.2019 в 18:55

Добрый вечер! решение д/з:

header.php

<?php if (!empty($user)) { ?>
    Привет, <?= $user->getNickname() ?> | <a href="/users/logout">Выйти</a>
<?php } else { ?>
    <a href="/users/login">Войдите на сайт</a> | <a href="/users/register">Зарегестрируйтесь</a>
<?php } ?>

UsersAuthService.php

public static function deleteToken()
{
    setcookie('token', '', false, '/', '', false, true);
}

UsersController.php

public function logOut()
{
    UsersAuthService::deleteToken();
    header('Location: /');
}

Роут

'~^users/logout~' => [\MyProject\Controllers\UsersController::class, 'logOut']
ivashkevich 08.04.2019 в 21:28

Отлично. В шаблонах удобно пользоваться конструкциями с двоеточием:

<p>
<?php if ($x === 1): ?>
kek
<?php endif; ?>
</p>
Metey 25.07.2019 в 12:06

Метод

public function logout()
    {
        setcookie('token', $token, -1, '/', '', false, true);
        header('Location: /');
    }

Шапка

<td colspan="2" style="text-align: right"> 
            <?= !empty($user) ? 'Привет, ' . $user->getNickname() .
            ' | <a href="/users/logout"> Выйти</a>' :
             '<a href="/users/login">Войти</a> |
              <a href="/users/register">Зарегистрироваться</a>' ?>
        </td>

РОут

 '~^users/logout~' => [\MyProject\Controllers\UsersController::class, 'logout'],
ivashkevich 25.07.2019 в 18:53
setcookie('token', $token, -1, '/', '', false, true);

$token - откуда взяться этой переменной?
На этой строке возникнет ошибка. Она выведется в браузер, а следующая не сможет выполниться, из-за того, что заголовки нельзя отправлять после отправки тела ответа. Выходит, нифига не работает.

Metey 25.07.2019 в 19:23

странно) но ошибка не возникает и работает, ща попробую проверить откуда она берется вспомнить

Metey 25.07.2019 в 19:29

да, переменной нет, там null , но ошибка почему то невозникает и ест ьпоставить просто пустую строковую "" то ничего не меняется, такое может быть?

ivashkevich 26.07.2019 в 07:35

Если отключить вывод ошибок. А так там будет undefined var

Metey 26.07.2019 в 13:46

в роде ща проверил все включено ошибки

error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT
display_errors = On
display_startup_errors = On

может еще где то они могли быть выключены?

Metey 26.07.2019 в 14:54

вот убрал строку & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT в строке
error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT , оставил только E_ALL
и ошибка стала появляться, а это нормально что ошибка теперь стала появляться и в этом коде :

class UsersController extends AbstractController
{
    public function signUp()
    {
        if (!empty($_POST)) {
            try {
                $user = User::signUp($_POST);
            } catch (InvalidArgumentException $e) {
                $this->view->renderHtml('users/signUp.php', ['error' => $e->getMessage()]);
                return;
            }
        }

        if ($user instanceof User) {
            $code = UserActivationService::createActivationCode($user);

            EmailSender::send($user, 'Активация', 'userActivation.php', [
                'userId' => $user->getId(),
                'code' => $code
            ]);

            $this->view->renderHtml('users/signUpSuccessful.php');
            return;
        }

как отсутствие переменной $user в строке if ($user instanceof User) {

ivashkevich 26.07.2019 в 17:24

Конечно нормально, если пустой POST-запрос, то этой переменной неоткуда взяться.

Metey 26.07.2019 в 17:59

Спасибо. А то я уже напугался)

Iliusha99 01.08.2019 в 22:03
Router: '~^users/logout~' => [UsersController::class, 'logout']

UsersController:

public function logout()
    {
        try {
            if ($this->user !== null) {
                if (User::logout()) {
                    header('Location: /');
                    exit();
                }
            } throw new AuthException('Вы не зарегистрированы', 403);
        } catch (AuthException $e){
            $this->view->renderHtml('/errors/403.php', ['error' => $e->getMessage()], 403);
        }
    }
User Model:

public static function logout(): bool
    {
        if (isset($_COOKIE['token'])) {
            setcookie("token", "", time() - 1000, "/");
            return true;
        }
        return false;
    }
ivashkevich 02.08.2019 в 17:51

В целом вижу, что у вас есть понимание того, как все работает. Но модель не должна ничего знать о куки. Вся работа с данными запросов должны обрабатываться на уровне контроллера.

Iliusha99 02.08.2019 в 17:58

Понятно, тогда здесь метод логоут в моделе лишний, да?

ivashkevich 02.08.2019 в 18:06

Да. Эту логику стоит сделать в контроллере.

Moskva 06.08.2019 в 20:43

routes.php

'~logout~' => [\MyProject\Controllers\UsersController::class, 'logout'],

header.php

<? if(!empty($user)): ?>
                <?= 'Привет, ' . $user->getNickname()?> | <a href="/logout">Выйти</a>
            <?php else: ?>
                <a href="/users/login">Войти</a> | <a href="/users/register">Зарегистрироваться</a>
            <?php endif; ?>

User.php

public function logout()
    {
        $this->logout();
    }

UsersController.php

public function logout() // разлогинивание пользователя
    {
        setcookie('token', time()-1);
        header('Location: /');
    }
ivashkevich 07.08.2019 в 03:45
User.php

public function logout()
    {
        $this->logout();
    }

Бред какой-то.

Moskva 07.08.2019 в 18:29

И правда, исправил.

artemship 29.08.2019 в 13:23

routes.php:

'~^logout$~' => [\MyProject\Controllers\UsersController::class, 'logout'],

index.php:

<?php if (!empty($user)): ?>
    Привет, <?= $user->getNickname(); ?> |
    <a href="/logout">Выйти</a>
<?php else: ?>
    <a href="/users/login">Войти</a> |
    <a href="/users/register">Зарегистрироваться</a>
<?php endif; ?>

UsersAuthService.php

    public static function deleteCookie(): void
    {
        setcookie('token', '', -1, '/', '', false, true);
    }

UsersController.php

    public function logout()
    {
        UsersAuthService::deleteCookie();
        header('Location: /');
    }

Не знаю, правильно ли я сделал, что в UsersAuthService переименовал метод createToken на saveCookie и добавил второй метод deleteCookie, вместо deleteToken. Мне почему-то показалось так понятнее, ведь мы создаем новый токен при авторизации и сохраняем его в БД. А в методе createToken мы всего лишь берем его из БД и устанавливаем куки. Допустимо ли так делать, или лучше оставить как было?

ivashkevich 30.08.2019 в 04:38

Допустимо) всё ок

Логические задачи с собеседований