# Authentication Support Authentication can easily be handled when using the API Platform's admin library. In the following section, we will assume [the API is secured using JWT](../core/jwt.md), but the process is similar for other authentication mechanisms. The `authenticationTokenUri` is the full URI to the path / route specified by the `firewalls.{name}.json_login.check_path` config in the [JWT documentation](../core/jwt.md). The first step is to create a client to handle the authentication process: ```javascript // admin/src/authProvider.js import { AUTH_LOGIN, AUTH_LOGOUT, AUTH_ERROR, AUTH_CHECK } from 'react-admin'; // Change this to be your own authentication token URI. const authenticationTokenUri = `${process.env.REACT_APP_API_ENTRYPOINT}/authentication_token`; export default (type, params) => { switch (type) { case AUTH_LOGIN: const { username, password } = params; const request = new Request(authenticationTokenUri, { method: 'POST', body: JSON.stringify({ email: username, password }), headers: new Headers({ 'Content-Type': 'application/json' }), }); return fetch(request) .then(response => { if (response.status < 200 || response.status >= 300) throw new Error(response.statusText); return response.json(); }) .then(({ token }) => { localStorage.setItem('token', token); // The JWT token is stored in the browser's local storage window.location.replace('/'); }); case AUTH_LOGOUT: localStorage.removeItem('token'); break; case AUTH_ERROR: if (401 === params.status || 403 === params.status) { localStorage.removeItem('token'); return Promise.reject(); } break; case AUTH_CHECK: return localStorage.getItem('token') ? Promise.resolve() : Promise.reject(); default: return Promise.resolve(); } } ``` Then, configure the `Admin` component to use the authentication client we just created: ```javascript import React from 'react'; import parseHydraDocumentation from '@api-platform/api-doc-parser/lib/hydra/parseHydraDocumentation'; import { HydraAdmin, hydraClient, fetchHydra as baseFetchHydra } from '@api-platform/admin'; import authProvider from './authProvider'; import { Route, Redirect } from 'react-router-dom'; const entrypoint = process.env.REACT_APP_API_ENTRYPOINT; // Change this by your own entrypoint if you're not using API Platform distribution const fetchHeaders = {'Authorization': `Bearer ${localStorage.getItem('token')}`}; const fetchHydra = (url, options = {}) => baseFetchHydra(url, { ...options, headers: new Headers(fetchHeaders), }); const dataProvider = api => hydraClient(api, fetchHydra); const apiDocumentationParser = entrypoint => parseHydraDocumentation(entrypoint, { headers: new Headers(fetchHeaders), }).then( ({ api }) => ({ api }), result => { const { api, status } = result; if (status === 401) { return Promise.resolve({ api, status, customRoutes: [ } />, ], }); } return Promise.reject(result); } ); export default () => ( ); ``` Refer to [the chapter dedicated to authentication in the React Admin documentation](https://marmelab.com/react-admin/Authentication.html) for more information.