Примечание редактора. Сегодня мы поделимся принципами реализации и реализациями часто используемых схем аутентификации для веб-сайтов, организованных Лу Шицзе, а также их применимыми сценариями, чтобы помочь вам сделать правильный выбор в вашем бизнесе.
задний план
Говоря об аутентификации, все должны быть знакомы с ней, но, поскольку это фронтенд-разработка, большая часть процесса аутентификации выполняется на бэкэнд-брате.Цель этой статьи — дать всем понять общие методы и принципы аутентификации.
Когнитивный: HTTP — это протокол без сохранения состояния, поэтому каждый раз, когда клиент делает запрос, следующий запрос не может знать данные о состоянии, содержащиеся в предыдущем запросе.
1. HTTP-аутентификация
Введение
HTTP обеспечивает общую основу для контроля авторизации и аутентификации. Наиболее часто используемая схема HTTP-аутентификации — базовая HTTP-аутентификация.
Процесс аутентификации
Процесс шифрования и дешифрования
// Authorization 加密过程
let email = "postmail@test.com"
let password = "12345678"
let auth = `${email}:${password}`
const buf = Buffer.from(auth, 'ascii');
console.info(buf.toString('base64')); // cG9zdG1haWxAdGVzdC5jb206MTIzNDU2Nzg=
// Authorization 解密过程
const buf = Buffer.from(authorization.split(' ')[1] || ''), 'base64');
const user = buf.toString('ascii').split(':');
Другая HTTP-аутентификация
Существует несколько схем аутентификации, используемых в Generic HTTP Authentication Framework. Различные схемы аутентификации будут иметь разную степень безопасности.
IANA поддерживаетАссортимент схем проверки, в дополнение к другим типам схем аутентификации, предоставляемым службами виртуального хостинга, такими как Amazon AWS, распространенные схемы аутентификации включают:
- Базовый (ПросмотрRFC 7617, учетные данные в кодировке Base64. Подробнее см. ниже.),
- Предъявитель (ПросмотрRFC 6750, токены-носители защищают ресурсы через OAuth 2.0),
- Дайджест (ПросмотретьRFC 7616, в Firefox поддерживаются только хеши md5, см.bug 472823для поддержки шифрования SHA),
- ХОБА (ПросмотретьRFC 7486(черновик), HTTP-аутентификация с привязкой к происхождению, на основе цифровой подписи),
- Взаимный (Просмотрdraft-ietf-httpauth-mutual),
- AWS4-HMAC-SHA256 (ПросмотрAWS docs)
2. Файл cookie + сеанс
процесс регистрации
Подумайте: зачем добавлять в пароль немного «соли»?
Процесс аутентификации
Хранилище сеансов
Наиболее часто используемый метод хранения сессий — это хранилище KV, такое как Redis, которое относительно хорошо с точки зрения распределения, поддержки API и производительности.Кроме того, есть mysql и файловое хранилище.
Если сервис распределенный, с использованием файлового хранилища, возникает проблема синхронизации сессий между несколькими сервисами, контроль неверных блокировок чтения-записи в ситуациях высокой параллелизма.
Session Refresh
В упомянутом выше процессе отсутствует обновление сеанса. Мы не можем исключить пользователя по истечении времени после входа пользователя в систему. Если пользователь работал, пока сеанс действителен, время истечения должно быть обновлено в этот раз.
Взяв в качестве примера Koa, механизм обновления сеанса также относительно прост: Разработайте промежуточное программное обеспечение (по умолчанию все запросы будут проходить через промежуточное программное обеспечение), если сессия подтверждена, обновите срок действия сеанса: текущее время + время истечения.
оптимизация:
- Частое обновление сеанса повлияет на производительность. Вы можете обновить время истечения срока действия, когда срок действия сеанса подходит к концу.
- Если пользователь работает, один и тот же идентификатор сеанса может быть действительным в течение длительного времени. Утечка соответствующего файла cookie может привести к относительно большому риску. Вы можете создать идентификатор обновления одновременно с созданием идентификатора сеанса. Истечение срока действия идентификатора сеанса, используйте идентификатор обновления, чтобы запросить у сервера создание нового идентификатора сеанса (это решение требует, чтобы внешний интерфейс определил, что идентификатор сеанса недействителен, и отправил запрос с идентификатором обновления).
Вход с одного устройства
В некоторых случаях под одним терминалом разрешен вход только с одной учетной записи.Если вы переключаетесь на другой терминал, вам необходимо выкинуть терминал, на котором вы ранее вошли в автономный режим (по умолчанию одна и та же учетная запись может быть зарегистрирована на разных терминалах в то же время).
В это время можно использовать службу для сохранения соответствующей связи между уникальным идентификатором пользователя и значением sessionId.Если у того же пользователя другой идентификатор sessionId, ему не разрешено входить в систему или запускать предыдущий (удалить старый сессия).
3. ЮВТ
Введение
JSON Web Token (JWT) — это открытый стандарт (RFC 7519), определяющий компактный автономный способ безопасной передачи информации между сторонами в виде объектов JSON. Эту информацию можно проверить и доверять ей, поскольку она имеет цифровую подпись.
Состав JWT
JWT состоит из трех частей, а именно заголовка (header), полезной нагрузки (load) и подписи (visa), которые соединены десятичными точками.
Например, используйте файл cookie с именем jwt-token для хранения примера JWT:
jwt-token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoibHVzaGlqaWUiLCJpYXQiOjE1MzI1OTUyNTUsImV4cCI6MTUzMjU5NTI3MH0.WZ9_poToN9llFFUfkswcpTljRDjF4JfZcmqYS0JcKO8;
использовать.
Значение разделения можно разделить на три части, которые расположены по порядку:
-
header
:- Значение: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
- Декодирование Base64:
{"alg": "HS256", "type": "JWT"}
-
payload
:- Значение: eyJuYW1lIjoibHVzaGlqaWUiLCJpYXQiOjE1MzI1OTUyNTUsImV4cCI6MTUzMjU5NTI3MH0
- Декодирование Base64:
{ "name": "lushijie", "iat": 1532595255, // 发布时间 "exp": 1532595270 // 过期时间 }
-
signature
:- Значение: WZ9_poToN9llFFUfkswcpTljRDjF4JfZcmqYS0JcKO8.
- расшифровка:
const headerEncode = base64Encode(header); const payloadEncode = base64Encode(payload); let signature = HMACSHA256(headerEncode + '.' + payloadEncode, '密钥');
Процесс аутентификации
Проверка токена
Кроме того, относительно просто проверить, является ли JWT действительным.Сервер вычисляет подпись в соответствии с методом расчета, описанным выше, и сравнивает ее с частью подписи проверяемого JWT.Если часть подписи равна, это действующий JWT.
Token Refresh
Чтобы снизить риск утечки токена JWT, срок действия обычно устанавливается короче. Таким образом, срок действия токена JWT истечет, и пользователи не смогут часто входить в систему для получения нового токена JWT.
решение:
JWT Token и Refresh Token могут генерироваться одновременно, а срок действия Refresh Roken больше, чем у JWT Token, поэтому, когда срок действия JWT Token истекает, используйте Refresh Token для получения нового JWT Token и Refresh Token, из которых Refresh Token можно использовать только один раз.
4. ОАут
Введение
Иногда мы заходим на определенный веб-сайт, но не хотим регистрировать учетную запись для веб-сайта.В настоящее время мы можем войти с помощью сторонней учетной записи, такой как github, Weibo, WeChat, QQ и т. д. .
Открытая авторизация (OAuth) — это открытый стандарт, который позволяет пользователю разрешать сторонним приложениям получать доступ к личным ресурсам (таким как фотографии, видео, списки контактов), хранящимся у пользователя на веб-сайте, без предоставления имени пользователя и пароля третьим лицам. партийное приложение.
OAuth позволяет пользователям предоставлять токен вместо имени пользователя и пароля для доступа к своим данным, хранящимся у определенного поставщика услуг. Каждый токен разрешает определенному веб-сайту (например, веб-сайту редактирования видео) доступ к определенному ресурсу (например, просто видео в определенном альбоме) в течение определенного периода времени (например, в течение следующих 2 часов). Таким образом, OAuth позволяет пользователям разрешать сторонним веб-сайтам доступ к определенной информации, но не ко всему контенту, который они хранят у другого поставщика услуг.
OAuth — это дополнение к OpenID, но совершенно другой сервис.
- из Википедии
Процесс авторизации
Глоссарий:
- Стороннее приложение: Стороннее приложение также называется «клиент» (клиент). Например, откройте Zhihu, используйте сторонний логин и выберите Github для входа. В настоящее время Zhihu является клиентом.
- Владелец ресурса. Владелец ресурса, также известный как «пользователь» в этой статье, — это вошедший в систему пользователь.
- Сервер авторизации: сервер аутентификации, то есть сервер, который Github использует исключительно для обработки аутентификации.
- Сервер ресурсов: сервер ресурсов, то есть сервер, на котором Github хранит ресурсы, созданные пользователями. Он и сервер аутентификации могут быть одним сервером или другим сервером.
- A. Веб-сайт A позволяет пользователям перейти на GitHub и запросить код авторизации, GitHub требует, чтобы пользователи вошли в систему, а затем спрашивает: «Веб-сайт Zhuhu требует разрешения xx, вы согласны?»;
- B. Если пользователь соглашается, GitHub перенаправит обратно на веб-сайт A и отправит код авторизации;
- C. Веб-сайт A использует код авторизации для запроса токена от GitHub;
- D. GitHub возвращает токен;
- E. Веб-сайт A использует токен для запроса пользовательских данных у GitHub;
Другие режимы авторизации
Режим кода авторизации (код авторизации) — это режим авторизации с наиболее полными функциями и самым строгим процессом. Кроме режима кода авторизации, о котором мы упоминали выше, существуют и другие режимы авторизации:
- Упрощенный режим (тип неявного предоставления)
Некоторые веб-приложения представляют собой чистые интерфейсные приложения без серверной части. В настоящее время вышеуказанный метод использовать нельзя, и токен должен храниться во внешнем интерфейсе. В RFC 6749 указан второй способ, позволяющий выдавать токены непосредственно во внешний интерфейс. Таким образом, нет промежуточного шага кода авторизации
2. Режим пароля (предоставление учетных данных владельца ресурса)
Если у вас высокий уровень доверия к приложению, RFC 6749 также позволяет пользователям напрямую сообщать приложению свое имя пользователя и пароль. Приложение использует ваш пароль для запроса токена
3. Режим клиента (предоставление учетных данных клиента)
Применимо к приложениям командной строки без внешнего интерфейса, т.е. запрашивающим токены из командной строки.
Подробнее об этих режимах см.Четыре способа OAuth2.0
войти
Единый вход (Single Sign On, SSO), а именно: единый вход (single sign-on) вход в систему. Например: QQ, я один раз захожу в пространство QQ, я могу получить доступ к другим службам продуктов QQ: почтовый ящик QQ, новости Tencent и т. д., и все это может гарантировать, что ваша учетная запись останется в системе.
Дальнейшее чтение:
V. Резюме и сравнение
Нет лучшего, есть самое подходящее! ! !
- Аутентификация HTTP-аутентификации:
- Суммировать:
Существует несколько схем аутентификации, используемых в Generic HTTP Authentication Framework. Различные схемы аутентификации будут иметь разную степень безопасности. Аутентификация HTTP Authentication — наиболее часто используемая схема аутентификации HTTP.Чтобы снизить риск утечки, обычно требуется протокол HTTPS. - Применимая сцена:
Обычно он используется в системах с низкими требованиями к внутренней безопасности, таких как веб-интерфейсы управления маршрутизатором. - проблема:
- Запрос содержит аутентификационную информацию, которую легко перехватить.
- Не могу выйти
- Суммировать:
- Файл cookie + сеанс:
- Суммировать:
- Сервер сохраняет сеанс, а клиент сохраняет файл cookie, где файл cookie хранится как идентификатор сеанса.
- Он может гибко отзывать разрешения, а после обновления информации соответствующий контент в сеансе можно легко синхронизировать.
- Распределенные сеансы обычно используют хранилище Redis (или другое KV).
- используемые сцены:
Подходит для независимой аутентификации традиционных систем
- Суммировать:
- ЮВТ:
- Суммировать:
- Серверу больше не нужно хранить сеанс, а аутентификацию сервера и службу аутентификации можно легко расширить.
- JWT не полагается на файлы cookie и также может передаваться с помощью заголовков.
- Чтобы уменьшить кражу, используйте протокол HTTPS для передачи
- Применимая сцена:
- Подходит для простой аутентификации RESTful API
- Подходит для разовой проверки, например, ссылка для активации регистрации
- проблема:
- Токен нельзя сбросить во время использования, и токен всегда действителен в течение срока действия.
- Когда полезная информация обновляется, выданный токен не может быть синхронизирован
- Суммировать:
- ОАут:
- Суммировать:
- OAuth — это открытый стандарт, который позволяет пользователям разрешать сторонним приложениям получать доступ к информации, которую они хранят у другого поставщика услуг, без необходимости предоставлять имена пользователей и пароли сторонним мобильным приложениям или делиться всеми своими данными.
- Документация GitHub OAuthIdentifying and authorizing users for GitHub Apps
- Применимая сцена:
OAuth делится на следующие четыре режима.- Упрощенный режим, небезопасный, подходит для приложений с чистыми статическими страницами.
- Режим кода авторизации, режим авторизации с наиболее полными функциями и самым строгим процессом, обычно используемый на открытой платформе общедоступной сети.
- Режим пароля, обычно используемый во внутренних системах, вызывающий абонент является единицей пользователя.
- Клиентский режим, как правило, для вызовов API между внутренними системами. Вызывается между двумя платформами в единицах платформы.
- Суммировать: