JSON уеб токените са лесни за използване и отстраняване на грешки, но също така предлагат впечатляващо повишаване на сигурността.

Неработещото удостоверяване продължава да бъде постоянна уязвимост в съвременните уеб приложения – то все още се класира високо в 10-те най-големи рискове за сигурността на API на OWASP.

Ефектите от тази уязвимост могат да бъдат сериозни. Те могат да предоставят неоторизиран достъп до чувствителни данни и да компрометират целостта на системата. За да гарантирате ефективно сигурен достъп до приложенията и техните ресурси, жизненоважно е да използвате надеждни механизми за удостоверяване.

Разберете как можете да приложите потребителско удостоверяване във Flask с помощта на JSON Web Tokens (JWT), популярен и ефективен метод, базиран на токени.

Удостоверяване на базата на токени с помощта на JSON уеб токени

Удостоверяването, базирано на токени, използва криптиран низ от знаци за валидиране и разрешаване на достъп до система или ресурс. Можете да приложите този тип удостоверяване, като използвате различни методи, включително сесийни токени, API ключове и JSON уеб токени.

instagram viewer

JWT, по-специално, предлагат сигурен и компактен подход за предаване на необходимите потребителски идентификационни данни между приложения от страна на клиента и сървъри.

JWT се състои от три основни компонента: заглавка, полезен товар и подпис. Заглавката съдържа метаданни за токена, включително алгоритъма за хеширане, използван за кодиране на токена.

Полезният товар съдържа действителните потребителски идентификационни данни, като потребителски идентификатор и разрешения. И накрая, подписът гарантира валидността на токена, като проверява съдържанието му с помощта на таен ключ.

С помощта на JWT можете да удостоверявате потребители и да съхранявате данни за сесията в самия токен.

Настройте Flask проект и MongoDB база данни

За да започнете, създайте нова директория на проекта с помощта на терминал:

mkdir колба-проект
cd колба-проект

След това инсталирайте virtualenv, за да създадете локална виртуална среда за разработка за вашия проект Flask.

virtualenv venv

Накрая активирайте виртуалната среда.

# Unix или MacOS: 
източник venv/bin/activate

# Windows:
.\venv\Scripts\activate

Можете да намерите кода на този проект тук GitHub хранилище.

Инсталирайте необходимите пакети

В главната директория на папката на вашия проект създайте нова изисквания.txt файл и добавете тези зависимости за проекта:

колба
pyjwt
python-dotenv
пимонго
bcrypt

И накрая, изпълнете командата по-долу, за да инсталирате пакетите. Уверете се, че имате пип (мениджър на пакети) инсталиран; ако не, инсталирайте го на вашата Windows, Mac или Linux система.

pip install -r requirements.txt

Създайте MongoDB база данни

Продължете и създайте база данни MongoDB. Можеш настройте локална база данни MongoDB, алтернативно, създайте клъстер в MongoDB Atlas, базирана на облак услуга MongoDB.

След като създадете базата данни, копирайте URI адреса на връзката, създайте a .env файл в основната директория на вашия проект и го добавете, както следва:

MONGO_URI=""

И накрая, конфигурирайте връзката с базата данни от вашето приложение Flask. Създайте нов utils/db.py файл в основната директория на вашия проект с този код:

от пимонго импортиране MongoClient

дефсвържете се с_mongodb(mongo_uri):
клиент = MongoClient (mongo_uri)
db = client.get_database("потребители")
връщане db

Тази функция установява връзка с базата данни MongoDB, като използва предоставения URI адрес за връзка. След това създава нов потребители колекция, ако не съществува, и връща съответния екземпляр на базата данни.

Създайте уеб сървъра Flask

С конфигурирана база данни, продължете и създайте app.py файл в основната директория на папката на проекта и добавете следния код, за да създадете екземпляр на приложението Flask.

от колба импортиране Колба
от routes.user_auth импортиране register_routes
от utils.db импортиране свържете се с_mongodb
импортиране операционна система
от dotenv импортиране load_dotenv

приложение = Колба (__име__)
load_dotenv()

mongo_uri = os.getenv(„MONGO_URI“)
db = connect_to_mongodb (mongo_uri)

register_routes (приложение, db)

ако __име__ == '__основен__':
app.run (debug=Вярно)

Създайте крайните точки на API за удостоверяване

За да приложите удостоверяване на потребителя във вашето приложение Flask, е от решаващо значение да дефинирате необходимите крайни точки на API, които обработват операции, свързани с удостоверяване.

Първо обаче дефинирайте модела за данните на потребителите. За да направите това, създайте нов модел/user_model.py файл в основната директория и добавете следния код.

от pymongo.колекция импортиране колекция
от bson.objectid импортиране ObjectId

класПотребител:
деф__в него__(себе си, колекция: Колекция, потребителско име: str, парола: str):
self.collection = събиране
self.username = потребителско име
self.password = парола
дефспаси(себе си):
потребителски_данни = {
'потребителско име': self.username,
"парола": самостоятелна парола
}
резултат = self.collection.insert_one (user_data)
връщане str (result.inserted_id)

@статичен метод
дефнамиране_по_идентификатор(колекция: Колекция, user_id: str):
връщане collection.find_one({'_документ за самоличност': ObjectId (user_id)})

@статичен метод
дефнамиране_по_потребителско име(колекция: Колекция, потребителско име: str):
връщане collection.find_one({'потребителско име': потребителско име})

Кодът по-горе указва a Потребител клас, който служи като модел на данни и дефинира няколко метода за взаимодействие с MongoDB колекция за извършване на операции, свързани с потребителя.

  1. The спаси метод записва нов потребителски документ с предоставеното потребителско име и парола в колекцията MongoDB и връща идентификатора на вмъкнатия документ.
  2. The намиране_по_идентификатор и намиране_по_потребителско име методите извличат потребителски документи от колекцията въз основа съответно на предоставения потребителски идентификатор или потребителско име.

Определете маршрутите за удостоверяване

  1. Нека започнем с определяне на маршрута за регистрация. Този маршрут ще добави нови потребителски данни към потребителската колекция на MongoDB. В основната директория създайте нова routes/user_auth.py файл и следния код.
    импортиране jwt
    от functools импортиране обвивки
    от колба импортиране jsonify, заявка, make_response
    от модели.user_model импортиране Потребител
    импортиране bcrypt
    импортиране операционна система

    дефregister_routes(приложение, db):
    колекция = db.users
    app.config [„SECRET_KEY“] = os.urandom(24)

    @app.route('/api/register', methods=['POST'])
    дефрегистрирам():

    потребителско име = request.json.get('потребителско име')
    парола = request.json.get("парола")

    съществуващ_потребител = User.find_by_username (колекция, потребителско име)
    ако съществуващ_потребител:
    връщане jsonify({"съобщение": 'Потребителското име вече съществува!'})

    хеширана_парола = bcrypt.hashpw (password.encode('utf-8'), bcrypt.gensalt())
    new_user = Потребител (колекция, потребителско име, хеширана_парола.decode('utf-8'))
    user_id = new_user.save()

    връщане jsonify({"съобщение": 'Потребителят се регистрира успешно!', 'user_id': user_id})

  2. Внедрете функцията за влизане, за да се справите с процеса на удостоверяване и да проверите идентификационните данни на потребителя. Под маршрута за регистрация добавете следния код.
     @app.route('/api/login', methods=['POST'])
    дефВлизам():
    потребителско име = request.json.get('потребителско име')
    парола = request.json.get("парола")
    потребител = User.find_by_username (колекция, потребителско име)
    ако потребител:
    ако bcrypt.checkpw (password.encode('utf-8'), потребител ["парола"].encode('utf-8')):
    токен = jwt.encode({'user_id': str (потребител ['_документ за самоличност'])}, app.config[„SECRET_KEY“], алгоритъм="HS256")

    отговор = make_response (jsonify({"съобщение": 'Успешен вход!'}))
    response.set_cookie('token', символ)
    връщане отговор

    връщане jsonify({"съобщение": 'Невалидно потребителско име или парола'})

    Крайната точка за влизане прави две неща: проверява предоставените потребителски идентификационни данни и при успешно удостоверяване генерира уникален JWT за този потребител. Той задава този токен като бисквитка в отговора, заедно с JSON полезен товар, показващ успешно влизане. Ако идентификационните данни са невалидни, той ще върне JSON отговор, за да го посочи.
  3. Дефинирайте функция за декориране, която проверява JSON уеб токените (JWT), предадени заедно с последващите API заявки. Добавете кода по-долу в рамките на register_routes функционален кодов блок.
    дефtoken_requiredе):
    @wraps (е)
    дефукрасени(*args, **kwargs):
    токен = request.cookies.get('token')

    аконе токен:
    връщане jsonify({"съобщение": „Жетонът липсва!“}), 401

    опитвам:
    данни = jwt.decode (токен, app.config[„SECRET_KEY“], алгоритми=["HS256"])
    current_user = User.find_by_id (колекция, данни['user_id'])
    с изключение jwt. ExpiredSignatureError:
    връщане jsonify({"съобщение": „Жетонът е изтекъл!“}), 401
    с изключение jwt. InvalidTokenError:
    връщане jsonify({"съобщение": 'Невалиден Жетон!'}), 401

    връщане f (текущ_потребител, *args, **kwargs)

    връщане украсени

    Тази функция за декориране гарантира наличието на валиден JWT токен в следващите API заявки. Той проверява дали токенът липсва, изтекъл е или е валиден и връща подходящ JSON отговор, ако е такъв.
  4. Накрая създайте защитен маршрут.
     @app.route('/api/users', methods=['GET'])
    @token_required
    дефget_users(текущия потребител):
    потребители = списък (collection.find({}, {'_документ за самоличност': 0}))
    връщане jsonify (потребители)

Тази крайна точка управлява логиката за извличане на потребителски данни от базата данни, но изисква клиентът, изпращащ заявки, да включва валиден токен за достъп до данните.

Накрая изпълнете командата по-долу, за да завъртите сървъра за разработка.

колба run

За да тествате регистрацията, влизането и крайната точка на защитените потребители, можете да използвате Postman или всеки друг API клиент. Изпращайте заявки до http://localhost: 5000/api/и наблюдавайте отговорите, за да проверите функционалността на тези крайни точки на API.

Удостоверяването на токена надеждна мярка за сигурност ли е?

JSON уеб токените предоставят стабилен и ефективен начин за удостоверяване на потребителите за вашето уеб приложение. Въпреки това е важно да разберете, че удостоверяването на токена не е безупречно; това е само едно парче от по-голям пъзел за сигурност.

Комбинирайте удостоверяването на токена с други най-добри практики за сигурност. Не забравяйте да наблюдавате непрекъснато и да приемете последователни практики за сигурност; значително ще подобрите цялостната сигурност на вашите Flask приложения.