IES-Valle-Jerte / teleasistencia

GNU General Public License v3.0
0 stars 17 forks source link

Inicializar Django Rest Framework #3

Open jesusredondo opened 3 years ago

jesusredondo commented 3 years ago

Problema

No hay mecanismos de autentificación ni de petición de datos (no hay api rest).

Solución

Instalar Api res framework y configurarlo con Oauth para que la autentificación se haga por token.

jesusredondo commented 3 years ago

Instalación de la API REST Básica:

https://www.django-rest-framework.org/#installation

Cuestiones clave: He creado el Package "rest_django para que focalicemos el directorio relacionado con el Rest Framework:

image

PASOS

  1. Añadir el Framework en settings.py: image

  2. Añadir las urls para Django Rest Framework en urls.py base: image

  3. Definir la API

    El concepto de API se centra en tres partes:

  4. Una es las clases serializadoras, que básicamente definen cómo se van a serializar los modelos y atributos dentro de los modelos. Por defecto estamos extendiendo de ModelSerializer que representa las claves externas como ids al recurso en lugar de Urls. ¿Es esto lo que queremos? Yo creo que sí. Si queremos que sean las urls, entonces emplear HyperlinedModelSerializer. IMPORTANTE, se puede configurar la profundidad de objetos que se consulta con el parámetro depth.

Ejemplo de clase serializadora:

image

  1. El concepto de vistas. Expresan qué elementos se van a representar en la Api Rest. Se definen a partir de ViewSets que nos permiten definir qué modelo se va a exponer y qué actuaciones podemos realizar sobre los mismos. En principio ModelViewSet permite hacer las operaciones básicas de CRUD con HTTP que nos interesan. También nos permite definir los privilegios necesarios para realizar las acciones pertinentes mediante las permission_classes:

Clase ViewSet siguiendo con el ejemplo anterior: image

  1. Registrar las rutas que vamos a emplear en la url del framework (que ahora mismo es 'api-rest'. las estamos registrando en el propio fichero general urls.py antes de los urlpatterns. Asociamos el nombre de los recursos a la vista.

Siguiendo con el ejemplo:

image

MODELOS PASADOS A LA API REST:

Tipo_Recurso_Comunitario Recurso_Comunitario

jesusredondo commented 3 years ago

Autentificación

Se realiza mediante el siguiente package: django-rest-framework-social-oauth2. OJO: Quizás deberíamos migrar a este fork que sí que tiene mantenimiento: drf-social-oauth2.

Pasos

  1. Seguir la documentación del readme para modificar el settings.py.

  2. Crear un nueva OAuth2 API en la consola de desarrollador de Google (TODO: Cambiar a una cuenta corporativa, no usar la mía).

  3. Configurar una nueva aplicación en el apartado de administración, con los siguientes campos (todo extraído de la documentación del package mencionado anteriormente): image

  4. Se ha configurado una interfaz super básica para poder hacer login desde un OAuth2 de Google en la página principal de teleasistencia: image image image

  5. Cuando se hace login con OAuth2: image

Ya se está devolviendo el token. Es la parte larga que está después de access_token.

  1. Para probar que funciona, se ha protegido un recurso con acceso de superusurio en la api rest. en este caso han sido los "Tipo_Recursos Comunitarios": image

  2. Podemos comprobar desde Postman (o el navegador) cómo ya no son accesibles con un mero "Get": image

Para que funcione, tenemos que enviar la petición con la cabecera "Authorization" con el Bearer token para google-oauth2:

image

jesusredondo commented 2 years ago

Actualizado sobre el post anterior.

A partir de Noviembre 2021 ya no se utiliza Oauth2 de Google para autenticarse.

Se está empleando la librería: djangorestframework-simplejwt).

Para la configuración se emplea la documentación oficial.

La autentificación es simple y se ha quedado registrado el proceso en Postman pero es necesario revisar si funciona con privilegios de usuarios de Django.