Skip to content

Problem z wczytaniem cookies przy dekoratorze #31

@PaulinaPacyna

Description

@PaulinaPacyna

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions