8

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

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

EDIT:

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

@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') 
+0

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

+0

Каждый раз вы имеете в виду каждую сессию? Если это так, это прекрасно, что им придется снова аутентифицироваться. Есть ли причина, по которой это будет проблемой? – Amerikaner

ответ

11

Эй Amedrikaner!

Похоже, что ваш прецедент достаточно прост, чтобы мы могли реализовать это сами. В приведенном ниже коде я буду хранить ваш токен в сеансе пользователей и проверять новую оболочку. Давайте начнем с создания собственной оболочки, я обычно просто помещаю их в файл 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 Ого! Я забыл упомянуть, что вам нужно установить SECRET_KEY в конфигурацию ваших приложений.

Выполняется только файл config.py с SECRET_KEY = "SOME_RANDOM_STRING". Затем загрузите его с помощью ...

main.config.from_object(config) 
+0

Это именно то, что я искал. Спасибо, F Boucaut! – Amerikaner

+0

Нужны ли нам эти два элемента или нет другой функции для проверки учетных данных пользователя по базе данных? –

+0

@EvanBurbidge Извините за поздний ответ. Эта реализация была специально предназначена для аутентификации пользователей в отношении внешнего API в другом месте. Скорее всего, вы хотите следовать стандартным входным потокам пользователей, посмотрите эту ссылку для получения более https://flask-login.readthedocs.io/en/latest/ –

Смежные вопросы