Django Allauth headless Unauthorized 401 (Initial)
Я получаю 401 при попытке достичь конечной точки "/_allauth/browser/v1/auth/password/reset", хотя отправляю cookie, crsf и ключ для сброса электронной почты.
Я следую потоку сброса пароля пользователя из vuejs Frontend следующим образом:
async function sendEmailReset() {
spin.value = true;
try {
const resp = await api.get("/api/email-reset/" + email.value);
if (resp.data.status == "none") {
error_message.value =
"Este e-mail não existe no sistema. Faça o processo de registro novamente.";
wrongCredentials.value = true;
return;
} else if (resp.data.status == "social") {
error_message.value =
"Este email foi cadastrado com uma conta social. Faça login com o Google.";
wrongCredentials.value = true;
return;
} else {
const response = await api.post(
"/\_allauth/" + authClient + "/v1/auth/password/request",
{ email: email.value },
{
headers: { "Content-Type": "application/json" },
}
);
console.log(response);
if (response.data.status == 200) {
sentEmail.value = true;
} else {
error_message.value =
"Ocorreu um erro ao enviar o e-mail. Verifique se o e-mail está correto.";
wrongCredentials.value = true;
}
}
} catch (error) {
console.error(error);
error_message.value =
error.response?.data.detail ||
"Ocorreu um erro na conexão com o servidor. Se persistir, tente novamente mais tarde.";
wrongCredentials.value = true;
} finally {
spin.value = false;
email.value = "";
}
}
он работает нормально и отправляет письмо с ключом на нужный адрес, с примочкой к моему фронтенду для обработки ключа и получения нового пароля: http://127.0.0.1:9000/reset/78f13dbf84b0458cb512b40e8362277e-c79vad-8024b22600b3c581b757f9e627f63847, оттуда я снова вызываю api:
const reset = async () => {
if (password.value !== password2.value) {
error_message.value = "As senhas não coincidem.";
wrongCredentials.value = true;
return;
}
if (password.value.length < 8) {
error_message.value = "A senha deve ter pelo menos 8 caracteres.";
wrongCredentials.value = true;
return;`your text`
}
spin.value = true;
try {
console.log(p1.value);
console.log(password.value);
const response = await api.post(
"/\_allauth/" + authClient + "/v1/auth/password/reset",
{
key: p1.value,
password: password.value,
},
{
headers: {
"Content-Type": "application/json",
},
}
);
..... } but I get this {
"status": 401,
"data": {
"flows": [
{
"id": "login"
},
{
"id": "signup"
},
{
"id": "provider_redirect",
"providers": [
"google"
]
},
{
"id": "provider_token",
"providers": [
"google"
]
}
]
},
"meta": {
"is_authenticated": false
}
},
В документации это называется "401 - Unauthorized - Initial". Если я вызываю метод get на той же конечной точке, он работает нормально. Я вызываю метод из браузера-клиента и передаю в заголовках куки и токен csrf. Какую авторизацию я должен отправить, кроме csrf и значения ключа (поскольку пользователь сбрасывает забытый пароль)? Что я упускаю? Может ли кто-нибудь помочь? Я собираюсь использовать обычный django-auth только для работы с этим случаем сброса, но я хотел бы сконцентрировать весь процесс с Django-Allauth, если это возможно.
Заранее спасибо.
Хотя понятно, что вы ожидаете получить здесь 200, на самом деле это предполагаемое поведение. https://docs.allauth.org/en/latest/headless/openapi-specification/#section/Authentication-Flows. 401 сообщает вам о следующих доступных вариантах аутентификации пользователя после сброса пароля. Он облегчает вам жизнь, поскольку, имея пароль и пользователя, вы можете решить, войти ли в систему программно или всегда перенаправлять пользователя на страницу входа в систему при каждом получении 401.