gpt4 book ai didi

javascript - FastApi 422 无法处理实体,关于身份验证,如何修复?

转载 作者:行者123 更新时间:2023-12-03 08:22:30 29 4
gpt4 key购买 nike

无法理解,即使我删除所有内部函数并只打印一些内容仍然会出现此错误,但是当我使用 fastapi 文档并尝试使用它进行签名时,它会起作用。

@auth_router.post('/signin')
async def sign_in(username: str = Form(...), password: str = Form(...)) -> dict:
user = await authenticate_user(username, password)

if not user:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail='Invalid username or password',
)

user_obj = await User_Pydantic.from_tortoise_orm(user)
user_token = await generate_token(user_obj)

return {
'access_token': user_token,
'token_type': 'bearer',
}

在我使用OAuth2PasswordRequestForm之前,当遇到422错误时,请尝试其他方法。

我的模型是tortoise orm,当需要时我将其转换为pydantic模型,在文档中一切都是工作。

JS

handleEvent(signinform, 'submit', e => {
e.preventDefault();
if(!isEmpty(signinform)){

signInUsername = getElement('input[name="username"]', signinform).value;
signInPassword = getElement('input[name="password"]', signinform).value;
recaptchaV3 = getElement('[name="g-recaptcha-response"]').value;

if(recaptchaV3){
signInData = new FormData();
signInData.append('username', signInUsername);
signInData.append('password', signInPassword);

isLogened = request('POST', '/signin', signInData);
if(isLogened){
log(isLogened);
}

} else{
alert('Reload Page');
}

}

})

authenticate_user 函数

async def authenticate_user(username: str, password: str):
user = await User.get(username=username)

if not user or not user.verify_password(password):
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail='Invalid username or password',
)
return user

我的请求功能

const request = (method, url, data = null) => {
return new Promise((resolve, reject) => {
let xhr = new XMLHttpRequest()
xhr.open(method, url, true)
xhr.setRequestHeader('Content-Type', 'application/json')
xhr.onerror = function () {
console.log(xhr.response);
};
xhr.onload = () => {
if (xhr.status === 200) {
return resolve(JSON.parse(xhr.responseText || '{}'))
} else {
return reject(new Error(`Request failed with status ${xhr.status}`))
}
}
if (data) {
xhr.send(JSON.stringify(data))
} else {
xhr.send()
}


})
}

最佳答案

虽然你没有发布错误,但谁的目的是告诉你问题所在,我相当确定问题出在你执行请求的方式上。

线路

xhr.setRequestHeader('Content-Type', 'application/json')

表示您发送的是json数据,openapi的认证形式不接受该数据。另外,您将数据字符串化为 json,这又不是可接受的格式。

因此,将内容类型更改为 www-form-urlencoded 并向请求正文添加 FormData 对象即可使其正常工作。

您可以在下面的 github 讨论中看到它

https://github.com/tiangolo/fastapi/issues/2740 https://github.com/tiangolo/fastapi/issues/1431

关于javascript - FastApi 422 无法处理实体,关于身份验证,如何修复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67469367/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com