Ací es mostren les diferències entre la revisió seleccionada i la versió actual de la pàgina.
Ambdós costats versió prèvia Revisió prèvia Següent revisió | Revisió prèvia | ||
django_ninja [2025/02/05 22:22] enric_mieza_sanchez [Autenticació] |
django_ninja [2025/03/21 16:18] (actual) enric_mieza_sanchez [Autenticació] |
||
---|---|---|---|
Línia 24: | Línia 24: | ||
Destaquem dos mètodes d' | Destaquem dos mètodes d' | ||
- | * Basic Authentication | + | |
- | * Token Authentication | + | |
Es poden implementar les dues amb aquest codi: | Es poden implementar les dues amb aquest codi: | ||
<code python api.py> | <code python api.py> | ||
- | from django.contrib.auth import authenticate | + | from django.contrib.auth import authenticate |
from ninja import NinjaAPI, Schema | from ninja import NinjaAPI, Schema | ||
from ninja.security import HttpBasicAuth, | from ninja.security import HttpBasicAuth, | ||
- | from typing import List | + | from typing import List, Optional |
from .models import * | from .models import * | ||
import secrets | import secrets | ||
Línia 42: | Línia 42: | ||
class BasicAuth(HttpBasicAuth): | class BasicAuth(HttpBasicAuth): | ||
def authenticate(self, | def authenticate(self, | ||
- | user = authenticate(username=username, | + | user = django_authenticate(username=username, |
if user: | if user: | ||
# Genera un token simple | # Genera un token simple | ||
Línia 60: | Línia 60: | ||
return None | return None | ||
- | # Endpoint per obtenir un token | + | # Endpoint per obtenir un token, accés amb BasicAuth |
- | @api.post("/ | + | # amb o sense " |
+ | @api.get("/ | ||
+ | @api.get("/ | ||
def obtenir_token(request): | def obtenir_token(request): | ||
return {" | return {" | ||
- | # Exemple d' | + | # Exemple d' |
class LlibreOut(Schema): | class LlibreOut(Schema): | ||
id: int | id: int | ||
titol: str | titol: str | ||
- | editorial: str | + | editorial: |
- | @api.get("/ | + | @api.get("/ |
def get_llibres(request): | def get_llibres(request): | ||
qs = Llibre.objects.all() | qs = Llibre.objects.all() | ||
return qs | return qs | ||
+ | </ | ||
+ | A part, també caldrà afegir la columna '' | ||
+ | |||
+ | <code python models.py> | ||
+ | from django.contrib.auth.models import AbstractUser | ||
+ | |||
+ | class Usuari(AbstractUser): | ||
+ | auth_token = models.CharField(max_length=32, | ||
+ | # + altres atributs que es vulguin afegir... | ||
</ | </ | ||
+ | |||
+ | I a '' | ||
+ | |||
+ | <code python settings.py> | ||
+ | AUTH_USER_MODEL = ' | ||
+ | </ | ||
+ | |||
+ | Per tal que els canvis es guardin a la base de dades caldrà crear i executar les migracions adequades: | ||
+ | |||
+ | (env) $ ./manage.py makemigrations | ||
+ | (env) $ ./manage.py migrate | ||
+ | |||
+ | <WRAP important> | ||
+ | Afegir canvis en el model d' | ||
+ | |||
+ | Si no tenim dades de producció, el més fàcil és esborrar la base de dades, esborrar tots els arxius de migració, i tornar a crear-los amb: | ||
+ | |||
+ | (env) $ ./manage.py makemigrations < | ||
+ | |||
+ | Una possible alternativa, | ||
+ | </ | ||
\\ | \\ | ||
+ | |||
+ | ===== Mes curl ===== | ||
+ | |||
+ | El típic exemple de request amb Basic Authentication seria: | ||
+ | curl -u admin: | ||
+ | |||
+ | De vegades ens pot interessar una alternativa enviant les dades codificades en base64 en els // | ||
+ | curl -H ' | ||
+ | |||
+ | Per obtenir el //hash// en base64 es pot fer: | ||
+ | echo -n " | ||
+ | |||
+ | Per aconseguir un //pretty print// del JSON es pot fer amb la [[https:// | ||
+ | curl -u admin: | ||
+ | |||
+ | Per instal·lar jq es pot fer: | ||
+ | sudo apt install jq | ||