Колба, успокаивающая с проверкой подлинности PyJWT - PullRequest
0 голосов
/ 26 сентября 2019

Справочная информация:

Я пытаюсь создать прототип быстрой аутентификации на основе токенов с использованием Flask-Restful и PyJWT.Идея заключается в том, что у меня будет форма с адресом электронной почты и паролем, и когда пользователь нажмет кнопку «Отправить», он сгенерирует токен, сохранит его в браузере на стороне клиента и будет использовать его в любых последующих запросах до истечения срока действия токена.

Trouble

В моем прототипе я смог создать токен с помощью JWT, но у меня нет идеи, как передать JWT в последующий запрос.Когда я делаю это в Почтальоне, это работает, потому что я могу указать заголовок авторизации с токеном там.Но когда я вхожу в систему через пользовательский интерфейс и создается токен, я не знаю, как передать сгенерированный токен в последующий запрос (/ защищенный), чтобы токен сохранялся в заголовке до истечения срока его действия.В настоящее время, когда я вхожу из пользовательского интерфейса и захожу в / protected, в заголовке / protected отсутствует заголовок авторизации.

Код

class LoginAPI(Resource):
    # added as /login

    def get(self):
        """
        renders a simple HTML with email and password in a form.
        """
        headers = {'Content-Type': 'text/html'}
        return make_response(render_template('login.html'), 200, headers)

    def post(self):

        email = request.form.get('email')
        password = request.form.get('password')

        # assuming the validation has passed.

        payload = {
            'user_id': query_user.id,
            'exp': datetime.datetime.utcnow() + datetime.timedelta(minutes=10)
        }

        token = jwt\
            .encode(payload, current_app.config['JWT_SECRET'], current_app.config['JWT_ALGORITHM'])\
            .decode('utf-8')

        # Is below the right way to set the token into header to be used in subsequent request?
        # request.headers.authorization = token

        # when {'authorization': token} below as a header, the header only shows up for /login not for any subsequent request.

        return make_response({'result': 'success', 'token': token}, 200, {'authorization': token} )


class ProtectedAPI(Resource):
    @check_auth
    def get(self):

        return jsonify({'result': 'success', 'message': 'this is a protected view.'})


# decorator to check auth and give access to /protected
def check_auth(f):

    @wraps(f)
    def authentication(*args, **kws):
        # always get a None here.
        jwt_token = request.headers.get('authorization', None)
        payload = jwt.decode(jwt_token, 'secret_key', algorithms='HS512'])
        # other validation below skipped.
    return f(*args, **kws)
return authentication
...