Mon jeton d'authentification
Le système d’authentification est basé sur l’utilisation d’un jeton d’authentification appelé Token JWT (“Json Web Token”). Celui-ci est représenté par les paramètres suivants :
- “access_token” étant un ensemble de données encryptées
- “token_type” représentant le type de jeton, dans le cas de l'API REST Mindbaz “Bearer”
- “expires_in” représentant en secondes le temps d’expiration du jeton
- “refresh_token” étant une clé unique temporaire (7 jours) permettant de rafraîchir le “access_token” une fois celui-ci expiré
Où se procurer le jeton d’authentification JWT ?
Afin de récupérer un jeton d'authentification, vous devez envoyer une requête de type ‘POST’ au service d’authentification via l’URL suivante : https://sso.mindbaz.com/oauth2/token
Les paramètres à spécifier au format form-urlencoded
sont les suivants :
Nom du paramètre | Valeur |
---|---|
grant_type | password |
username | "Login de l’utilisateur" (Fourni lors de la création du compte API) |
password | "Mot de passe de l’utilisateur" (Défini par le détenteur du compte API) |
client_id | 100 (Attention de ne pas utiliser ici l'ID site correspondant à l'ID de votre base !) |
Le retour généré par l'API est sous la forme suivante :
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJodHRwczovL3Nzby5taW5kYmF6LmNvbSIsImlhdCI6MTYyMzY3MzI0MiwianRpIjoiNTAyNGUzYWYtZjM2Yi00OWU4LWEwZjMtOTBlOGVkZTRiOWI4IiwibmFtZSI6Imdsb3BlekBtaW5kYmF6LmNvbSIsInN1YiI6Imdsb3BlekBtaW5kYmF6LmNvbSIsImVtYWlsIjoiZ2xvcGV6QG1pbmRiYXouY29tIiwiZXhwIjoxNjIzNjc0NDQyLCJhdWQiOiJSZXN0QVBJIiwiY29va2V5IjoiYVU0MVp6UnhWRlJwUldFelYwWkRSRkJQYUZOU1FUMDkifQ.EOdHck1Pw9iL4UGN0Afso5GJ8mcHT_v5bmsyFm_MJkI",
"token_type": "bearer",
"expires_in": 1199,
"refresh_token": "71b3ca358b014f0b95c07e6dfb76fae2"
}
Interroger l’API Mindbaz
Une fois le Token récupéré, à chaque appel vers l’API Mindbaz, vous devez utiliser la valeur du 'access_token' dans le paramètre “Authorization” du header de votre requête, précédée de la mention “Bearer”
const ACCESS_TOKEN = "Bearer " + Cookies.get("access_token");
const options = {
headers: {
Authorization: ACCESS_TOKEN
}
}
}
Gestion de l’expiration du Jeton
Si le jeton a expiré ou est invalide, la réponse du service d’authentification (SSO) sera de type “401 Unauthorized”.
Dans ce cas, si vous possédez un précédent jeton, vous devez “rafraîchir” celui-ci en envoyant une requête au service d’authentification SSO à l’url suivante : https://sso.mindbaz.com/oauth2/token
Les paramètres à spécifier au format ‘form-urlencoded’ sont les suivants :
Nom du paramètre | Valeur |
---|---|
grant_type | refresh_token |
refresh_token | "Refresh_token de l’utilisateur" |
client_id | 100 |
Le retour généré par l'API est sous la forme suivante :
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJodHRwczovL3Nzby5taW5kYmF6LmNvbSIsImlhdCI6MTYyMzY3MzI0MiwianRpIjoiNTAyNGUzYWYtZjM2Yi00OWU4LWEwZjMtOTBlOGVkZTRiOWI4IiwibmFtZSI6Imdsb3BlekBtaW5kYmF6LmNvbSIsInN1YiI6Imdsb3BlekBtaW5kYmF6LmNvbSIsImVtYWlsIjoiZ2xvcGV6QG1pbmRiYXouY29tIiwiZXhwIjoxNjIzNjc0NDQyLCJhdWQiOiJSZXN0QVBJIiwiY29va2V5IjoiYVU0MVp6UnhWRlJwUldFelYwWkRSRkJQYUZOU1FUMDkifQ.EOdHck1Pw9iL4UGN0Afso5GJ8mcHT_v5bmsyFm_MJkI",
"token_type": "bearer",
"expires_in": 1199,
"refresh_token": "71b3ca358b014f0b95c07e6dfb76fae2"
}
L’appel renvoie à nouveau un “access_token” valide ainsi qu’un nouveau “refresh_token” valable pour le prochain rafraîchissement, le précédent ayant expiré après utilisation.
Réutilisez votre jeton pendant toute sa durée de validité et demandez son refresh dès qu’il est expiré.
Voici un ex de code php gérant tous les cas d'utilisation :
<?php
abstract class HttpMethod {
const GET = 0;
const POST = 1;
const PUT = 2;
const DELETE = 3;
}
// Get New Access Token
// Dont ask for a new access access_token when you have already a valid token
// reuse your access_token when it is possible!
function getAccessToken($username, $password)
{
if( isset($_SESSION["access_token"])
&& isset($_SESSION["access_token_expiration"])
&& time() < $_SESSION["access_token_expiration"] - 10 ) //+10sec safety margin
{
//echo 'access_token from session ok<BR/>';
return $_SESSION["access_token"];
}
//SSO
$sso_url = 'https://sso.mindbaz.com/oauth2/token';
$curl = curl_init($sso_url );
//refresh token
if( isset($_SESSION["refresh_token"]) )
{
$refresh=true;
$curl_post_data = array(
'client_Id' => '100',
'grant_type' => 'refresh_token',
'refresh_token' => $_SESSION["refresh_token"]
);
}
else // get access token
{
$refresh=false;
$curl_post_data = array(
'client_Id' => '100',
'grant_type' => 'password',
'username' => $username,
'password' => $password
);
}
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($curl_post_data));
curl_setopt($curl, CURLOPT_CAINFO, getcwd() . "\\DSTRootCAX3.crt");
$curl_response = curl_exec($curl);
if ($curl_response === false) {
curl_close($curl);
die('Error occured during curl exec '.$sso_url.' : curl_response = '.$curl_response );
}
$decoded = json_decode($curl_response);
if (isset($decoded->error)) {
die('error occured: ' . $decoded->error);
}
$access_token = $decoded->access_token;
$expires_in = $decoded->expires_in;
$refresh_token = $decoded->refresh_token;
curl_close($curl);
$_SESSION["access_token"] = $access_token;
$_SESSION["refresh_token"] = $refresh_token;
$_SESSION["access_token_expiration"] = strtotime('+'.(string)$expires_in.' sec');
return $access_token;
}
// Call api rest with GET
function api_call($path, $access_token, int $http_method=HttpMethod::GET, $fields=null)
{
$curl = curl_init($path);
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
"Content-Type: application/json",
"Authorization: Bearer ".$access_token
));
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_CAINFO, getcwd() . "\\DSTRootCAX3.crt");
if($http_method <> HttpMethod::GET)
{
if($http_method == HttpMethod::POST)
curl_setopt($curl, CURLOPT_POST, true);
elseif($http_method == HttpMethod::PUT)
{
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "PUT");
}
elseif($http_method == HttpMethod::DELETE)
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "DELETE");
if( $fields != null)
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($fields));
}
$curl_response = curl_exec($curl);
$httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
if ($httpcode <> 200 )
{
//echo var_dump(curl_getinfo($curl));
curl_close($curl);
die('Error '.$httpcode.' occured during curl exec '.$path.' : curl_response = '. (isset($curl_response)?$curl_response:'null') );
}
curl_close($curl);
return json_decode($curl_response);
}
?>