Этот проект реализует HTTP-сервер на Rust с использованием actix-web
, tokio
, deadpool-postgres
и других библиотек для поддержки Digest Authentication с использованием реляционной базы данных PostgreSQL.
- Rust (установите с помощью rustup)
- PostgreSQL (установите с помощью официального сайта PostgreSQL)
cargo
(должен быть установлен вместе с Rust)jq
(установите с помощью brew или аналогичного менеджера пакетов)
- Запустите PostgreSQL сервер.
- Создайте базу данных:
psql -U postgres -c "CREATE DATABASE auth_db;"
- Настройте подключение к базе данных:
Создайте пользователя и задайте ему пароль:
psql -U postgres -c "CREATE USER myuser WITH PASSWORD 'mypassword';"
Дайте пользователю права на вашу базу данных:
psql -U postgres -c "GRANT ALL PRIVILEGES ON DATABASE auth_db TO myuser;"
- Создайте таблицы. Для этого выполните следующие команды в psql или используйте любой другой клиент для взаимодействия с PostgreSQL:
\c auth_db;
CREATE TABLE users (
id SERIAL PRIMARY KEY,
username VARCHAR(255) UNIQUE NOT NULL,
password VARCHAR(255) NOT NULL
);
CREATE TABLE nonces (
id SERIAL PRIMARY KEY,
username VARCHAR(255) NOT NULL,
nonce VARCHAR(255) NOT NULL,
expires_at TIMESTAMP NOT NULL
);
- Клонируйте репозиторий:
git clone https://github.com/yourusername/auth_server.git
cd auth_server
- Настройте зависимости в Cargo.toml:
[dependencies]
actix-web = "4.0"
tokio = { version = "1", features = ["full"] }
deadpool-postgres = { version = "0.10", features = ["with-actix"] }
tokio-postgres = "0.7"
jsonwebtoken = "8.3.0"
bcrypt = "0.12.1"
uuid = { version = "1", features = ["v4"] }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
thiserror = "1.0"
- Создайте файл .env в корне проекта и добавьте туда строку подключения к базе данных:
DATABASE_URL=postgres://myuser:mypassword@localhost/auth_db
- Соберите и запустите проект:
cargo run
Сервер должен запуститься на http://127.0.0.1:8080
.
Для демонстрации работы проекта предусмотрен скрипт auth_demo.sh, который выполняет следующие действия:
- Регистрирует пользователя
- Получает nonce
- Завершает аутентификацию
- Получает аутентифицированного пользователя
/bin/bash auth_demo.sh
#!/bin/bash
log() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1"
}
log "Starting digest authentication process demo..."
log "Registering user..."
RESPONSE=$(curl -s -X POST http://localhost:8080/register -H "Content-Type: application/json" -d '{"username": "testuser", "password": "testpassword"}')
log "Response from register user: $RESPONSE"
log "User registered."
log "Getting nonce..."
NONCE_RESPONSE=$(curl -s -X GET "http://localhost:8080/nonce?username=testuser")
log "Nonce received: $NONCE_RESPONSE"
NONCE=$(echo $NONCE_RESPONSE | jq -r '.nonce')
log "Calculating response..."
HA1=$(echo -n "testuser:auth_server:testpassword" | md5sum | awk '{print $1}')
HA2=$(echo -n "GET:/protected" | md5sum | awk '{print $1}')
RESPONSE=$(echo -n "$HA1:$NONCE:$HA2" | md5sum | awk '{print $1}')
log "HA1: $HA1"
log "HA2: $HA2"
log "Response calculated: $RESPONSE"
log "Authenticating user..."
AUTH_RESPONSE=$(curl -s -X POST http://localhost:8080/authenticate -H "Content-Type: application/json" -d "{\"username\": \"testuser\", \"nonce\": \"$NONCE\", \"response\": \"$RESPONSE\"}")
log "Response from authenticate user: $AUTH_RESPONSE"
TOKEN=$(echo $AUTH_RESPONSE | jq -r '.token')
log "JWT Token received: $TOKEN"
log "Getting user info..."
USER_INFO=$(curl -s -X GET http://localhost:8080/user -H "Authorization: Bearer $TOKEN")
log "Response from get user info: $USER_INFO"
log "Digest authentication process demo completed."
- Убедитесь, что ваш PostgreSQL сервер запущен и доступен.
- При изменении конфигурации базы данных не забудьте обновить файл .env.
Этот проект лицензирован на условиях MIT License.