DaftAcademy / daftacademy-python_levelup-spring2020

20 stars 10 forks source link

Problem z wczytaniem cookies przy dekoratorze #31

Open PaulinaPacyna opened 4 years ago

PaulinaPacyna commented 4 years ago

Edit: Podobne pytanie chyba padło już tutaj https://github.com/daftcode/daftacademy-python_levelup-spring2020/issues/25

Dzień dobry, po zrobieniu zadań stwierdziłam, że przerobię swój kod. Wcześniej, funkcje które wymagały bycia zalogowanym tworzyłam w taki sposób:


@app.post('/welcome')
@app.get("/welcome")
def welcome(request: Request, session_token: str =Cookie(None)):
    if session_token in app.sesions:
        return templates.TemplateResponse("welcome.html", {"request":request, "user" : app.sesions[session_token]})
    else:
        return HTTPException(401,f"Your session(Cookie) :{session_token}, logged sessions: {app.sesions}")

I takiego ifa robiłam w każdej funkcji i działało. Dzisiaj stwierdziłam, że to bez sensu i napiszę jeden dekorator, który sprawdza czy się jest zalogowanym i udekoruję każdą funkcję. Oto ten dekorator i jak dekoruję funkcje:

def is_logged(session_token):
    def outer(func):
        @wraps(func)
        def inner(*args,**kwargs):
            if session_token in app.sesions:
                return func(*args,**kwargs)
            else :
                raise  HTTPException(401,f"Your session(Cookie) :{session_token}, logged sessions: {app.sesions}")
        return inner
    return outer

@app.post('/welcome')
@app.get("/welcome")
@is_logged(session_token=Cookie(None))
def welcome(request: Request):
    return templates.TemplateResponse("welcome.html", {"request":request, "user" : app.sesions[session_token]})

@app.get('/login') # zeby latwo w przegladarce sie zalogowac
@app.post("/login")
def login( response: Response, credentials: HTTPBasicCredentials = Depends(security)):
    try :
        if credentials.password==app.users[credentials.username]:
            s_token = sha256(bytes(f"{credentials.username}{credentials.password}{app.secret_key}", encoding='utf8')).hexdigest()
            response.set_cookie(key="session_token",value=s_token)
            response.status_code=302
            response.headers["Location"]="/welcome"
            app.sesions[s_token]=credentials.username
            return response
        else: 
            raise HTTPException(401,'Incorrect password')
    except KeyError: 
        raise HTTPException(401,"User does not exists")

No i od teraz mój program nie może odczytać session_token z Cookie. To znaczy po przejściu pod '/login' i wpisaniu poprawnych danych otrzymuje kod 401: {"detail":"Your session(Cookie) :extra={}, logged sessions: {'74c147be7400d58b0497e6da2033aebae33570099a8ad11aa50fdada717e1ce2': 'pina'}"} Jest to kawałek komunikatu z HTTPException. Wiem, że chyba nie powinno się wypisywać tokenów sesji na stronę, zrobiłam tak dla debugowania. Żeby rozpoznać jeszcze, czy problem leży w funkcji login, czy welcome zajrzałam do logów z Heroku CLI :


2020-04-26T15:21:56.195962+00:00 heroku[router]: at=info method=GET path="/login" host=daftacademy-hello-world.herokuapp.com request_id=9f67f0d5-36e8-417f-b0ea-33b8d0ce4c12 fwd="31.41.136.2" dyno=web.1 connect=1ms service=5ms status=302 bytes=229 protocol=https
2020-04-26T15:21:56.269347+00:00 heroku[router]: at=info method=GET path="/welcome" host=daftacademy-hello-world.herokuapp.com request_id=8c95daeb-78c4-4435-a5c5-2dc20039dca1 fwd="31.41.136.2" dyno=web.1 connect=1ms service=6ms status=401 bytes=274 protocol=https

No i jak widać \login działa ok, przekierowywuje do \welcome. W \welcome nie następuje odczytanie session_token z Cookie i bez tokena nie moze sprawdzić czy już była taka sesja. Mamy błąd 401 Zapewne mój błąd leży gdzieś w złym przekazywaniu argumentów do dekoratora, albo źle go napisałam. Będę bardzo wdzięczna za pomoc w odnalezieniu błędu.