#

Personalizar claims JWT en Laravel Passport

Laravel Passport es el módulo oficial de Laravel que nos ayuda a la implementación de servicios de autenticación haciendo uso del protocolo OAuth2.
JWT | Laravel

Laravel Passport es el módulo oficial de Laravel que nos ayuda a la implementación de servicios de autenticación haciendo uso del protocolo OAuth2. Además, otra de las características de Laravel Passport es la implementación de JWT como estándar en la generación de tokens.

Laravel Passport añade una serie de claims por defecto, para cambiarlos solo tendremos que crear las siguientes clases y añadirlas a nuestro proyecto:

CustomAccessToken

Crearemos una nueva clase (CustomAccessToken) que extienda del AccessToken de Passport (LaravelPassportBridgeAccessToken) y añadiremos nuestros claims haciendo uso del método “set(claim_name , claim_value)”

[php]

class CustomAccessToken extends LaravelPassportBridgeAccessToken
{

/**
* Generate a JWT from the access token
*
* @param CryptKey $privateKey
*
* @return Token
*/
public function convertToJWT(CryptKey $privateKey)
{
return (new Builder())
->setAudience($this->getClient()->getIdentifier())
->setId($this->getIdentifier(), true)
->setIssuedAt(time())
->setNotBefore(time())
->setExpiration($this->getExpiryDateTime()->getTimestamp())
->setSubject($this->getUserIdentifier())
->set(‘custom_claim’, ‘https://www.sixphere.com’)
->sign(new Sha256(), new Key($privateKey->getKeyPath(), $privateKey->getPassPhrase()))
->getToken();
}

}

[/php]

CustomAccessTokenRepository

El segundo paso será extender la clase LaravelPassportBridgeAccessTokenRepository para que haga uso de CustomAccessToken.

[php]

class CustomAccessTokenRepository extends LaravelPassportBridgeAccessTokenRepository
{
/**
* {@inheritdoc}
*/
public function getNewToken(ClientEntityInterface $clientEntity, array $scopes, $userIdentifier = null)
{
return new CustomAccessToken($userIdentifier, $scopes);
}

}

[/php]

CustomPassportServiceProvider

Extenderemos el service provider de Passport (LaravelPassportPassportServiceProvider) y cambiaremos la implementación del método “makeAuthorizationServer()” para que añada nuestro CustomAccessTokenRepository.

[php]

class CustomPassportServiceProvider extends LaravelPassportPassportServiceProvider
{

/**
* Interviene la instanciación del servidor de autenticación para cambiar el repositorio de tokens JWT
*
* @return LeagueOAuth2ServerAuthorizationServer
* @throws IlluminateContractsContainerBindingResolutionException
*/
public function makeAuthorizationServer()
{
return new AuthorizationServer(
$this->app->make(ClientRepository::class),
$this->app->make( AppAuthBridgeCustomAccessTokenRepository::class), // This!!
$this->app->make(ScopeRepository::class),
$this->makeCryptKey(‘private’),
app(‘encrypter’)->getKey()
);
}
}

[/php]

Para finalizar, lo añadiremos a la configuración de Laravel (server/config/app.php).

[php]

IlluminateValidationValidationServiceProvider::class,
IlluminateViewViewServiceProvider::class,

/*
* Package Service Providers…
*/

AppProvidersCustomPassportServiceProvider::class, // This!!

/*
* Application Service Providers…
*/
AppProvidersAppServiceProvider::class,
AppProvidersAuthServiceProvider::class,

[/php]

A partir de ahora, el payload de nuestros JWT generados con Passport contendrá los claims que hemos añadido.

[php]

{
"aud": "2",
"jti": "3df3d0b9be646d32d8aa4d8ddb72af2ed4752be07eb4ef752a46db59fefdd81d2643ada386246cd6",
"iat": 1564683626,
"nbf": 1564683626,
"exp": 1596306026,
"sub": "1",
"custom_claim": "https://www.sixphere.com"
}

[/php]

CONOCIMIENTO / Descargables

EBook gratuito
eficiencia OEE

Asistimos tu proceso de diseño y análisis de datos

Descubre las particularidades del indicador OEE, cómo automatizar su cálculo y que requisitos deben cumplir tus procesos de producción para implementarlo.