Вопрос от Анонимного юзера 11 сентября 2025 16:47
Код автаризации

Ответ нейросети
11 сентября 2025 16:47
Похоже, задача просит реализовать простой код авторизации для учебного примера. Ниже приведён детальный разбор и рабочий пример на Python, который демонстрирует базовый цикл: регистрация пользователя, получение авторизационного кода, обмен кода на токен и проверку токена. Если вам нужен другой язык или более «реальный» OAuth 2.0 Flow (PKCE и пр.), скажите — адаптирую.
Что именно делает этот пример (пошагово):
- Регистрация пользователя: создаём пользователя с паролем и сохраняем хеш пароля.
- Вход и выдача кода: после проверки логина и пароля генерируем безопасный авторизационный код (код доступа), который действует ограниченное время.
- Обмен кода на токен: клиент передаёт код серверу, если код ещё не истёк, выдаётся access_token (токен доступа) с временем жизни.
- Проверка токена: можно проверить валидность выданного токена.
Готовый пример кода (Python 3.x). Сохраните в файл, например auth_demo.py и запустите.
import time import secrets import hashlib
Простые in-memory хранилища (для учебной задачи)
USERS = {} # username -> {'salt': str, 'password_hash': str} AUTH_CODES = {} # code -> {'username': str, 'expires_at': int} ACCESS_TOKENS = {} # token -> {'username': str, 'expires_at': int}
def hash_password(password, salt=None): """ Хеширование пароля с солью. Возвращает (salt, hash). """ if salt is None: salt = secrets.token_hex(16) # PBKDF2-HMAC-SHA256 для надёжного хеша пароля dk = hashlib.pbkdf2_hmac('sha256', password.encode(), salt.encode(), 100000) return salt, dk.hex()
def verify_password(stored_salt, stored_hash, password): """ Проверка: введённый пароль совпадает с сохранённым хешем. """ _, computed = hash_password(password, stored_salt) return computed == stored_hash
def register_user(username, password): """ Регистрация нового пользователя. """ if username in USERS: raise ValueError("Пользователь уже существует") salt, pwd_hash = hash_password(password) USERS[username] = {'salt': salt, 'password_hash': pwd_hash} print(f"Пользователь '{username}' зарегистрирован.")
def login_user(username, password, code_expiry=300): """ Проверка учётной записи и выдача авторизационного кода. code_expiry — время жизни кода в секундах (по умолчанию 5 минут). """ if username not in USERS: raise ValueError("Пользователь не найден") user = USERS[username] if not verify_password(user['salt'], user['password_hash'], password): raise ValueError("Неправильный пароль")
code = secrets.token_urlsafe(16) # безопасный код
expires_at = int(time.time()) + code_expiry
AUTH_CODES[code] = {'username': username, 'expires_at': expires_at}
print(f"Авторизационный код: {code} (истекает через {code_expiry} сек)")
return code
def exchange_code(code): """ Обмен авторизационного кода на токен доступа. """ rec = AUTH_CODES.get(code) if not rec: raise ValueError("Неверный код") if int(time.time()) > rec['expires_at']: del AUTH_CODES[code] raise ValueError("Код истёк")
username = rec['username']
# Генерируем токен доступа
access_token = secrets.token_urlsafe(24)
expires_at = int(time.time()) + 3600 # 1 час жизни
ACCESS_TOKENS[access_token] = {'username': username, 'expires_at': expires_at}
# Вынесение кода: предотвратить повторное использование
del AUTH_CODES[code]
return access_token, expires_at
def verify_access_token(token): """ Проверка валидности токена доступа. Возвращает True, если валиден, иначе False. """ info = ACCESS_TOKENS.get(token) if not info: return False if int(time.time()) > info['expires_at']: del ACCESS_TOKENS[token] return False return True
def main(): # Пример рабочего сценария register_user('alice', 'password123') # Регистрация code = login_user('alice', 'password123') # Получение кода token, exp = exchange_code(code) # Обмен кода на токен print("Access token:", token, "expires at", time.ctime(exp)) print("Токен валиден?", verify_access_token(token))
if name == 'main': main()
Пояснения к коду:
- Валидация паролей и хранение паролей: пароль хешируется с солью через pbkdf2_hmac; хранится соль и хеш. Это безопаснее чем хранить пароль "как есть".
- Авторизационный код: создаётся случайный безопасный код (token_urlsafe) и сохраняется вместе с пользователем и временем истечения. Код можно использовать один раз.
- Токен доступа: после обмена кодом выдается токен доступа с отдельным временем жизни (1 час). Токен можно проверить функцией verify_access_token.
- В примере данные хранятся в памяти (слеши в словарях), что подходит для учебной демонстрации. Для реального приложения хранение желательно вынести в БД и добавить очистку истёкших данных, а также использовать HTTPS и надёжную систему управления сессиями.
Если вы хотите:
- другой язык (JavaScript, Java, C#, PHP и т.д.) — скажите, и дам аналогичный пример.
- реализацию в рамках OAuth 2.0 Authorization Code Flow (с PKCE) — подготовлю пошаговое объяснение и рабочий пример эмуляции сервера авторизации и клиента.
- пример под конкретную задачу из вашего задания (например, тестовый запрос, конфигурация сервера, работа с базой данных) — уточните условие задания или пришлите текст/изображение задачи.
Сообщите, пожалуйста, язык или точное условие задачи, и я адаптирую решение под ваш случай.
Понравился ответ?
Задай свой вопрос
Напиши любую задачу или вопрос, а нейросеть её решит
