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:58] 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** : amb usuari i contrasenya. Convé no fer-la servir sovint ja que la contrasenya és una dada sensible. La clàssica crida a un endpoint amb aquest mecanisme seria:< | + | * **Basic Authentication** : amb usuari i contrasenya. Convé no fer-la servir sovint ja que la contrasenya és una dada sensible. La clàssica crida a un endpoint amb aquest mecanisme seria:< |
| * **Token Authentication** : millora la seguretat en les crides a l'API, enviant un //token// enlloc de la contrasenya. El //token// es pot obtenir, per exemple, per Basic Authentication. Les crides a l'API s'han d' | * **Token Authentication** : millora la seguretat en les crides a l'API, enviant un //token// enlloc de la contrasenya. El //token// es pot obtenir, per exemple, per Basic Authentication. Les crides a l'API s'han d' | ||
| Línia 30: | Línia 30: | ||
| <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 61: | Línia 61: | ||
| # Endpoint per obtenir un token, accés amb BasicAuth | # 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 {" | ||
| Línia 69: | Línia 71: | ||
| 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() | ||
| Línia 90: | Línia 92: | ||
| <code python settings.py> | <code python settings.py> | ||
| - | AUTH_USER_MODEL = 'biblio.Usuari' | + | AUTH_USER_MODEL = 'myapp.Usuari' |
| </ | </ | ||
| + | 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 | ||