首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用FastAPI通过Swagger发送授权头?

如何使用FastAPI通过Swagger发送授权头?
EN

Stack Overflow用户
提问于 2022-10-16 09:33:24
回答 1查看 448关注 0票数 1

在前面,我有这样的功能:

代码语言:javascript
运行
复制
export const uploadFormData = async (
    token: string,
    email: string,
    formInfo: Array<Object>,
): Promise<any> => {
    const formData = new FormData();
    formData.append('email', email);
    formData.append('form_info', JSON.stringify({ formInfo }));
    return fetch(
        `${process.env.ENDPOINT}/upload_form_data/`,
        {
            method: 'POST',
            headers: {
                Authorization: `Token ${token}`,
            },
            body: formData,
        },
    ).then((response) => {
        console.log(response.body?.getReader());
        if (response.status === 404) {
            throw Error('Url not found');
        }
        if (response.status === 422) {
            throw Error('Wrong request format');
        }
        if (response.status !== 200) {
            throw Error('Something went wrong with uploading the form data.');
        }
        const data = response.json();
        return {
            succes: true,
            data,
        };
    }).catch((error) => Promise.reject(error));
};

它将POST请求发送到FastAPI后端中的此端点:

代码语言:javascript
运行
复制
@app.post("/api/queue/upload_form_data/")
async def upload_form_data(
    email: str = Body(...),  
    form_info: str = Body(...), 
    authorization: str = Header(...),
    
):
    return 'form data processing'

但是一直抛出以下错误:

  1. 在前面: 发布数据/ 422 (不可处理实体)错误:错误的请求格式
  2. 在后端: POST /api/queue/upload_form_data/ HTTP/1.1“400坏请求
  3. 在Swagger UI中(响应体): {“详细信息”:[{ "loc":“头”、“授权”、"msg":“字段必需”、“类型”:"value_error.missing“}]}

导致这些错误的请求有什么问题?

EN

回答 1

Stack Overflow用户

发布于 2022-10-16 15:50:29

在Swagger/OpenAPI规范中,Authorization是一个保留的头部,以及AcceptContent-Type头部--参见自吹自擂文件-for Swagger的内置认证/授权功能;因此,不允许定义它们。如果您正在使用Swagger,则不能在端点的参数中定义它,因为在通过Swagger提交请求时,它将被忽略,并且您将得到一个422 Unprocessable Entity错误,其中有一条正文消息,其中说authorization标头正在陷入困境(就像在您的问题中发布的错误一样)。

解决方案

如果您不需要Swagger来测试您的应用程序,您可以保持原样,继续使用JavaScript 取API,在标头中传递Authorization。另外,请注意,您实际上不必在端点中定义任何Header参数,因为您总是可以通过Request对象访问它们,例如:

代码语言:javascript
运行
复制
from fastapi import Request

@app.post('/')
def main(request: Request):
    token = request.headers.get('authorization')
    return token

如果您也需要使用Swagger,一种解决方案是将authorization Header参数重命名为其他东西,例如token: str = Header(...)。然后,在端点内部检查API键是否在tokenrequest.headers.get('authorization')-if中,这都是None的结果,这意味着没有提供Authorization头。否则,使用FastAPI的HTTPBearer,它将允许您在/docs的Swagger自动文档中单击屏幕右上角的Authorize按钮,您可以在Value字段中键入Value键。这将在请求头中设置Authorization标头。示例:

代码语言:javascript
运行
复制
from fastapi.security import HTTPBearer

security = HTTPBearer()

@app.get('/')
def main(authorization = Depends(security)):
    return authorization.credentials

或者,您可以使用APIKeyHeader

代码语言:javascript
运行
复制
from fastapi.security.api_key import APIKeyHeader
from fastapi import Security

api_key = APIKeyHeader(name='Authorization')

@app.get('/')
def main(token = Security(api_key)):
    return token
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74085996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档