0

从高层次来看,我正在尝试实现条带 webhook,并且我想通过将数据库中的值更新为 true 来处理成功的事件。我采用的方法是创建一个名为的异步函数handle_verification,该函数获取当前登录用户并更新 id_verified 标志。

@app.get("/user")
async def get_current_user(authorize: AuthJWT = Depends()):
    authorize.jwt_required()
    id = authorize.get_jwt_subject()
    return await User_Pydantic.from_queryset_single(UserModel.get(id=id))

@app.put('/user/verify')
async def handle_verification():
    user = await get_current_user()
    await UserModel.filter(id=user.id).update(id_verified = True)

我尝试在此处的 webhook 代码中调用此函数

@app.post('/create-verification-session')
async def create_verification_session(request: Request):
    verification_session = stripe.identity.VerificationSession.create(
        type='document',
    )
    return verification_session.client_secret

@app.post('/verification-session-webhook')
async def webhook(request: Request ):
    webhook_secret = os.getenv('STRIPE_WEBHOOK_SECRET')
    data = await request.body()
    print(data)
    signature = request.headers.get('stripe-signature')
    try:
        event = stripe.Webhook.construct_event(
            payload=data,
            sig_header=signature,
            secret=webhook_secret
        )
        event_data = event['data']['object']
    except stripe.error.SignatureVerificationError as e:
        print(str(e))
        return {'error': str(e)}
    event_type = event['type']
    
    if event_type == 'identity.verification_session.created':
        print("Started verification")

        print(event_data.url)
    if event_type == 'identity.verification_session.verified':
        print("All the verification checks passed")
        await handle_verification()
    return {'status': "success"}

我得到了错误

AttributeError: 'Depends' object has no attribute 'jwt_required

我知道这个错误是get_current_user()因为异步顺序搞砸了。我尝试放入handle_verification一个使用 asyncio.run() 的同步包装函数,但没有成功。

我尝试了各种不同的修复尝试,我认为核心问题是我仍在学习异步和 webhook 以及所有爵士乐,所以我完全被难住了。我将不胜感激对我解决此问题的方法的任何帮助,以及对可能比我现在所拥有的更容易的不同方法的任何见解。谢谢大家!

4

1 回答 1

0

我对 FastAPI 和 FastAPI JWT Auth 不太熟悉,但我会尽力提供帮助。

我查看了FastAPI JWT Auth示例,在我看来,您想asyncget_current_user()函数中删除说明符。我发现的所有示例都确保这部分代码是同步的。希望这就是确保您在对象被正确实例化.jwt_required() 之前不调用的全部内容。authorize

于 2021-12-03T17:52:23.940 回答