Works great with LexikJWTAuthenticationBundle
composer require eljam/guzzle-jwt-middleware
<?php
use Eljam\GuzzleJwt\JwtMiddleware;
use Eljam\GuzzleJwt\Manager\JwtManager;
use Eljam\GuzzleJwt\Strategy\Auth\QueryAuthStrategy;
use GuzzleHttp\Client;
use GuzzleHttp\HandlerStack;
require_once 'vendor/autoload.php';
//Create your auth strategy
$authStrategy = new QueryAuthStrategy(['username' => 'admin', 'password' => 'admin']);
$baseUri = 'http://api.example.org/';
// Create authClient
$authClient = new Client(['base_uri' => $baseUri]);
//Create the JwtManager
$jwtManager = new JwtManager(
$authClient,
$authStrategy,
[
'token_url' => '/api/token',
]
);
// Create a HandlerStack
$stack = HandlerStack::create();
// Add middleware
$stack->push(new JwtMiddleware($jwtManager));
$client = new Client(['handler' => $stack, 'base_uri' => $baseUri]);
try {
$response = $client->get('/api/ping');
echo($response->getBody());
} catch (TransferException $e) {
echo $e->getMessage();
}
//response
//{"data":"pong"}
$authStrategy = new QueryAuthStrategy(
[
'username' => 'admin',
'password' => 'admin',
'query_fields' => ['username', 'password'],
]
);
$authStrategy = new FormAuthStrategy(
[
'username' => 'admin',
'password' => 'admin',
'form_fields' => ['username', 'password'],
]
);
$authStrategy = new HttpBasicAuthStrategy(
[
'username' => 'admin',
'password' => 'password',
]
);
$authStrategy = new JsonAuthStrategy(
[
'username' => 'admin',
'password' => 'admin',
'json_fields' => ['username', 'password'],
]
);
By default this library assumes your json response has a key token
, something like this:
{
token: "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXUyJ9..."
}
but now you can change the token_key in the JwtManager options:
$jwtManager = new JwtManager(
$authClient,
$authStrategy,
[
'token_url' => '/api/token',
'token_key' => 'access_token',
]
);
Some endpoints use different Authorization header types (Bearer, JWT, etc...).
The default is Bearer, but another type can be supplied in the middleware:
$stack->push(new JwtMiddleware($jwtManager, 'JWT'));
To avoid too many calls between multiple request, there is a cache system.
Json example:
{
token: "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXUyJ9...",
expires_in: "3600"
}
$jwtManager = new JwtManager(
$authClient,
$authStrategy,
[
'token_url' => '/api/token',
'token_key' => 'access_token',
'expire_key' => 'expires_in', # default is expires_in if not set
]
);
The bundle natively supports the exp field in the JWT payload.