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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions