0

私はコーディングが初めてです。Flaskを使用してログイン機能を設定しましたflask-JWT。これまでのところ、("/login" で) ログインでき、トークンは を使用して生成されjwtます。

ただし、ラッパー (@token_required) を使用して保護されている他のルートもあります。ユーザーがログインすると、トークンが他の保護されたページに渡され、アクセスできるようにしたいと思います。

これらは私のコードです:

ページを保護するラッパー

def token_required(f):                      #wrapper for token auth
    @wraps(f)
    def decorated(*args, **kwargs):
        token = request.args.get('token')

        if 'x-access-token' in request.headers:
            token = request.headers['x-access-token']

        if not token:
            return jsonify({'message': 'Token is missing!'}), 401
        
        try:
            data = jwt.decode(token, app.config['SECRET_KEY'], algorithms=["HS256"])
            current_u = User.query.filter_by(username=data['user']).first()    
            #identify user, otherwise, return error

        except:
            return jsonify({'message': 'Token is invalid!'}), 401
        
        return f(current_u, *args, **kwargs)   #previously return f(*args, **kwargs)

    return decorated

ログインルート

@app.route('/login', methods=['GET', 'POST'])        #login route
def login():
    auth = request.authorization

    if not auth or not auth.username or not auth.password:
        return make_response('Could not verify', 401, {'WWW-Authenticate': 'Basic realm = "Login Required!"'})

    user = User.query.filter_by(username=auth.username).first()

    if not user:
            return make_response('Could not verify', 401, {'WWW-Authenticate': 'Basic realm = "Login Required!"'})

    if user.check_password(auth.password): 
        token = jwt.encode({'user': auth.username, 'exp': datetime.datetime.utcnow() + datetime.timedelta(minutes=2)}, app.config['SECRET_KEY'])
        
        return jsonify({'message': 'hello ' + user.username}, {'token': token})

    return make_response('Could not verify', 401, {'WWW-Authenticate': 'Basic realm = "Login Required!"'})

ラッパーを使用した保護されたルート

@app.route('/protected')           #protected routes
@token_required
def protected(current_u):
    return jsonify({'message' : 'This is only for people with valid tokens'})

これに特化したチュートリアルを見つけることができないため、この時点で立ち往生しています/おそらく、何を検索すればよいかわからないという問題もあります。誰か助けてくれませんか?

4

1 に答える 1

0

さらに、認証はjwtトークンでエンコードされているため、セッションを使用する必要はないと思います。あなたのバグはデコレータにあると思います

try:
        data = jwt.decode(token, app.config['SECRET_KEY'], algorithms=["HS256"])
    except:
        return jsonify({'message': 'Token is invalid!'}), 401

これは例外節ですが、ここではどの例外を処理する必要がありますか?

于 2021-06-02T11:00:54.040 に答える