Как реализовать аутентификацию токена в Flask?

Я пытаюсь разрешить пользователям входить в мое приложение Flask, используя их учетные записи из отдельной веб-службы. Я могу связаться с api этого веб-сервиса и получить токен безопасности. Как использовать этот токен для аутентификации пользователей, чтобы они имели доступ к ограниченным представлениям?

Мне не нужно сохранять пользователей в мою собственную базу данных. Я только хочу, чтобы они были аутентифицированы для сеанса. Я считаю, что это можно сделать, используя Flask-Security и @auth_token_required decorator, но документация не очень детализирована, и я не уверен, как это реализовать.

РЕДАКТИРОВАТЬ:

Вот пример кода:

@main.route("/login", methods=["GET", "POST"]) def login(): payload = {"User": "john", "Password": "password123"} url = "http://webserviceexample/api/login" headers = {'content-type': 'application/json'}) #login to web service r = requests.post(url, headers=headers, json=payload) response = r.json() if (r.status_code is 200): token = response['user']['authentication_token'] # allow user into protected view return render_template("login.html", form=form) @main.route('/protected') @auth_token_required def protected(): return render_template('protected.html') 

One Solution collect form web for “Как реализовать аутентификацию токена в Flask?”

Эй, там Амидриканер!

Похоже, ваш прецедент достаточно прост, и мы можем реализовать это сами. В приведенном ниже коде я буду хранить ваш токен в сеансе пользователей и проверять новую оболочку. Давайте начнем с создания собственной оболочки, я обычно просто помещаю их в файл wrappers.py, но вы можете разместить его там, где хотите.

 def require_api_token(func): @wraps(func) def check_token(*args, **kwargs): # Check to see if it's in their session if 'api_session_token' not in session: # If it isn't return our access denied message (you can also return a redirect or render_template) return Response("Access denied") # Otherwise just send them where they wanted to go return func(*args, **kwargs) return check_token 

Круто!

Теперь мы реализовали нашу оболочку, мы можем просто сохранить их токен на сеанс. Супер простой. Давайте изменим вашу функцию …

 @main.route("/login", methods=["GET", "POST"]) def login(): payload = {"User": "john", "Password": "password123"} url = "http://webserviceexample/api/login" headers = {'content-type': 'application/json'}) #login to web service r = requests.post(url, headers=headers, json=payload) response = r.json() if (r.status_code is 200): token = response['user']['authentication_token'] # Move the import to the top of your file! from flask import session # Put it in the session session['api_session_token'] = token # allow user into protected view return render_template("login.html", form=form) 

Теперь вы можете проверить защищенные представления с помощью обложки @require_api_token, например …

 @main.route('/super_secret') @require_api_token def super_secret(): return "Sssshhh, this is a secret" 

EDIT Woah! Я забыл упомянуть, что вам нужно установить SECRET_KEY в конфигурацию ваших приложений.

Будет работать только файл config.py с SECRET_KEY = "SOME_RANDOM_STRING". Затем загрузите его с помощью …

 main.config.from_object(config) 
Interesting Posts

Как работают потоки в Python и какие общие ошибки Python-threading?

Ошибка несоответствия формы кофе с использованием предварительной модели VGG-16

«Псевдотерминал не будет выделен, потому что stdin не является терминалом» при запуске ssh через python без paramiko

Циркулярный импорт модели SQLAlchemy

Как написать 24-битный WAV-файл в Python?

В чем разница между Python и IPython?

Найти первый не повторяющийся символ в строке

Получить список, содержащий строковые элементы, исключая элементы, предваряемые любым другим элементом из исходного списка

Python argparse: Множество вариантов результатов приводит к уродливой помощи

Старые файлы администратора django

Я не могу установить python-ldap

Python записывает в CSV строку за строкой

Тревожные повторяющиеся элементы с использованием TAL, Chameleon и Pyramid

Не можете найти ReleaseCapture в opencv при использовании python?

Как перенаправить вывод «print» в файл с помощью python?

Python - лучший язык программирования в мире.