Autenticando nuestro endpoint en la API de Magento2

Definición API

Luego de un primer acercamiento a la creación de endpoints en la API de Magento2, toca cambiar la definición y convertir ese endpoint de público a privado (y accesible mediante autenticación).

Retomemos entonces el módulo Barbanet_SampleModule.

En el archivo webapi.xml cambiamos la definición del nodo <resource /> y la cambiamos de «anonymous» a «Magento_Backend::admin».

<?xml version="1.0"?>
<routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Webapi:etc/webapi.xsd">
    <route url="/V1/samplemodule/ping/" method="GET">
        <service class="Barbanet\SampleModule\Api\PingInterface" method="pong" />
        <resources>
            <resource ref="Magento_Backend::admin" />
        </resources>
    </route>
</routes>

La API de Magento2 funciona tanto bajo SOAP como bajo REST, y, con respecto a la autenticación, tenemos 3 formas diferentes. En este ejemplo yo usaré autenticación por token, pero hay otros más. Como tarea para el hogar, leer la documentación oficial sobre autenticación.

Hasta aquí ya tengo definido mi endpoint y he indicado que necesito autenticarme. Si, como antes, intento acceder a la URL, veré:

Acceso restringido a la API

La autenticación por token demandará que primero nos autentiquemos con nuestro usuario y contraseña (del usuario de backend) y luego, con el token devuelto, haremos un request al endpoint en cuestión.

Si uso CURL en la consola, el ejemplo sería:

curl -X POST "http://www.dominio.com.ar/rest/V1/integration/admin/token' -H "Content-Type:application/json" -d '{"username":"USUARIO", "password":"CONTRASEÑA"}'

Al ejecutarlo nos deveolverá el token. Algo como:

"3p2de60delvtubqapqxsf4s73812psm8"

Ahora, tomamos ese valor y construimos la siguiente llamada:

curl -X GET -H 'Authorization: Bearer 3p2de60delvtubqapqxsf4s73812psm8' 'http://www.dominio.com.ar/rest/V1/samplemodule/ping'

La respuesta será:

"Pong!"

Los cambios al módulo Barbanet_SampleModule están disponibles en GitHub bajo el tag 2.23.0.