flask: как связать интерфейс с сервисом для выполнения аутентификации API? - PullRequest
2 голосов
/ 20 апреля 2020

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

Моя текущая попытка с полной реализацией :

Вот частичный код моей реализации для выполнения этой задачи. Пожалуйста, посмотрите мои 150 строк python кода реализации на весь мой код в этой публикации c gist

from functools import wraps
import requests, json, psycopg2, datetime
from time import time
from flask import Flask, request
from flask_sqlalchemy import SQLAlchemy
from flask_restplus import Resource, Api, abort, fields, inputs, reqparse
from itsdangerous import SignatureExpired, JSONWebSignatureSerializer, BadSignature


class AuthenticationToken:
    def __init__(self, secret_key, expires_in):
        self.secret_key = secret_key
        self.expires_in = expires_in
        self.serializer = JSONWebSignatureSerializer(secret_key)

    def generate_token(self, username):
        info = {
            'username': username,
            'creation_time': time()
        }

        token = self.serializer.dumps(info)
        return token.decode()

    def validate_token(self, token):
        info = self.serializer.loads(token.encode())

        if time() - info['creation_time'] > self.expires_in:
            raise SignatureExpired("The Token has been expired; get a new token")

        return info['username']


SECRET_KEY = "f4b58245-6fd4-4bce-a8a4-27ca37370a3c"
expires_in = 600
auth = AuthenticationToken(SECRET_KEY, expires_in)

db = SQLAlchemy(app)

пожалуйста, смотрите продолжение моей попытки на этом весь мой код . Я в значительной степени закодировал все для аутентификации API, но не смог получить всплывающее окно аутентификации, которое я ожидал в желаемом выводе.

Обновление: вывод на конечной точке сервера :

Когда я попытался http://127.0.0.1:5000/token на конечной точке сервера, я получил ошибку Not Found. Как я могу получить желаемый результат? Любая идея?

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

желаемый вывод :

Я хочу сделать защитное представление для тестового API перед использованием вызова API на конечной точке сервера. Вот представление авторизации макет API, которое я хочу получить:

enter image description here

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

обновление

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

Ответы [ 2 ]

1 голос
/ 06 мая 2020

Как показывают комментарии, нет простого фрагмента кода, который кто-либо может поделиться, чтобы ответить на этот вопрос. Вы в основном просите блог из пяти частей о том, как присоединить базу данных к приложению Flask для аутентификации учетных данных API. Я знаю, что это не так, но ваши вопросы действительно касаются одной темы c. Я думаю, что вам лучше всего взглянуть на Flask Mega Tutorial Часть IV Базы данных и Часть V Пользовательские логины . Эти учебные пособия охватывают основные концепции, которые, по-видимому, отсутствуют в вашем коде, а именно:

  1. Использование SQLalchemy для определения моделей вашей базы данных
  2. Определение базовой c таблицы авторизации в вашей БД
  3. Использование шифрования, чтобы ваши токены авторизации не могли быть извлечены из базы данных
  4. Удаление устаревших токенов из таблицы аутентификации
  5. Использование встроенных методов для проверки авторизации, таких как Flask -Github-пример github-callback или Flask -Login's login_required декоратор
  6. Использование flask -SQLalchemy's create_db yo создайте базу данных из вашей модели
  7. Использование flask -SQLalchemy's db.session для установки / получения данных из db

Я думаю, что Flask Mega-Tutorial будет полезным.

0 голосов
/ 06 мая 2020

Если я вас правильно понимаю, вы хотите реализовать реализацию на основе токенов, аналогичную JWT-авторизации .

JWT в целом

Что такое JWT - это прекрасно в сумме: документы. nginx .com> JWT-авторизация с надписью

JWT - это формат данных для пользовательской информации в стандарте OpenID Connect, который является стандартным слоем идентификации сверху протокола OAuth 2.0. Разработчики API и микросервисов также обращаются к стандарту JWT за его простоту и гибкость. При аутентификации JWT клиент предоставляет JSON веб-токен, и токен будет проверен на соответствие локальному файлу ключа или удаленной службе.

Вам не обязательно выполнять JWT на веб-сервере на уровне, но я обычно предпочитаю выполнять аутентификацию на уровне веб-сервера, чтобы разделить данные (конечные точки) и обеспечить безопасность.

Давайте теперь сосредоточимся на JWT с flask. blog.teclacode.com прекрасно подводит итог рабочего процесса [мои комментарии]:

  1. Пользователь предоставляет свое имя пользователя и пароль [для необычной конечной точки]

[Следующие 3 шага происходят в этой необычной конечной точке].

Мы подтверждаем, что они верны в нашем Flask приложении Мы генерируем JWT, который содержит идентификатор пользователя. Мы отправляем это пользователю. Всякий раз, когда пользователь делает запрос к нашему приложению, он должен отправить нам JWT, который мы создали ранее.

Я полагаю, что ваша задача охватывает этапы с 1 по 4. Шаг 5, который вы, кажется, уже реализовали: Это незащищенная конечная точка (точки) плюс дополнительный , обязательный POST-параметр token. Эти конечные точки будут возвращать данные клиенту после предоставления действующего токена. Другими словами: каждая обычная конечная точка вызывает функцию, которая проверяет данный токен. Это понимание правильно? Шаг 5 уже работает для вас?

Я никогда не реализовывал JWT с python, но быстрый поиск пакетов с JWT по именам дает мне впечатление, что есть много готовых для использования генераторов токенов, которые вы «просто» должны настроить.

Погрузитесь в свой код

Несколько вопросов о вашем коде:

  1. Делаете ли вы действительно хотите жестко закодировать свой секретный ключ внутри своего кода? Это серьезный недостаток безопасности, так как ключ будет раскрыт во всех ваших GIT коммитах и ​​c.
  2. Весь ваш код на GIT нелегок, так как в некоторых файлах есть некоторые синтаксические ошибки, которые мешают полнотекстовому поиску, сообщение об ошибке гласит:

    Мы можем сделать этот файл красиво и доступно для поиска, если исправлены некоторые ошибки.

  3. Где и как определяется user_db? Вы упомянули это в комментарии, но я не могу найти это в другом месте. Было бы полезно иметь параграф по этому вопросу в вашем вопросе.
  4. Я полагаю, что http://127.0.0.1:5000/token - это конечная точка, которая предоставляет токен, но я не совсем понимаю из вопроса в его текущей форме, где конечная точка /token реализовано.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...