3

Flask-RESTful サービスをセットアップしており、ユーザー認証が機能しています。私が使用している方法は次のとおりです。

def generate_auth_token(username, expiration=600):
    gen_serial = Serializer(secret_key, expires_in=expiration)
    return gen_serial.dumps({'username': username})

次のようにトークンをユーザーに渡します。

class token(Resource):
    decorators = [auth.login_required]
    def post(self):
        username = g.user
        return_token = generate_auth_token(username)
        return {'token':return_token.decode()}, 200

そして、トークンはそのまま検証されるため、サーバー側に保存する必要はありません。

def verify_auth_token(auth_token):
    serial = Serializer(secret_key)
    try:
        data = serial.loads(auth_token)
    except SignatureExpired:
        return None 
    except BadSignature:
        return None 
    serial_user = data['username']
    return serial_user

これはうまくいくようですが、サーバー側にトークンを保存せずに有効期限が切れる前にユーザーをログアウトする方法がわかりません。ユーザーがログアウトすることを選択したときにガベージトークンを返すことを考えましたが、これはエレガントまたは安全なソリューションではないと思います。

どんなヒントも本当に役に立ちます!

4

1 に答える 1

1

ガベージ トークンではなく、単純にデータをエンコードしません。

def generate_auth_token(username=None, expiration=600):
    gen_serial = Serializer(secret_key, expires_in=expiration)
    data = {'username': username} if username is not None else {}
    return gen_serial.dumps(data)

次にinvalidate、ログインを必要とし、ユーザー名なしでトークンを返すエンドポイントを作成できます。

def invalidate(self):
    return_token = generate_auth_token()
    return {'token':return_token.decode()}, 200

その時点で、欠落している可能性のあるユーザー名フィールドを処理できます。

def verify_auth_token(auth_token):
    serial = Serializer(secret_key)
    try:
        data = serial.loads(auth_token)
    except SignatureExpired:
        return None 
    except BadSignature:
        return None 
    serial_user = data.get('username')
    return serial_user
于 2014-11-18T18:32:18.523 に答える