Wpis z mikrobloga

Cześć,

Mam pytanie odnośnie wykorzystania tokenów do autentykacji w django rest framework. Dużo już naprawdę o tym czytałem, zrozumiałem z grubsza ich koncepcje - wysyłamy załóżmy login i hasło do serwera. Ten weryfikuje, czy są poprawne, jeśli tak tworzy token, który odsyła klientowi. Następnie klient za pomocą tego tokena, umieszczając go w nagłówku zapytania do serwera może dostać dane, które są wyświetlane załóżmy tylko użytkownikom, którzy mają w nagłówku token. Pytanie moje jest następujące - zrobiłem sobie prostą apkę w drf, scustomizowałem model User dodając parę pól. Korzystając z wbudowanych bibliotek drf mogę stworzyć usera, zalogować się również, otrzymując w odpowiedzi token. I teraz kwestia jak to wygląda w produkcji? Bo oczywiscie, kiedy na sztywno wbije do postmana w nagłówek token, to mam dostęp do widoków, które wymagają autentykacji, jednakże, wchodząc przez przeglądarkę na te widoki, nawet po uwczesnym zalogowaniu, widoki wymagające autentykacji nie wyświetlają się, co jest zrozumiałe, bo wymagają tokena w nagłówku, którego przez przeglądarkę im wysłać nie mogę. Jak zatem sprawić, aby po zalogowaniu każde zapytanie usera szło z tokenem w nagłówku?

#django #python
  • 17
@xmaniox: nie wiem jak Ty wyświetlasz te strony, jeśli ładujesz statyczny content, to użyj sesji a nie tokenów. Tokeny są dobre w przypadku aplikacji spa napisanej np w angularze lub react. Wtedy po zalogowaniu trzymasz ten token w jakimś storze i wysyłasz w nagłówku przy każdym żądaniu. Jeśli przy logowaniu usera dodasz opcję "zapamiętaj mnie" to możesz trzymać ten token w local store. To tak po krótce.
@passage: jakiego tutoriala bym nie dotknął na temat autentykacji w drf to w 99%, nawet dla najprostszego backendu stosują tokeny. Co więcej, w dokumentacji drf w dziale authenitcation (https://www.django-rest-framework.org/api-guide/authentication/#tokenauthentication) jest napisane, aby:

You'll also need to create tokens for your users.

from rest_framework.authtoken.models import Token

token = Token.objects.create(user=...)
print(token.key)

no i okej, tworzymy ten token, przypisujemy go do usera, ale nie rozumiem jak potem ten token wykorzystać przy zwykłych zapytaniach
@xmaniox: Po co używasz DRF? Chcesz podpiąć do tego front SPA i komunikować się tylko Ajaksem? Wtedy droga wolna - zapamiętujesz ten token i ze SPA (Angular, React, Vue, a nawet samo jQuery, jeśli chcesz) wysyłasz token w nagłówku każdego zapytania.

Jeśli pracujesz nad "standardową" aplikacją bez wyłącznej komunikacji po REST, to wtedy cookie i zwykły SessnioAuthentication.
@maciejg: Oczywiście, z rozpędu napisałem - chodziło o "uprzednim" :)
Jeśli chodzi o to dlaczego DRF - po prostu chciałem się go pouczyć, a jako aplikacje wybrałem sobie jakiś prosty sklep internetowy. Co lepiej wykorzystać w takim razie do sklepu? Zwyczajnie django?
@xmaniox: możesz zrobić monolita i django+django templates
albo możesz zrobić to tak, jak się robi normalnie, czyli
restowe api w django+django rest freamwork
i do tego oddzielnie frontend w react/vue

ja polecam vue od siebie do prostych rzeczy

monolity to raczej obiekt przeszłości

fajnym stackiem, dość popularnym, albo może zyskującym na popularności, jest
django+drf+jwt token
@xmaniox jeśli chcesz używać drf i uczysz się tylko backendu, to póki co odpuść sobie jakikolwiek front - tym zajmują się frontendowcy. Do testowania api używam Postmana i nie potrzebuję frontu, aby wiedzieć że tokeny działają.
Poza tym, endpointy backendu powstają w pierwszej kolejności - umiejętność samodzielnego testowania api ci się przyda.
@11001100110O11: @Overthinker: O właśnie chodzi mi o to, że jakoś moim zdaniem łatwiej mi zrozumieć, że backend wystawia po prostu API, z którego korzysta front. Nie miałem nawet w planach zabierać się za front, po prostu nie byłem przekonany w jaki sposób działają tokeny. Teraz rozumiem, że po wystawieniu przez backend tokenu, który jest generowany na podstawie poprawnego loginu i hasła fornt odczytuje, a następnie może zostać zautentykowany na podstawie