17.9.4 Authentification par jetons

L'authentification en mode open permet d'effectuer une requête authentifiée sans fournir l'identifiant ni le mot de passe mais en fournissant un jeton d'authentification.

Cette clef d'authentification est associée à un utilisateur défini. Elle permet d'exécuter les actions qui sont déclarées "openaccess" (valeur "Y").

// Fichier MYAPP.app
$action_desc = array(
    array(
        "name" => "MY_OPENACTION",
        "acl" => "MY_ACL",
        "openaccess" => "Y",
        "short_name" => "Open access test"
    )
);

17.9.4.1 Obtenir un jeton d'authentification

La méthode Account::getUserToken permet de générer un jeton pour un utilisateur donné.

string Account::getUserToken(int   $expireDelay = -1, 
                             bool  $oneshot     = false, 
                             array $context     = array(),
                            string $description = "",
                              bool $forceCreate=false)

Cette méthode retourne un jeton sous forme de chaîne de caractères hexadécimaux.

$expireDelay (int): Délai de validité du jeton en secondes.
Mettre "-1" (ou false) pour indiquer un délai infini.
3.2.23 -1 est supporté depuis cette version. Dans les versions antérieures, il fallait indiquer "false", pour l'infini.
$oneshot (bool): Mettre "true" pour indiquer que le jeton sera valide une seule fois
Le jeton est supprimé une fois consommée.
$context (array): Tableau indexé (clef/valeur)
Indique que les paramètres qui sont obligatoires dans l'url
$description (string): Texte informatif sur le jeton
Visible lors de l'utilisation de la gestion des jetons dans le centre d'administration
$forceCreate (bool): 3.2.23 Pour forcer la création d'un nouveau jeton
Si cette méthode est appelée avec les mêmes arguments plusieurs fois et avec l'option oneshot à false et forceCreate à false, le jeton n'est pas créé si un jeton avec les mêmes caractéristiques existe déjà. Dans ce cas, c'est le même jeton qui est fourni.

Exemple : Construction d'un jeton utilisable à vie pour l'utilisateur "john.doe"

$a=new account();
$a->setLoginName("john.doe");
 
$t=$a->getUserToken();
print $t; // > cad68f8e1848f12df16e44857c595f9a72124f41

Ce jeton permet d'exécuter toutes les actions déclarées en "openaccess".

Exemple : Construction d'un jeton utilisable à vie pour l'utilisateur "john.doe" restreinte à l'action "MY_OPENACTION" de l'application "MYAPP"

$a=new account();
$a->setLoginName("john.doe");
 
$t=$a->getUserToken(false, false, 
    ["app"=>"MYAPP", "action"=>"MY_OPENACTION"]);

Exemple : Construction d'un jeton utilisable pour une heure pour l'utilisateur "john.doe" restreinte à l'action "MY_OPENACTION" de l'application "MYAPP"

$a=new account();
$a->setLoginName("john.doe");
 
$t=$a->getUserToken(3600, false, 
    ["app"=>"MYAPP", "action"=>"MY_OPENACTION"]);

17.9.4.2 Requête pour exécuter une action avec l'authentification "open"

Le jeton doit être indiqué dans l'url avec la variable dcpopen-authorization. Elle peut aussi être indiquée par une variable dans un formulaire (méthode HTTP POST).

L'url doit contenir la variable "dcpopen-authorization".

Exemple d'URL :

?dcpopen-authorization=e2bb65612c70e7ac78d5ccbfe12aa234&app=FOO&action=BAR

3.2.23La variable privateid utilisée dans les versions précédentes est dépréciée au profit de la variable dcpopen-authorization. Si la variable privateid est utilisée alors il faut aussi indiquer explicitement la variable "authtype`.

(déprécié) ?authtype=open&privateid=e2bb65612c70e7ac78d5ccbfe12aa234&app=FOO&action=BAR

Dans ce cas, le cookie de session, s'il est émis, est ignoré.

Le paramètre système de "CORE_OPENURL" est utilisé pour construire les urls. Il doit contenir l'url d'accès à l'application. S'il n'est pas valué (par défaut), c'est la valeur du paramètre "CORE_URLINDEX" qui est utilisé.

Le jeton peut aussi être indiqué dans le header HTTP :

GET ?app=FOO&action=BAR
Authorization: DcpOpen e2bb65612c70e7ac78d5ccbfe12aa234

Dans ce cas, le paramètre authtype est optionnel.

Par contre, si le jeton est indiqué et qu'un cookie de session est émis, le cookie de session est ignoré. Le terme "DcpOpen" est le "HTTP Authentication Scheme" pour identifier le mode d'autorisation.

3.2.18 L'authentification par jeton ne donne plus lieu à l'émission d'un cookie de session (l'authentification étant portée par le jeton et non par une session HTTP). Par le passé, l'envoi d'une requête avec authentification par jeton déclenchait systématiquement l'émission d'un nouveau cookie de session bien que ce dernier ne soit pas utilisé.

Pour plus de détails sur la création des jetons : voir la documentation du fichier de la classe Class.UserToken.php.

En cas de jeton invalide, le statut HTTP retourné est 403.

×
mise à jour