Здесь рассказывается о том, как реализовать двухфакторную аутентификацию.
Двухфакторная аутентификация (2FA) - это метод безопасности управления идентификацией и доступом, который требует двух форм идентификации для доступа к ресурсам и данным. (Microsoft)
Существуют различные типы аутентификации 2FA.
Вот некоторые из них;
В этой статье я реализую 2FA на основе TOTP.
Алгоритм использует форму симметричной ключевой криптографии: один и тот же ключ используется обеими сторонами для генерации и проверки токена.
Алгоритм TOTP следует открытому стандарту, задокументированному в RFC 6238 . Входные данные включают общий секретный ключ и системное время.
Для этого я использовал несколько пакетов с открытым исходным кодом.
Этот пакет (Google2FA) является PHP-реализацией модуля двухфакторной аутентификации Google, поддерживающего алгоритм одноразового пароля на основе HMAC (HOTP), указанный в RFC 4226 , и алгоритм одноразового пароля на основе времени (TOTP), указанный в RFC 6238 .
Этот пакет позволяет нам;
Нам нужно задать каждому пользователю секретный ключ. С помощью этого секретного ключа мы будем генерировать QR, а приложения аутентификатора будут легко сканировать их. После этого, с помощью секретного ключа, мы сможем подтвердить сгенерированные коды с устройства.
Пример генерации секрета;
$google2fa = new Google2FA(); $secret = $google2fa->generateSecretKey(); // you can give length as first parameter for specify key length
Поэтому нам нужно сгенерировать QR-код для сканирования любым устройством. Для этого, в основном, нам нужен этот блок кода.
public function createInlineQRCode($email, $secret) { $google2fa = new Google2FA(); $inlineUrl = $google2fa->getQRCodeInline( 'APP_NAME', $email, $secret ); return $inlineUrl; }
Он создаст встроенный QR-код. Вам нужно сделать эхо. На любой странице вы можете легко использовать эти заголовки и эхо QR-кода.
header('Content-Type: image/svg+xml'); header('Cache-Control: no-cache, no-store, must-revalidate'); header('Pragma: no-cache'); header('Expires: 0'); echo $this->createInlineQRCode($user->email, $user->secret);
На последнем этапе нам необходимо проверить сгенерированный код. В этой библиотеке вам нужно использовать этот блок кода для проверки введенного кода.
public function verify($secret, $code) { $google2fa = new Google2FA(); return $google2fa->verifyKey($secret, $code); }
По сути, вам нужно передать секрет и код (введенный пользователем код) в метод verifyKey.
Я рассказал основные вещи о технической части. Давайте погрузимся в реальную реализацию с помощью потока.
Это основной поток моей реализации. Конечно, существуют различные типы и различные потоки, но для данной реализации этого достаточно.
Я создал основные 2 конечные точки для реализации этого потока в части бэкенда.
$app->router->get('/2fa/qr-code', 'TwoFAController@printQRCode'); $app->router->post('/2fa/verify', 'TwoFAController@verify2FA');
Конечная точка QR-кода в основном печатает изображение QR-кода с соответствующими заголовками HTPP, и я использую ее для сканирования с любого устройства.
Предназначен для проверки заданного кода от пользователя с соответствующим ключом безопасности. Эта конечная точка просто получает параметр кода, мы храним секреты в базе данных и не показываем их клиенту.
Нам нужно хранить секретные ключи, и мы можем хранить их в таблицах users или в таблице user_settings, если они у вас есть. Это полностью зависит от вас и вашего дизайна.
Если вы решите хранить их в таблице users, ваш SQL-запрос будет выглядеть следующим образом;
ALTER TABLE users ADD COLUMN secret varchar(32) DEFAULT NULL;
Примечание: Для совместимости с Google Authenticator нам необходимо хранить строки Base32.
Важно дать вам возможность отключить или включить 2FA для ваших пользователей. Вы можете хранить булево значение в вашей БД для этой опции. Например, с именем two_factor_enabled.
Это делается перед включением 2FA. Пользователям необходимо отсканировать QR-код и ввести его для включения 2FA.
QR-код генерируется конечной точкой 2fa/qr-code на лету.
После включения этого 2FA, он просит ввести 6-значный проверочный код.
21.03.2023 12:23
Веб-разработка - это захватывающая и постоянно меняющаяся область, которая постоянно развивается благодаря новым технологиям и тенденциям. Одним из самых популярных фреймворков для веб-разработки сегодня является React.js. Если вы начинающий веб-разработчик и хотите узнать больше о React.js, это...
21.03.2023 07:56
React и AngularJS - это два самых популярных фреймворка для веб-разработки. Оба фреймворка имеют свои уникальные особенности и преимущества, которые делают их подходящими для различных проектов веб-разработки.
20.03.2023 14:01
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а также новые инструменты веб-скраппинга с открытым исходным кодом для их обхода.
20.03.2023 12:24
Чтобы запустить этот код и рассчитать CGPA, необходимо сохранить код как HTML-файл, а затем открыть его в веб-браузере. Для этого выполните следующие действия:
20.03.2023 11:15
О тренинге HTML JavaScript :HTML (язык гипертекстовой разметки) и CSS (каскадные таблицы стилей) - две основные технологии для создания веб-страниц. HTML обеспечивает структуру страницы CSS (визуальное и звуковое) оформление для различных устройств. Наряду с графикой и сценариями HTML и CSS являются...
20.03.2023 08:46
Вам когда-нибудь требовалось собрать/развернуть только часть вашего приложения Angular или, возможно, скрыть некоторые маршруты в определенных средах?