Лабораторна робота №3

JSON Web Tokens (JWT) в Flask: Теоретичні відомості

1. Що таке JSON Web Token (JWT):

  • JWT - це відкритий стандарт (RFC 7519), який визначає компактний та самостійний спосіб представлення інформації між сторонами як об'єкти JSON. JWT використовується для передачі інформації між двома сторонами у вигляді JSON-об'єкта, який є безпечним та може бути перевірений.

2. Структура JWT:

  • JWT складається з трьох частин: заголовка (Header), корисної навантаження (Payload) та підпису (Signature). Заголовок і корисна навантаження базуються на кодуванні Base64, а підпис генерується з допомогою алгоритму підпису (наприклад, HMAC SHA256 або RSA).

3. JWT у Flask:

  • У Flask для роботи з JWT зазвичай використовують бібліотеку, таку як PyJWT.

4. Генерація JWT:

  • Для генерації JWT у Flask використовують функцію encode бібліотеки PyJWT. Приклад:
import jwt from datetime import datetime, timedelta # Заголовок header = {"alg": "HS256", "typ": "JWT"} # Корисна навантаження payload = {"user_id": 123, "exp": datetime.utcnow() + timedelta(days=1)} # Секретний ключ для підпису secret_key = "your_secret_key" # Генерація JWT token = jwt.encode(payload, secret_key, algorithm="HS256") ```

5. Декодування та перевірка JWT:

  • Для декодування та перевірки JWT використовують функцію decode бібліотеки PyJWT. Приклад:
# Декодування та перевірка JWT
decoded_token = jwt.decode(token, secret_key, algorithms=["HS256"])
```

Приклад реалізації в Flask:


from flask import Flask, request, jsonify
import jwt
from datetime import datetime, timedelta

app = Flask(__name__)
app.config['SECRET_KEY'] = 'your_secret_key'

@app.route('/login', methods=['POST'])
def login():
data = request.get_json()
user_id = get_user_id(data['username'], data['password'])

if user_id:
# Генерація JWT
expiration_time = datetime.utcnow() + timedelta(days=1)
token = jwt.encode({'user_id': user_id, 'exp': expiration_time}, app.config['SECRET_KEY'], algorithm='HS256')
return jsonify({'token': token})

return jsonify({'message': 'Invalid credentials'}), 401

@app.route('/protected', methods=['GET'])
def protected():
token = request.headers.get('Authorization').split(" ")[1]

try:
# Декодування та перевірка JWT
decoded_token = jwt.decode(token, app.config['SECRET_KEY'], algorithms=['HS256'])
user_id = decoded_token['user_id']
return jsonify({'message': 'Access granted for user {}'.format(user_id)})
except jwt.ExpiredSignatureError:
return jsonify({'message': 'Token has expired'}), 401
except jwt.InvalidTokenError:
return jsonify({'message': 'Invalid token'}), 401

if __name__ == '__main__':
app.run(debug=True)

У цьому прикладі ми використовуємо Flask для створення двох маршрутів: один для отримання токена (авторизація) та інший для захищеного маршруту (авторизація). Щоб отримати доступ до захищеного маршруту, клієнт повинен передати JWT через заголовок Authorization.

Будь ласка, звертайте увагу, що це лише простий приклад, і в реальному застосуванні важливо ретельно обробляти помилки та дотримуватися найкращих практик забезпечення.


Завдання

Мета лабораторної роботи: Впровадження системи аутентифікації та авторизації на основі Flask-JWT у веб-сервісі, який використовує API для взаємодії.

  1. Додайте  Flask-JWT до залежностей вашого Flask-додатка. Встановіть необхідні пакети за допомогою pip.
  2. Створіть маршрут для авторизації користувача, де користувачі можуть ввести свою електронну пошту та пароль через POST-запит.
    Використовуйте Flask-JWT для аутентифікації користувача та видавайте ідентифікатор сеансу або токен доступу як частину відповіді.
  3. Визначте API-маршрути, доступ до яких повинен бути захищений автентифікацією.
    Додайте функціонал декодування та перевірки JWT  для перевірки валідності сесії при кожному запиті до захищених маршрутів.
  4. Створіть маршрут для реєстрації користувача через POST-запит, де вони можуть вказати свою електронну пошту та пароль.
    Реалізуйте функцію, яка перевіряє унікальність електронної пошти та зберігає інформацію про нового користувача у базі даних.
    Після реєстрації видавайте токен доступу, щоб забезпечити автоматичний вхід.
  5. Створіть маршрут або функцію для виходу користувача, яка розриває зв'язок між користувачем та сесією або анулює токен доступу.