- Аутентификация, Авторизация и Идентификация
- Разновидности идентификаторов.
ID,UID,UUIDиGUID - Виды аутентификации
- Сессии (
Sessions) иCookie JSON Web Token(JWT)OAuth
Идентификация (англ. identification, лат. identifico — отождествлять) — процедура распознавания объекта (субъекта) по его идентификатору.
Например, можно идентифирировать человека по имени, электронной почте, номеру телефона или паспорта.
Аутентификация (англ. authentication, греч. αυθεντικός — подлинный) — процедура проверки подлинности.
Например, можно определить подлинность проверкой пароля, отпечатка пальца, наличием пропуска или ключа от двери.
Авторизация (англ. authorization - разрешение, уполномочивание) – предоставление доступа к какому-либо ресурсу.
Стандартная последовательность действий на любом сайте.
- Установление личности (username, email, phone) – идентификация.
- Проверка подлинности (password) – аутентификация.
- Предоставление доступа – авторизация.
Объект (лат. objectum — предмет) — философская категория, обозначающая вещь, явление или процесс, на которые направлена предметно-практическая, управляющая и познавательная деятельность субъекта (наблюдателя); при этом в качестве объекта может выступать и сам субъект.
Идентификатор (англ. identifier, ID) — уникальный признак объекта (субъекта), позволяющий отличать его от других объектов (идентифицировать).
Поле ID обычно является главным ключом (англ. primary key), по которому можно найти конкретный объект в коллекции объектов.
Поле ID чаще всего представлено в виде некоторого хэша, сгенерированного в заданном формате по некоторому алгоритму. Существует множество форматов ID, при этом для генерации могут использовать индексы (последовательное инкрементирование - самый простой случай), даты (англ. timestamps), рандомные числа, другие поля объекта, которые тоже по некоторому алгоритму становятся хэшем. Далее рассмотрим некоторые варианты ID.
UUID (англ. Universally Uique IDentifier) — стандарт идентификации, стандартизированный Open Software Foundation как часть среды распределённых вычислений (DCE).
UUID позволяет уникально идентифицировать информацию, не имея при этом центра координации.
То есть любой может создать UUID и использовать его для идентификации чего-либо с достаточным уровнем уверенности, что этот идентификатор не будет использован для чего-либо ещё непреднамеренно.
UUID имеет несколько версий, в которых используются:
- Версии 1 и 2 - время и MAC-адрес.
- Версия 3 - хеширование алгоритмом MD5.
- Версия 4 - генерация случайным образом.
- Версия 5 - хеширование алгоритмом SHA-1.
Библиотека в npm, позволяющая создавать и проверять валидность UUID:
npm i uuidДля проверки подлинности (аутентификации) пользователя обычно на сервер вместе с запросом передаётся заголовок Authorization, в котором размещают тип аутентификации и соответствующие ей данные.
Authorization: <type> <credentials>Базовая (Basic) аутентификация подразумевает передачу в заголовок имени пользователя и пароля в виде строки следующего вида username:password, зашифрованной в Base64.
Authorization: Basic <encodedCredentials>В JavaScript можно кодировать и декорировать Base64 следующим образом.
const credentials = 'admin:admin';
/* кодировка */
const encodedCredentials = btoa('admin:admin');
console.log(encodedCredentials); // 'YWRtaW46YWRtaW4='
/* декодировка */
const decodedCredentials = atob('YWRtaW46YWRtaW4=');
console.log(decodedCredentials); // 'admin:admin'Authorization: Basic <encodedCredentials>/* получение Cookie */
/* Auth request
with credentials */
Client --------------------> Server
/* Set-Cookie
response header */
Client <-------------------- Server
/* Cookie
request header */
Client --------------------> ServerКогда Cookie устаревают, они удаляются и на клиенте, и на сервере, поэтому описанный выше алгоритм повторяется.
/* обновление auth_token */
/* Cookie is
missing (401) */
Client <-------------------- Server/* header.payload.signature */
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImdhcnJ5QGl0ZWNoYXJ0LWdyb3VwLmNvbSIsInN1YiI6MSwiaWF0IjoxNTgxMzUzMTk1LCJleHAiOjE1ODEzNjM5OTV9.sIAg18cc66dLi4PyLGzITOou8nppH056pxVVH0pgWMs/* получение или обновление refresh_token */
/* Auth request
with credentials */
Client --------------------> Auth Server
/* auth_token,
refresh_token */
Client <-------------------- Auth Server
/* Authorization
request header with
auth_token */
Client --------------------> ServerТокены доступа (Access Tokens) представляют собой учётные данные (credentials), которые используеются для доступа к защищенным ресурсам.
Токен доступа отправляется на сервер с каждым запросом в Authorization заголовке запроса.
Токены доступа можно использовать неограниченное количество раз, но они обычно имеют короткую продолжительность жизни (обычно устанавливают ~15 минут), чтобы их нельзя было украсть и постоянно использовать.
Таким образом, если токен доступа украдут, то им можно будет пользоваться не более указанного в нём времени (например, не более 15 минут).
Время истечения токена может быть определено по полям exp (expiration time), определяющим время жизни токена и iat (issued at), определяющим дату создания токена. Подделать это время нельзя, поскольку формула формирования токена нарушится и он станет невалидным.
Токены доступа не хранятся на сервере, на клиенте чаще всего хранятся в Local Storage (и берутся оттуда, чтобы их можно было отправить в заголовке запроса).
/* обновление auth_token */
/* auth_token is
expired (401) */
Client <-------------------- Auth Server
/* Auth request
with refresh_token */
Client --------------------> Auth Server
/* auth_token,
refresh_token */
Client <-------------------- ServerКогда токен доступа истекает и требуется новый для доступа к ресурсу, клиенту необходимо обратиться к серверу аутентификации (Auth Server) для получения нового токена.
Токен обновления (Refresh Token) содержит информацию, необходимую для получения нового токена доступа.
Серверу аутентификации отсылается токен обновления и возвращается токен доступа.
Токены обновления одноразовые и обычно имеют долгую продолжительность жизни.
Если токен обновления украден, его можно использовать только один раз, а значит получить только один токен доступа.
Если клиент видит, что его токен доступа невалиден (им уже воспользовались), он может перелогиниться. Таким образом сгенерируется новый токен обновления, а старый станет невалидным.
Токены обновления не хранят в себе какую-то информацию, как JWT-токены, и обычно представляют обычную хеш-строку. Токены обновления необходимо хранить на сервере.
В отличие от токенов доступа токены обновления хранятся на сервере. Они также хранятся и на клиенте.