Autenticación JWT
El módulo de Autenticación de API de Drupal funciona enviando un token JWT junto con tus solicitudes API para autenticación. Este módulo utiliza JSON Web Token (JWT), un estándar abierto para representar de forma segura la identidad del usuario durante interacciones entre dos partes.
En este paso, básicamente se utiliza un nombre de usuario y contraseña de tu sitio Drupal para obtener primero un token JWT. Una vez verificados el nombre de usuario y la contraseña, el módulo Drupal REST API Authentication creará un JSON Web Token firmado. Después, la API devolverá ese token a la aplicación cliente.
Una vez recibido el token JWT, puedes usarlo para realizar operaciones en Drupal hasta que el token expire. El módulo Drupal REST API Authentication solo concederá acceso cuando reciba un JWT válido desde la aplicación.
El JWT puede ser firmado y validado usando dos algoritmos: HSA y RSA.
Veamos cómo podemos usar un token JWT para la autenticación de API en Drupal.
Video de configuración:
Requisitos previos: Descarga e instalación:
- Descarga e instala el módulo Drupal REST & JSON API Authentication.
- REST UI: Este módulo te proporciona una interfaz de usuario para configurar el módulo REST.
- Habilita los siguientes módulos de Servicios Web desde la sección Extender (/admin/modules) de tu sitio Drupal:
- REST UI
- RESTful Web Services
- Serialization
Pasos para configurar la autenticación de API basada en JWT:
- Para una mejor comprensión, tomaremos como ejemplo agregar autenticación basada en JWT para crear una página básica en Drupal usando la API /node.
Habilita la API y asigna métodos y operaciones de la siguiente manera:
- El primer paso es habilitar la API y también asignar los métodos y operaciones permitidos en esa API en particular. Esto se puede hacer utilizando el módulo REST UI o modificando la configuración directamente.
- Para habilitar la API usando el módulo REST UI, haz clic en el botón Configurar del módulo REST UI (como se muestra abajo)
- En nuestro ejemplo, queremos habilitar la API /node que se encuentra en la sección de contenido. Habilita esta API usando la opción Habilitar frente a ella.
- Ahora, como nuestro objetivo es crear una página básica en Drupal, selecciona las siguientes configuraciones:
- Método: POST
- Formato: json
- Proveedor de autenticación: rest_api_authentication
- Seleccionar rest_api_authentication permitirá que el módulo miniOrange REST API Authentication autentique tu API. Haz clic en el botón Guardar configuración para continuar.
Configura la autenticación de API basada en JWT:
-
En este paso, configuraremos JWT como método de autenticación de la API. Para ello, navega a la pestaña API Authentication del módulo REST API Authentication (/admin/config/people/rest_api_authentication/auth_settings)
- Marca la casilla Habilitar autenticación y haz clic en Guardar configuración.
- Debajo del botón Guardar configuración selecciona el botón de opción JWT.
-
Si deseas utilizar un token JWT generado externamente para la autenticación, puedes hacerlo configurando las siguientes opciones:
- En el campo Username Attribute, introduce el nombre del atributo en el que se recibirá tu nombre de usuario.
- Si deseas usar un token JWT externo, también puedes proporcionar la URI JWKS para validar ese token JWT en Drupal.
Concede permisos a los roles de Drupal para crear una página:
-
Si lo necesitas, también puedes otorgar a los roles de Drupal no administradores el permiso para crear una página básica. Puedes hacerlo asignando los roles de Drupal al permiso Página básica: Crear nuevo contenido desde la sección de permisos (/admin/people/permissions) de tu sitio Drupal.
¡Eso es todo!
Ahora probemos crear una página básica a través de una llamada API usando JWT para la autenticación.
Ejemplos:
-
Primero debemos hacer una llamada API para obtener un JWT. Luego usaremos ese token para autenticar la API de Drupal y crear una página básica.
-
Podemos obtener el JWT realizando una solicitud POST que contenga el nombre de usuario y la contraseña de Drupal. Debes enviar el nombre de usuario y la contraseña en formato base64. Consulta el siguiente formato de solicitud como referencia.
Solicitud: POST <tu_drupal_base_url>/rest_api/id_token
Cabecera: Authorization: Basic base64encoded <usuario:contraseña>
Accept: application/jsonFormato de solicitud CURL-
curl --location --request POST ' <tu_drupal_base_url>/rest_api/id_token' \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--header 'Authorization: Basic base64encoded <usuario:contraseña>'
-
También puedes consultar la imagen de la solicitud Postman para obtener el JWT de Drupal.
Solicitud:
-
Una respuesta exitosa devuelve el JWT junto con la expiración del token. (consulta la imagen a continuación)
-
Si recibes algún error en la respuesta, consulta la siguiente tabla para la descripción del error y posibles soluciones.
Error | Descripción |
INVALID_CREDENTIALS |
Obtendrás este error si el nombre de usuario o la contraseña son incorrectos. Ejemplo: |
Autentica las APIs REST de Drupal usando el JWT recibido:
- Para autenticarte usando JWT, simplemente añade el JWT recibido como Bearer token en la cabecera Authorization.
Solicitud: POST <drupal_base_url>/node?_format=json
Cabecera: Authorization: Bearer received_JWT
Accept: application/json
Cuerpo:
{
"type":[
{"target_id":"page"}
],
"title":[
{"value":"Autenticación Drupal Rest API"}
],
"body":[
{"value":"Página creada usando la autenticación JWT."}
]
}Formato de solicitud CURL-
curl --location --request POST ‘<drupal_base_url>/node?_format=json’\
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer <received_JWT>’ \
--data-raw '{
"type":[
{"target_id":"page"}
],
"title":[
{"value":"Autenticación Drupal Rest API"}
],
"body":[
{"value":"Página creada usando la autenticación JWT."}
]
}'
Solicitud de ejemplo para crear una página usando autenticación JWT:
- También puedes consultar la solicitud Postman para lo mismo:
- Una respuesta exitosa se verá así:
- Puedes comprobar la página creada en la pestaña de contenido de Drupal.
-
Respuestas de error y posibles soluciones:
Error | Descripción |
MISSING_AUTHORIZATION_HEADER |
Obtendrás este error si no envías la cabecera Authorization en la solicitud API o si tu servidor la elimina por algún motivo. Ejemplo: |
INVALID_AUTHORIZATION_HEADER_TOKEN_TYPE |
Obtendrás este error si envías la cabecera Authorization pero el tipo de token no es Bearer. Ejemplo: |
TOKEN_EXPIRED |
Obtendrás este error si envías la cabecera Authorization pero el token de acceso está expirado. Ejemplo: |
USER_INFORMATION_NOT_FOUND |
Obtendrás este error al intentar recuperar la información del usuario. Ejemplo: |
INVALID_SIGNATURE |
Obtendrás este error si la firma del token no es válida. Ejemplo: |
Artículo de la Documentación de Drupal.