0

私は今日あなたに迷惑と思われる問題で来て、1週間(おそらくそれ以上)私を悩ませます.

Flask と Flask-JWT を実装してトークンを作成し、それを Web アプリのさまざまな部分で使用しました。プロセスは次のとおりです。ユーザーはフォームに資格情報を入力し、ログに記録すると、Flask-JWT /auth エンドポイントに POST 要求を行うことでトークンが作成されます。

問題は :

  • ユーザーがログインすると、コードのトークン作成部分 (/auth エンドポイントへの POST 要求) が無限ループになっているようです。

コードは「r = requests.post(url, headers=headers, data=payload)」で停止します。

面白いのは、ユーザーがログインて /auth エンドポイントに移動すると、トークンが作成されることです。

誰かがすでにこの問題を抱えていましたか?

ありがとうございました

プロジェクト/config.py

JWT_EXPIRATION_DELTA = timedelta(seconds=900)
JWT_AUTH_URL_RULE = "/api/v1/auth"

SECURITY_PASSWORD_HASH = 'pbkdf2_sha512'
SECURITY_TRACKABLE = True
SECURITY_PASSWORD_SALT = "xxxx"

WTF_CSRF_ENABLED = True
WTF_CSRF_SECRET_KEY = "xxxx"

プロジェクト/アプリ/init.py

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager, login_required
from flask_bcrypt import Bcrypt
from flask_security import Security, SQLAlchemyUserDatastore, \
    UserMixin, RoleMixin, login_required
from flask_jwt import JWT, jwt_required
import os

app = Flask(__name__)
app.config.from_object('config')
bcrypt = Bcrypt(app)
db = SQLAlchemy(app)

# To have random secret key
secret_key = os.urandom(24)
app.secret_key = secret_key

from textr import views, models
from search_number import views
from buy_number import views
from users import views, models
from sms_receiver import views, models
from sms_sender import views, models
from phone_number import models, views

from users.models import User, Role

# Setup Flask-Security
user_datastore = SQLAlchemyUserDatastore(db, User, Role)
security = Security(app, user_datastore)

login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = "login"

@login_manager.user_loader
def load_user(user_id):
    return User.query.filter(User.id == int(user_id)).first()

from textr.tools import retreive_user, verify_password

def authenticate(username, password):
    user = retreive_user(username)
    if verify_password(username, password):
        return user

def identity(payload):
    return User.query.filter(User.id == payload['identity']).scalar()

jwt = JWT(app, authenticate, identity)

プロジェクト/アプリ/ユーザー/views.py

from flask_jwt import jwt_required, JWT
from models import User
from error_handling import error_400
from flask import Flask, request, render_template, jsonify, session, redirect, url_for, flash
import json
import requests

@app.route("/api/v1/login", methods=["GET", "POST"])
def login():
    error = None

    if request.method == 'POST':
        json_data = request.json
        if not json_data:
            username = request.form['username']
            password = request.form['password']
        else:
            username = json_data['username']
            password = json_data['password']

        if not check_user_present(username):
            return error_400('Error', 'User not found', 404)

        if verify_password(username, password):
            flash('Logged in successfully.')
            user = retreive_user(username)
            login_user(user)

            # Infos to create POST request for Token
            payload = ({'username':username, 'password':password})
            url = "http://127.0.0.1:8080/api/v1/auth"
            headers = {'Content-Type': 'application/json', 'charset': 'utf-8'}

            # Token creation
            r = requests.post(url, headers=headers, data=payload)
            response = r.json()

            if (r.status_code is 200):
                token = response['user']['authentication_token']
                session['api_session_token'] = token)
        else:
            flash('Wrong credentials!')
            return error_400('Error', 'Wrong credentials', 401)

    return render_template('users/login.html')
4

0 に答える 0