FastApi не может записать файл cookie в ответ, в докере на vps, как это исправить?

#python #docker #fastapi

Вопрос:

Не могу войти в систему, я запускаю локально в своем контейнере docker, я могу войти в систему на своей машине, и в docker нет ошибок, но на моем удаленном сервере я не могу войти, it doesn't write cookie in reponse , have no error , просто не пишите ответ. Он просто перенаправляет меня на мою страницу,которую я установил, и после этого я получил ошибку, потому что у меня нет ключа авторизации в файле cookie внутри файла cookie.

Видео

Мой метод подписи

 @auth_router.post('/signin')
async def sign_in(response: Response, username: str = Form(...), password: str = Form(...), recaptchav3: str = Form(...)) -> dict:

    is_human = await verify_recaptcha(recaptchav3)
    if is_human['success']:
        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)

        response.set_cookie(key="Authorization", value=user_token, httponly=True, secure=True, expires=(8*60*60))
        response.headers["Authorization"] = user_token

        user.jwt_token = user_token
        await user.save()

        return {
            'access_token': user_token,
            'token_type': 'bearer'
        }
    else:
        raise HTTPException(
            status_code=status.HTTP_400_BAD_REQUEST,
            detail='Invalid captcha',
        )
 

Как я отправляю свою форму js

 const request = (method, url, data = null, redirectPage) => {
    return new Promise((resolve, reject) => {
        let xhr = new XMLHttpRequest()
        xhr.open(method, url, true)
        // xhr.setRequestHeader('Content-Type', 'multipart/form-data')
        xhr.onerror = function (event) {
            alert(event)
            console.log(event);
        };
        xhr.onload = () => {
        if (xhr.status === 200) {
            return window.location.href = redirectPage;
            return resolve(JSON.parse(xhr.responseText || '{}'))
            } else {
                alert(`Request failed with status ${xhr.status}`)
                reject(new Error(`Request failed with status ${xhr.status}`))
                
                return window.location.reload();
            }
        } 

        if (data) {
            if (typeof data === 'string' || data instanceof String || typeof data.constructor == Object){
                xhr.send(JSON.stringify(data))
            } else {
                xhr.send(data)
            }
        } else {
            xhr.send()
        }


    })
}




signInForm = getElementById('signinform');
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);
            signInData.append('recaptchav3', recaptchaV3);

            isLogened = request('POST', '/signin', signInData, 'dashboard');

            
        } else{
            alert('Перезагрузите страницу');
        }

    }

})
 

Комментарии:

1. Вероятно, я могу вручную настроить этот файл cookie в ответ перед, но стил не может понять, почему он не пишет для меня.

Ответ №1:

Я не могу понять, почему, используя встроенный метод в fastapi, он не пишет на удаленном сервере, он работал на локальном, но я решил проблему, написав. токен через js.

 function setCookie(cname, cvalue, exdays) {
  var d = new Date();
  d.setTime(d.getTime()   (exdays * 24 * 60 * 60 * 1000));
  var expires = "expires=" d.toUTCString();
  document.cookie = cname   "="   cvalue   ";"   expires   ";path=/";
}

function getCookie(cname) {
  var name = cname   "=";
  var ca = document.cookie.split(';');
  for(var i = 0; i < ca.length; i  ) {
    var c = ca[i];
    while (c.charAt(0) == ' ') {
      c = c.substring(1);
    }
    if (c.indexOf(name) == 0) {
      return c.substring(name.length, c.length);
    }
  }
  return "";
}

function checkCookie(cookieValue) {
  var user = getCookie("Authorization");
  if (user == "") {
    if (cookieValue != "" amp;amp; cookieValue != null) {
      setCookie("Authorization", cookieValue, 365);
    }
  }
}

signInForm = getElementById('signinform');
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);
            signInData.append('recaptchav3', recaptchaV3);

            isLogened = request('POST', '/signin', signInData);//, 'dashboard');

            isLogened.then(result => {
                checkCookie(result.access_token);
                return window.location.href = 'dashboard';
            }, result => {
                log('Cant get response')
            });

            
        } else{
            alert('Перезагрузите страницу');
        }

    }

})