如何在FastAPI Swagger UI中通过Authorize按钮传递Bearer令牌授权?
解决Swagger UI适配手机号+OTP授权的问题
你的核心问题是:FastAPI默认的OAuth2PasswordBearer对应OAuth2密码流,Swagger UI会默认显示用户名/密码输入,但你的认证流程是手机号+OTP,想要在Swagger里完成授权并访问/show_results,可以用以下两种方案:
方案1:手动输入Bearer令牌(快速临时解决)
Swagger UI的Authorize按钮支持直接手动填入已获取的Bearer令牌,不需要走默认的密码流:
- 先调用
/send_otp获取OTP,再调用/token接口传入手机号和OTP,拿到返回的access_token。 - 点击Swagger UI右上角的Authorize按钮,在弹出的窗口中:
- 找到Bearer Authentication区域(滚动到窗口下方即可看到)
- 在
Value输入框中填入:Bearer <你的access_token>(注意Bearer后面加空格) - 点击Authorize完成授权,之后调用
/show_results时会自动携带令牌。
方案2:自定义OAuth2表单,让Swagger适配手机号+OTP流程(更规范)
通过自定义请求表单类,让Swagger UI显示手机号和OTP的输入字段,直接在Authorize按钮中完成认证流程:
步骤1:自定义OAuth2请求表单
替换默认的用户名密码表单,改成手机号+OTP结构:
from fastapi import Form class OAuth2PhoneOTPForm: def __init__( self, phone_number: str = Form(...), otp: str = Form(...), ): self.phone_number = phone_number self.otp = otp
步骤2:修改/token接口的参数
用自定义的表单类替换原来的普通参数:
@app.post("/token") def generate_token(form_data: OAuth2PhoneOTPForm = Depends()): # 用form_data.phone_number和form_data.otp执行验证逻辑 ... return {"access_token": encoded_jwt, "token_type": "bearer"}
步骤3:优化OAuth2Scheme配置(可选)
如果需要让Swagger更明确显示认证字段,可以调整Scheme的配置:
from fastapi.security import OAuth2Scheme from fastapi.openapi.models import OAuthFlows as OAuthFlowsModel from fastapi.openapi.models import OAuthFlowPassword oauth2_scheme = OAuth2Scheme( flows=OAuthFlowsModel( password=OAuthFlowPassword( tokenUrl="/token", username_field="phone_number", password_field="otp" ) ), tokenUrl="/token" )
修改后,点击Swagger的Authorize按钮时,会显示phone_number和otp的输入框,输入对应值后即可自动获取并应用令牌,之后调用/show_results会自动携带认证信息。
验证效果
不管用哪种方案,授权成功后,调用/show_results时,Swagger会自动在请求头中添加Authorization: Bearer <token>,和Postman的测试效果完全一致。
内容的提问来源于stack exchange,提问作者Python coder
相关产品推荐
相关产品推荐

