# ramzes (29.09.2016 / 22:01)
в чем смысл? пароль и есть тот самый токен
Цитирую: (+/-)
/**
Есть токен. По нему мы можем убедиться, что к нам пришёл настоящий пользователь, а не злоумышленник.
Иными словами, токен используется для того, чтобы аутентифицировать пользователя. Когда пользователь
входит на сайт, при успешной проверке данных (логина, пароля) пользователю выдаётся этот токен. Здесь ты
можешь сохранить его в куку, а можно просто через любой другой заголовок его отдать, или же вообще в теле
ответа. Выбираешь сам, как тебе удобнее.
Далее этот токен при каждом запросе отправляется на сервер, чтобы можно было аутентифицировать пользователя.
Для того, чтобы выйти, нужно просто перестать отправлять токен в запросе
(удалить куку или как там у тебя это реализовано).
Пара слов о том, что содержится в токене:
Для того, чтобы идентифицировать пользователя, нужно знать его ID или логин, как тебе удобнее.
Но одного идентификатора недостаточно, т.к. можно подсунув любой идентификатор залогиниться под любым пользователем.
Для этого необходимо подписать его секретным ключём.
В PHP сделать это можно с помощью функции hash_hmac().
Она принимает имя алгоритма, набор данных и секретный ключ.
Так как подписываем логин, сигнатура будет получена следующим образом:
*/
hash_hmac('sha256', $login, $config['auth.secret_key']);
/**
Теперь создаём сам токен:
*/
$token = serialize(array(
'login' => $login,
'signature' => hash_hmac('sha256', $login, $config['auth.secret_key'])
));
/**
Именно этот токен выдаётся пользователю, чтобы он мог его использовать при аутентификации.
Можно также добавить время жизни токена, чтобы можно было его прибить, если прошло достаточно
много времени с момента его создания. Если используются куки, то это не обязательно.
Далее проверяем токен:
*/
$token = $request->cookies->get('auth_token');
$token = unserialize($token);
if (array_key_exists('login', $token) && array_key_exists('signature', $token)) {
$user = $users->findByLogin($token['login']);
if ($user) {
$expectedSignature = hash_hmac('sha256', $user['login'], $config['auth.secret_key']);
if ($expectedSignature == $token['signature']) {
// Аутентификация прошла успешно!
}
}
}