Edit: Podobne pytanie chyba padło już tutaj #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.
Edit: Podobne pytanie chyba padło już tutaj #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:
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:
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 :
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.