<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="https://dotclear.watch/feed/rss2/xslt" ?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>DotclearWatch / Blog - Mot-clé - credential</title>
    <link>https://dotclear.watch/</link>
    <atom:link href="https://dotclear.watch/feed/tag/credential/rss2" rel="self" type="application/rss+xml" />
    <description>Suivez l'évolution du moteur de blogs Dotclear.</description>
    <language>fr</language>
    <pubDate>Mon, 06 Apr 2026 09:30:20 +0200</pubDate>
    <copyright>Tous droits réservés © Jean-Christian Denis</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>Dotclear</generator>
          <item>
        <title>[2.36] Gestion de jeton utilisateur</title>
        <link>https://dotclear.watch/Billet/%5B2.36%5D-Gestion-de-jeton-utilisateur</link>
        <guid isPermaLink="false">urn:md5:08327aeb0c59c36b57dea9f5dc2d2322</guid>
        <pubDate>Tue, 19 Aug 2025 15:26:00 +0200</pubDate>
        <dc:creator>Jean-Christian Denis</dc:creator>
                  <category>2.36</category>
                          <category>2.36</category>
                  <category>credential</category>
                  <category>databale</category>
                  <category>jeton</category>
                  <category>table</category>
                <description>&lt;p&gt;Avec l'arrivée des connexions exotiques sur la version 2.36, Dotclear embarque une nouvelle table dans la base de données accompagnée de sa classe de gestion.&lt;/p&gt; &lt;p&gt;&lt;a class=&quot;ref-post&quot; href=&quot;https://dotclear.watch/Billet/2.36&quot; title=&quot;Article rédigé pour Dotclear 2.36&quot;&gt;&lt;img alt=&quot;badge Dotclear 2.36&quot; src=&quot;https://img.shields.io/badge/Dotclear-2.36-blue?style=for-the-badge&quot; /&gt; &lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Les jetons d'accés des utilisateurs à des services tiers doivent pouvoir être gérés par utilisateur mais également par service, les tables existantes de Dotclear ne proposaient pas de solution adéquate. Une nouvelle table &lt;strong&gt;credential&lt;/strong&gt; et sa classe &lt;strong&gt;App::credential()&lt;/strong&gt; sont donc disponibles depuis Dotclear 2.36.&lt;/p&gt;

&lt;p&gt;Préambule&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;La classe de gestion de jeton est très classique de ce qui se fait dans Dotclear.&lt;/li&gt;
	&lt;li&gt;La classe est toujours disponible directement dans Dotclear.&lt;/li&gt;
	&lt;li&gt;Si un utilisateur est supprimé, ses jetons seront également supprimés (cascade)&lt;/li&gt;
	&lt;li&gt;Si un blog est supprimé les jetons qui lui sont liés seront également&amp;nbsp;supprimés (cascade)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;Attention &lt;/u&gt;: Les données sont cryptées avant d'être enregistrées dans la base de données, si vous perdez la&amp;nbsp;&quot;Master Key&quot; de votre installation, toutes ces données seront illisibles et donc perdues.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;Schéma de la table&lt;/h3&gt;

&lt;pre&gt;
&lt;code class=&quot;language-php&quot;&gt;
$structure-&amp;gt;credential
            -&amp;gt;field('user_id', 'varchar', 32, false)
            -&amp;gt;field('blog_id', 'varchar', 32, true, null)
            -&amp;gt;field('credential_dt', 'timestamp', 0, false, 'now()')
            -&amp;gt;field('credential_type', 'varchar', 32, false)
            -&amp;gt;field('credential_value', 'varchar', 255, false, &quot;''&quot;)
            -&amp;gt;field('credential_data', 'text', 0, true, null)

            -&amp;gt;unique('uk_credential', 'credential_type', 'user_id', 'blog_id', 'credential_value')


$structure-&amp;gt;credential
            -&amp;gt;index('idx_credential_user_id', 'btree', 'user_id');
$structure-&amp;gt;credential
            -&amp;gt;index('idx_credential_blog_id', 'btree', 'blog_id');
$structure-&amp;gt;credential
            -&amp;gt;reference('fk_credential_user', 'user_id', 'user', 'user_id', 'cascade', 'cascade')
$structure-&amp;gt;credential
            -&amp;gt;reference('fk_credential_blog', 'blog_id', 'blog', 'blog_id', 'cascade', 'cascade');
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Définition de son interface&lt;/h3&gt;

&lt;pre&gt;
&lt;code class=&quot;language-php&quot;&gt;
namespace Dotclear\Interface\Core;

use ArrayObject;
use Dotclear\Database\Cursor;
use Dotclear\Database\MetaRecord;

/**
 * @brief   User credentials handler interface.
 *
 * Use this class to store user credential
 * for third party applications.
 *
 * @author  Jean-Christian Paul Denis
 * @since   2.36
 */
interface CredentialInterface
{
    /**
     * Credential table name.
     *
     * @var    string  CREDENTIAL_TABLE_NAME
     */
    public const CREDENTIAL_TABLE_NAME = 'credential';

    /**
     * Open a credential database table cursor.
     *
     * @return  Cursor  The credential database table cursor
     */
    public function openCredentialCursor(): Cursor;

    /**
     * Get credentials.
     *
     * @param      array&amp;lt;string, mixed&amp;gt;|ArrayObject&amp;lt;string, mixed&amp;gt;  $params      The parameters
     *
     * @return     MetaRecord  The users.
     */
    public function getCredentials(array|ArrayObject $params = []): MetaRecord;

    /**
     * Set user credential.
     *
     * @param     string     $user_id     The user ID
     * @param     Cursor     $cur         The credential Cursor
     */
    public function setCredential(string $user_id, Cursor $cur): void;

    /**
     * Delete credentials.
     *
     * If &amp;lt;var&amp;gt;$global&amp;lt;/var&amp;gt; is set to False, current blog is selected.
     *
     * @param   string          $credential_type    The credential type
     * @param   string          $credential_value   The credential value
     * @param   null|string     $user_id            The user_id (or null for all users)
     * @param   bool            $global             True for global or false for current blog
     */
    public function delCredentials(string $credential_type, string $credential_value = '', ?string $user_id = null, bool $global = true): void;

    /**
     * Encrypt data.
     *
     * This is used to protect sensible data in database.
     * Data encryption is linked to Dotclear's master key.
     *
     * @param   ArrayObject&amp;lt;string, mixed&amp;gt;|array&amp;lt;string, mixed&amp;gt;     $data   The credential data to encode
     *
     * @return  string  The encoded credential data
     */
    public function encryptData(array|ArrayObject $data): string;

    /**
     * Decrypt data.
     *
     * Decode data encoded with self::encreyptData()
     *
     * @param   string  $data   The encoded credential data
     *
     * @return  array&amp;lt;string, mixed&amp;gt; The decoded credential data
     */
    public function decryptData(string $data): array;
}&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Recherche de jetons&lt;/h3&gt;

&lt;p&gt;Les paramètres de recherche de la méthode getCredentials() sont :&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;user_id : optionnel : l'utilisateur du jeton&lt;/li&gt;
	&lt;li&gt;blog_id : optionnel : la blog courant (si ommit ce sera global)&lt;/li&gt;
	&lt;li&gt;credential_type : optionnel : généralement le nom du service associé au jeton (si ommit ce sera &quot;webauthn&quot;)&lt;/li&gt;
	&lt;li&gt;credential_value&amp;nbsp;: optionnel : une valeur mise en avant du jeton&lt;/li&gt;
	&lt;li&gt;order : optionnel : parametre de trie&lt;/li&gt;
	&lt;li&gt;limit : optionnel : limite de nombre de résultats&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Les données du champs credential_data sont cryptées lors de l'enregistrement d'un champs, pour les décrypter il faut utiliser la méthode $rs-&amp;gt;getAllData(); de l'enregistrement retourné.&lt;/p&gt;

&lt;pre&gt;
&lt;code class=&quot;language-php&quot;&gt;$rs = App::credential()-&amp;gt;getCredentials([
    'credential_type' =&amp;gt; 'plop',
    'user_id' =&amp;gt; App::auth()-&amp;gt;userID(),
]);
if (!$rs-&amp;gt;isEmpty()) {
    // tableau complet du jeton
    $data = $rs-&amp;gt;getAllData();
    // ou
    $un_morceau_de_jeton = $rs-&amp;gt;getData('un_morceau_de_jeton');
}&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Ajout de jeton&lt;/h3&gt;

&lt;p&gt;L'ajout du jeton se fait à la manière de Dotclear, en ouvrant un curseur et en y incluant les informations qu'on désire.&lt;/p&gt;

&lt;pre&gt;
&lt;code class=&quot;language-php&quot;&gt;$cur = App::credential()-&amp;gt;openCredentialCursor();
$cur-&amp;gt;setField('blog_id', App::blog()-&amp;gt;id());
$cur-&amp;gt;setField('credential_type', 'mon_service');
$cur-&amp;gt;setField('credential_value', 'XYZEFFRE1234');
$cur-&amp;gt;setField('credential_data', new ArrayObject($mon_tableau_du_jeton));
App::credential()-&amp;gt;setCredential((string) App::auth()-&amp;gt;userID(), $cur);&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;On remarque que pour le champs &lt;strong&gt;credential_data&lt;/strong&gt; on crée un objet, cela permet de le manipuler dans la classe &lt;strong&gt;credential &lt;/strong&gt;et de pouvoir le crypter lors de l'enregistrement dans la base de données.&lt;/p&gt;

&lt;h3&gt;Supression de jeton&lt;/h3&gt;

&lt;p&gt;Le suppression de jetons se fait en empilant les critères suivant :&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;credential_type : obligatoire.&lt;/li&gt;
	&lt;li&gt;credential_value : obligatoire, si ommit on cherche une valuer vide&lt;/li&gt;
	&lt;li&gt;user_id : optionnel&lt;/li&gt;
	&lt;li&gt;global : si vrai on recherche une valeur null de blog, si faux on recherche le blog courant&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;
&lt;code class=&quot;language-php&quot;&gt;App::credential()-&amp;gt;delCredentials(
    'mon_service',
    'une_clé',
    null,
    false
);&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Dans cet exemple on supprimer le jeton de valeur 'une_clé' de type 'mon_service' sur le blog courant et peu importe l'utilisateur.&lt;/p&gt;

&lt;h3&gt;Conclusion&lt;/h3&gt;

&lt;p&gt;Rien d'extraordinaire sur cette classe, il suffit juste de réspecter les quelques recommandations présenteés ici.&lt;/p&gt;</description>
        
                  <comments>https://dotclear.watch/Billet/%5B2.36%5D-Gestion-de-jeton-utilisateur#comment-form</comments>
          <wfw:comment>https://dotclear.watch/Billet/%5B2.36%5D-Gestion-de-jeton-utilisateur#comment-form</wfw:comment>
          <wfw:commentRss>https://dotclear.watch/feed/atom/comments/438</wfw:commentRss>
              </item>
      </channel>
</rss>
