Seguici su:

Magento Web API ( REST SOAP GRAPHQL )

Magento 2 Web Api

Magento Web API ( REST SOAP GRAPHQL )

Web Application Programming Interface

In Magento 2, il core delle web api è stato riscritto e queste giocano un ruolo fondamentale nello sviluppo delle moderne applicazioni. Infatti permettono l’integrazione con software di terze parti attraverso il livello HTTP. Magento 2, ora supporta le seguenti api:

  • REST (Rapresentational  State Tranfer)
  • SOAP (Simple Object Access Protocol)
  • GraphQL (Aggiunto dalla versione 2.3)

Le web API si basano sul CRUD (create, read, update, delete) e sul modello della RICERCA (search criteria). Questa funzionalità è molto importante perché ci permette di creare integrazioni con i principali software per la gestione dei clienti (CRM) o per le risorse aziendali (ERP) come pure per la gestione dei contenuti (CMS) e per la creazione di widget JavaScript per la vetrina di Magento.

Tipi di Utenti

In magento 2 web API ci sono 3 tipi di utenti che possono interagire con le API:

  • GUEST autorizzato per una richiesta anonima (anonymous)
<resources>
   <resource ref="anonymous" />
</resources>
  • CUSTOMER autorizzato per una richiesta personale (self)
<resources>
   <resource ref="self"/>
</resources>
  • INTEGRATOR autorizzato per una specifica risorsa definita nel file acl.xml
<resources>
   <resource ref="Magento_Cms::save"" />
</resources>

Per questo ultimo tipo di utente dobbiamo capire che esiste un legame tra il file acl.xml e il file webapi.xml.

Per capire meglio come si definiscono le risorse analizziamo il file del modulo vendor/magento/module-cms/etc/acl.xml Questo è il file dove si definisce l’accesso alle risorse.

<acl>
    <resources>
        <resource id="Magento_Backend::admin">
            <resource id="Magento_Backend::content">
                <resource id="Magento_Backend::content_elements">
                    <resource id="Magento_Cms::page" title="Pages" translate="title" sortOrder="10">
                        <resource id="Magento_Cms::save" title="Save Page" translate="title" sortOrder="10" />
                        <resource id="Magento_Cms::page_delete" title="Delete Page" translate="title" sortOrder="20" />
                    </resource>
                    <resource id="Magento_Cms::block" title="Blocks" translate="title" sortOrder="30" />
                    <resource id="Magento_Cms::media_gallery" title="Media Gallery" translate="title" sortOrder="70" />
                </resource>
            </resource>
            <resource id="Magento_Backend::stores">
                <resource id="Magento_Backend::stores_settings">
                    <resource id="Magento_Config::config">
                        <resource id="Magento_Cms::config_cms" title="Content Management" translate="title" />
                    </resource>
                </resource>
            </resource>
        </resource>
    </resources>
</acl>

Prendiamo come esempio la risorsa Magento_Cms::save. Magento rappresenta tutte queste risorse contenute nei file acl.xml all’interno di un albero ACL, Possiamo vedere queste in due parti nell’admin di Magento 2:

  • System->Permission->User Role->Edit->Add->New Role 
  • System->Extensions->Integrations->Edit->Add New Integration

Magento-2-User-Role-Acl

Quindi in Magento 2 è possibile settare i permessi all’accesso delle web API in queste due schermate, una per gli utenti che hanno accesso all’admin e l’altra per le applicazioni di terze parti che interagiscono con magento. L’unica differenza è nei tipi di autenticazione. Per comprendere meglio il funzionamento analizziamo la classe Magento\Cms\Controller\Adminhtml\Page\Edit che si riferisce alla stringa Magento_Cms::save del file acl.xml analizzato in precedenza. La classe Edit ha una costante ADMIN_RESOURCE = 'Magento_Cms::save' e attraversando tutta la catena di ereditarietà delle classi fino alla classe astratta AbstractAction che a sua volta contiene la definizione della seguente costante ADMIN_RESOURCE = 'Magento_Backend::admin' che a sua volta viene utilizzata dal metodi _isAllowed()

protected function _isAllowed()
{
return $this->_authorization->isAllowed(static::ADMIN_RESOURCE);
}

Nel caso analizzato (di CMS) la classe AbstractAction è la classe base del controller per qualsiasi amministratore. Questo significa che il controller è il metodo per poter usare la risorsa, mentre il file acl.xml serve per creare l’albero ACL dei permessi che possiamo gestire direttamente dall’admin di Magento 2. Chiunque voglia accedere all’URL cms/page/edit deve, obbligatoriamente, avere il permesso alla risorsa, altrimenti il metodo isAllowed() che legge il valore di ADMIN_RESOURCE restituirà false e impedirà l’accesso alla pagina.

Questo vale per l’accesso al pannello admin di magento, mentre invece le Web API non usano i controller e quindi non  possono appoggiarsi alla costante ADMIN_RESOURCE ne il metodo _isAllowed(). Per settare i permessi si utilizza il file webapi.xml. Continuiamo con l’esempio della pagina CMS e analizziamo il suo file

.........
    <route url="/V1/cmsPage/search" method="GET">
        <service class="Magento\Cms\Api\PageRepositoryInterface" method="getList"/>
        <resources>
            <resource ref="Magento_Cms::page"/>
        </resources>
    </route>
    <route url="/V1/cmsPage" method="POST">
        <service class="Magento\Cms\Api\PageRepositoryInterface" method="save"/>
        <resources>
            <resource ref="Magento_Cms::page"/>
        </resources>
    </route>
    <route url="/V1/cmsPage/:id" method="PUT">
        <service class="Magento\Cms\Api\PageRepositoryInterface" method="save"/>
        <resources>
            <resource ref="Magento_Cms::page"/>
        </resources>
    </route>
.........

All’interno di questo file definiamo il tag route e definiamo i due attributi (url e method) che specificano, appunto, l’url che attiverà la rotta. Poi definiamo la classe e il metodo del servizio specificando quale interfaccia verrà eseguita dopo aver chiamato il percorso URL. Infine specifichiamo il tag resource con il suo attributo ref che effettua il controllo di sicurezza sui permessi. Se un utente tenta di accedere alla risorsa ma non è autenticato o non ha i permessi per quella risorsa ( per esempio su Magento_Cms::page ) la richiesta non sarà eseguita e quindi non sarà chiamato il servizio.

Tipi di Autenticazione

Magento 2 supporta tre metodi di autenticazione differenti:

  • Session

Utilizza lo stato di accesso di un utente (amministratore o cliente) per verificare la propria identità e autorizzare l’accesso alle risorse. In magento 2 questo viene fatto utilizzando widget JavaScript.

  • Token

Adatto per applicazioni mobile o altri tipi di applicazioni che non vogliono usare l’autenticazione OAuth (a causa della sua complessità). Si deve ottenere un token tramite autenticazione e poi usarlo per effettuare le chiamate alle risorse. Per ottenere un Token tramite REST si utilizza una chiamata POST al seguente url  /V1/integration/customer/token oppure /V1/integration/admin/token. Questa chiamata ritorna una stringa random di 32 caratteri che rappresenta il nostro token ( 81pk09xgi686fva68vtjjqkxq1qsj4cc) Per ottenere il token dobbiamo passare all’header della chiamata login e password dell’utente che vuole richiedere le risorse. Ottenuto il token lo utilizzeremo per qualsiasi chiamata alle API passandolo nell’header di ogni richiesta con il parametro  Authorization: Bearer <token>

  • OAuth

Adatto per applicazioni di terze parti che devono interagire con Magento 2 senza passare alla richiesta nessun User ID o Password. Per utilizzare questo tipo di autenticazione dobbiamo creare l’integrazione nella admin di Magento in System->Extensions->Integration->Add New Integration. Qui dovremo settare alcune opzioni come Callback URL e Identity link URL che definiscono l’endpoint dell’applicazione esterna che riceve le credenziali OAuth. Una volta salvato, l’applicazione genera le seguenti chiavi OAuth (Consumer Key, Consumer Secret, Access Token, e Access Token Secret) che ci permetteranno di accedere alle risorse.

Nel prossimo articolo vedremo come chiamare le api di magento utilizzando SwaggerUI, Postman e la shell di linux

Pasquale Guarino

pasquale.guarino80@gmail.com

WP2Social Auto Publish Powered By : XYZScripts.com