Меня зовут Иван и я разработчик веб-приложений. В своей работе я часто сталкиваюсь с задачей создания эндпоинтов для авторизации и аутентификации пользователей. Я хотел поделиться своим опытом использования fastapi, фреймворка, который помог мне справиться с этой задачей подробных.
Установка fastapi и необходимых зависимостей
Первым шагом была установка fastapi и необходимых зависимостей. Я использовал pip для установки fastapi⁚
pip install fastapi
После установки fastapi, мне понадобилось установить зависимости, такие как PyJWT и SQLAlchemy⁚
pip install PyJWT
pip install SQLAlchemy
Настройка базы данных и моделей
Для сохранения информации о пользователях, ролей и токенах я использовал базу данных SQLite и SQLAlchemy для работы с базой данных. Я создал модели для пользователей и ролей следующим образом⁚
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
Base declarative_base
class User(Base)⁚
__tablename__ ″users″
id Column(Integer, primary_keyTrue, indexTrue)
username Column(String, uniqueTrue, indexTrue)
password Column(String)
class Role(Base)⁚
__tablename__ ″roles″
id Column(Integer, primary_keyTrue, indexTrue)
name Column(String, uniqueTrue, indexTrue)
Создание эндпоинтов для авторизации и аутентификации
Следующим шагом я создал эндпоинты для авторизации и аутентификации пользователей с использованием fastapi. Я использовал PyJWT для генерации и проверки токенов. Вот пример кода для создания эндпоинта для регистрации пользователя⁚
from fastapi import FastAPI, HTTPException
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
from passlib.context import CryptContext
from jose import JWTError, jwt
from datetime import datetime, timedelta
app FastAPI
oauth2_scheme OAuth2PasswordBearer(tokenUrl″token″)
pwd_context CryptContext(schemes[″bcrypt″], deprecated″auto″)
SECRET_KEY ″mysecretkey″
ALGORITHM ″HS256″
ACCESS_TOKEN_EXPIRE_MINUTES 30
def create_access_token(data⁚ dict, expires_delta⁚ timedelta)⁚
to_encode data.copy
expire datetime.utcnow expires_delta
to_encode.update({″exp″⁚ expire})
encoded_jwt jwt.encode(to_encode, SECRET_KEY, algorithmALGORITHM)
return encoded_jwt
async def get_current_user(token⁚ str Depends(oauth2_scheme))⁚
credentials_exception HTTPException( status_codestatus.HTTP_401_UNAUTHORIZED,
detail″Could not validate credentials″,
headers{″WWW-Authenticate″⁚ ″Bearer″},
)
try⁚
payload jwt.decode(token, SECRET_KEY, algorithms[ALGORITHM])
username⁚ str payload.get(″sub″)
if username is None⁚
raise credentials_exception
except JWTError⁚
raise credentials_exception
@app.post(″/register")
async def register_user(username⁚ str, password⁚ str)⁚
hashed_password pwd_context.hash(password)
user User(usernameusername, passwordhashed_password)
# код для сохранения пользователя в базу данных
@app.post(″/login")
async def login(form_data⁚ OAuth2PasswordRequestForm Depends)⁚
user await get_user_by_username(form_data.username)
if not user⁚
raise HTTPException(status_code400, detail″Incorrect username or password″)
if not pwd_context.verify(form_data.password, user.password)⁚
raise HTTPException(status_code400, detail″Incorrect username or password″)
access_token_expires timedelta(minutesACCESS_TOKEN_EXPIRE_MINUTES)
access_token create_access_token(
data{″sub″⁚ user.username},
expires_deltaaccess_token_expires
)
return {″access_token″⁚ access_token, ″token_type″⁚ ″bearer″}
В приведенном выше примере кода, при регистрации пользователя его пароль хэшируется с использованием кодирования bcrypt и сохраняется в базе данных. При входе в систему пользователь вводит свои учетные данные, и их проверка также осуществляется с использованием bcrypt.
Распределение ролей для пользователей
Чтобы распределить роли для пользователей, я добавил в модель пользователя поле role_id, которое представляет связь с таблицей ролей. Я также создал эндпоинт для присвоения роли пользователю⁚
@app.put(″/assign-role/{user_id}/{role_id}")
async def assign_role(user_id⁚ int, role_id⁚ int)⁚
user await get_user_by_id(user_id)
role await get_role_by_id(role_id)
if not user or not role⁚
raise HTTPException(status_code400, detail″User or role not found″)
user.role_id role.id
# код для обновления пользователя в базе данных
В приведенном выше примере кода, при вызове этого эндпоинта выполняется поиск пользователя и роли по их идентификаторам, и пользователю присваивается указанная роль.
Полезные ссылки
Если вы хотите узнать больше о fastapi, официальная документация является отличным ресурсом для изучения⁚
Благодаря использованию fastapi я легко создал эндпоинты для авторизации и аутентификации пользователей, получения токенов и распределения ролей. Я очень доволен результатом и рекомендую fastapi всем, кто занимается разработкой веб-приложений.