Search code examples
pythonjsonflaskjwtaccess-token

Json jwt token problem - TypeError: Object of type 'User' is not JSON serializable


Im trying to attach a token to a logged in user:

user_info = request.get_json()
entered_username = User.query.filter_by(username = user_info['username']).first()
        if user_info['password'] == entered_username.password:                                                                  
            token = jwt.encode({'username':entered_username, 'exp':datetime.datetime.utcnow() + datetime.timedelta(minutes=30)},
                               secret_key, algorithm='HS256').decode('UTF-8')
        return jsonify(token) 

But i get: TypeError: Object of type 'User' is not JSON serializable. I've also tried to do return jsonify(token.decode('UTF-8'))

What am i missing?


Solution

  • You can't encode a User object to JSON and entered_username is a User object. If you just want the username in your token, you can do something like this:

    user_info = request.get_json()
    user_obj = User.query.filter_by(username = user_info['username']).first()
    if user_info['password'] == user_obj.password:
        claims = {
            'username': user_info['username'], # or perhaps user_obj.username
            'exp': datetime.datetime.utcnow() + datetime.timedelta(minutes=30)
        }
    
        token = jwt.encode(claims, secret_key, algorithm='HS256')
    
        # Maybe some error checking here?
    
        response = {
            'token': token.decode()
        }
    
        return jsonify(response)