--- title: Pocket ID description: Installer Pocket ID, un fournisseur OIDC auto-hébergé et léger qui permet de se connecter à vos autres applications avec une passkey plutôt qu'un mot de passe. --- :ellipsis{left=0px width=40rem top=10rem blur=140px zIndex=60} [Pocket ID](https://pocket-id.org) est un fournisseur OIDC (OpenID Connect) minimaliste et auto-hébergé, entièrement construit autour des passkeys : au lieu de gérer des mots de passe, vous et vos utilisateurs vous connectez aux applications compatibles avec une **passkey** (empreinte digitale, reconnaissance faciale, ou clé de sécurité matérielle). Il tourne dans un unique conteneur léger, sans base de données externe à gérer, et fait une seule chose et la fait bien : délivrer des connexions OIDC. ![pocketid](/img/serveex/pocketid.png) C'est donc un bon choix si vous voulez simplement un backend SSO simple et rapide, par exemple pour l'associer à [TinyAuth](/serveex/security/tinyauth) en tant que forward-auth léger, ou pour vous connecter directement aux applications qui gèrent nativement OIDC. - [Documentation de Pocket ID](https://pocket-id.org/docs) - [Pocket ID sur GitHub](https://github.com/pocket-id/pocket-id) ## Installation ::file-tree --- tree: /: - srv: - docker: - pocket-id: - compose.yaml - .env - data/ --- :: ::steps{level="3"} ### Créer le dossier de données ```bash [Terminal] sudo mkdir -p /srv/docker/pocket-id/data ``` ### Générer une clé de chiffrement ```bash [Terminal] openssl rand -base64 32 ``` Gardez le résultat, vous en aurez besoin pour le fichier `.env` ci-dessous. ### Déployer la stack Ouvrez Dockge, cliquez sur `compose`, nommez la stack `pocket-id`, et ajoutez la configuration suivante : ```yaml [compose.yaml] --- services: pocket-id: image: pocketid/pocket-id:v2 container_name: pocket-id restart: unless-stopped env_file: - .env volumes: - /srv/docker/pocket-id/data:/app/data ports: - 1411:1411 healthcheck: test: ["CMD", "curl", "-f", "http://localhost:1411/healthz"] interval: 90s timeout: 5s retries: 3 ``` ::tip{icon=""} ✨ Ajoutez le label Watchtower pour automatiser les mises à jour : ```yaml [compose.yaml] --- services: pocket-id: #... labels: - com.centurylinklabs.watchtower.enable=true ``` :: ### Renseigner vos variables d'environnement Remplissez le fichier `.env` : ```properties [.env] APP_URL=https://id.mondomaine.fr ENCRYPTION_KEY= TRUST_PROXY=true ``` | Variable | Valeur | Exemple | |----------|-------|---------| | `APP_URL`{lang=properties} | L'URL publique par laquelle vous joindrez Pocket ID (voir l'exposition plus bas) | `https://id.mondomaine.fr` | | `ENCRYPTION_KEY`{lang=properties} | La clé générée ci-dessus | `Q2pVEqsTNRkJSO9SkJzU3KZ2...` | | `TRUST_PROXY`{lang=properties} | Nécessaire puisque Pocket ID se trouve derrière Swag | `true` | Déployez la stack. L'interface locale est disponible sur `http://ipdevotreserveur:1411`. ### Terminé ! :: ## Première connexion Pocket ID n'utilise pas de mots de passe : votre premier compte est créé avec une **passkey**, que votre navigateur ou votre système génère pour vous (Windows Hello, Touch ID, un téléphone, ou une clé matérielle comme une YubiKey). - Allez sur `http://ipdevotreserveur:1411/setup` - Suivez les instructions pour créer votre compte administrateur et enregistrer votre première passkey ::note Comme `APP_URL` pointe déjà vers votre futur domaine public, l'enregistrement de la passkey peut vous demander d'ouvrir Pocket ID depuis ce domaine. Exposez-le d'abord (voir plus bas) si la configuration ne se termine pas en local. :: ## Exposer Pocket ID avec Swag Les autres applications doivent joindre Pocket ID en HTTPS pour finaliser le processus de connexion OIDC, il doit donc être exposé même si vous ne l'utilisez que depuis chez vous. ::note Nous partons du principe que vous avez le sous-domaine `id.mondomaine.fr` avec un `CNAME` pointant vers `mondomaine.fr` dans votre [zone DNS](/general/networking/dns). Et bien sûr, [à moins d'utiliser Cloudflare Zero Trust](/serveex/security/cloudflare), le port `443` de votre box doit être redirigé vers le port `443` de votre serveur dans les [règles NAT](/general/networking/nat). :: ::steps{level="3"} ### Ajouter le réseau de Pocket ID à SWAG Allez dans Dockge et modifiez le fichier compose de SWAG en y ajoutant le réseau de Pocket ID : ```yaml [compose.yaml] --- services: swag: container_name: # ... # ... networks: # Rattache le conteneur au réseau personnalisé # ... - pocket-id # Nom du réseau déclaré networks: # Définit le réseau personnalisé # ... pocket-id: # Nom du réseau déclaré name: pocket-id_default # Nom réel du réseau externe external: true # Le marque comme défini à l'extérieur ``` Redéployez la stack et attendez que SWAG soit pleinement opérationnel. ::note Nous partons ici du principe que le nom du réseau de Pocket ID est `pocket-id_default`. Vous pouvez vérifier la connexion en visitant le tableau de bord de SWAG sur `http://ipdevotreserveur:81`. :: ### Créer le fichier subdomain.conf Dans les dossiers de Swag, créez le fichier `id.subdomain.conf` : ::tip{icon="" to="/serveex/files/file-browser-quantum"} ✨ __Astuce :__ utilisez **File Browser Quantum** pour naviguer et modifier les fichiers plutôt que des commandes dans le terminal. :: ```bash [Terminal] sudo nano /srv/docker/swag/config/nginx/proxy-confs/id.subdomain.conf ``` Collez la configuration suivante : ```nginx [id.subdomain.conf] ## Version 2023/12/19 server { listen 443 ssl; listen [::]:443 ssl; server_name id.*; include /config/nginx/ssl.conf; client_max_body_size 0; location / { include /config/nginx/proxy.conf; include /config/nginx/resolver.conf; set $upstream_app pocket-id; set $upstream_port 1411; set $upstream_proto http; proxy_pass $upstream_proto://$upstream_app:$upstream_port; } } ``` ::caution Ne mettez pas Pocket ID derrière une autre couche d'authentification (TinyAuth, auth HTTP...). C'est le fournisseur d'identité lui-même, le verrouiller empêcherait quiconque, vous compris, de se connecter. :: Appuyez sur :kbd{value="Ctrl+O"}, puis :kbd{value="Enter"} pour enregistrer, et :kbd{value="Ctrl+X"} pour quitter. ### Visiter votre nouveau sous-domaine Attendez quelques minutes, puis ouvrez `https://id.mondomaine.fr` dans votre navigateur. ::caution __Si ça ne marche pas :__ vérifiez les règles de votre pare-feu. :: ### Terminé ! :: ## Enregistrer un client OIDC Pour qu'une autre application (par exemple [TinyAuth](/serveex/security/tinyauth)) se connecte via Pocket ID, vous devez l'enregistrer comme client OIDC : ::steps{level="3"} ### Se connecter à Pocket ID Allez sur `https://id.mondomaine.fr` et connectez-vous avec votre passkey. ### Créer le client OIDC Allez dans _Administration > OIDC Clients_, puis cliquez sur _Add OIDC Client_. Renseignez un nom (par exemple `TinyAuth`) et l'URL de callback de l'application (fournie par l'application que vous protégez). ### Conserver les identifiants du client Enregistrez, puis copiez le __Client ID__ et le __Client Secret__ générés. Vous en aurez besoin dans la configuration de l'autre application. ### Terminé ! :: ## Connecter Pocket ID à TinyAuth [TinyAuth](/serveex/security/tinyauth) peut déléguer sa connexion à Pocket ID plutôt que (ou en plus de) son identifiant/mot de passe local, de sorte que quiconque visite une application protégée s'authentifie avec une passkey et se retrouve redirigé. ::steps{level="3"} ### Enregistrer TinyAuth comme client OIDC [Enregistrez un client OIDC](#enregistrer-un-client-oidc) nommé `TinyAuth`, avec cette URL de callback : ```text https://tinyauth.mondomaine.fr/api/oauth/callback/pocketid ``` ### Ajouter le fournisseur Pocket ID dans TinyAuth Copiez le __Client ID__ et le __Client Secret__ que Pocket ID vous donne, puis modifiez le fichier `.env` de TinyAuth : ```bash [Terminal] sudo nano /srv/docker/tinyauth/.env ``` Ajoutez ceci : ```properties [.env] TINYAUTH_OAUTH_PROVIDERS_POCKETID_NAME=Pocket ID TINYAUTH_OAUTH_PROVIDERS_POCKETID_CLIENTID= TINYAUTH_OAUTH_PROVIDERS_POCKETID_CLIENTSECRET= TINYAUTH_OAUTH_PROVIDERS_POCKETID_AUTHURL=https://id.mondomaine.fr/authorize TINYAUTH_OAUTH_PROVIDERS_POCKETID_TOKENURL=https://id.mondomaine.fr/api/oidc/token TINYAUTH_OAUTH_PROVIDERS_POCKETID_USERINFOURL=https://id.mondomaine.fr/api/oidc/userinfo TINYAUTH_OAUTH_PROVIDERS_POCKETID_REDIRECTURL=https://tinyauth.mondomaine.fr/api/oauth/callback/pocketid TINYAUTH_OAUTH_PROVIDERS_POCKETID_SCOPES=openid email profile ``` | Variable | Valeur | |----------|-------| | `CLIENTID`{lang=properties} | Le client ID copié depuis Pocket ID | | `CLIENTSECRET`{lang=properties} | Le client secret copié depuis Pocket ID | | `AUTHURL` / `TOKENURL` / `USERINFOURL`{lang=properties} | L'URL publique de Pocket ID, avec les chemins indiqués ci-dessus | Appuyez sur :kbd{value="Ctrl+O"}, puis :kbd{value="Enter"} pour enregistrer, et :kbd{value="Ctrl+X"} pour quitter. ### Redéployer la stack Redéployez la stack TinyAuth. À votre prochaine visite sur `https://tinyauth.mondomaine.fr`, vous verrez une option « Login with Pocket ID » à côté du formulaire de connexion local. ::tip{icon=""} ✨ Pour aller directement sur Pocket ID et masquer le formulaire de connexion local, ajoutez `TINYAUTH_OAUTH_AUTOREDIRECT=pocketid` au même fichier `.env`. :: ### Terminé ! :: Et voilà ! TinyAuth propose désormais une connexion sans mot de passe via Pocket ID pour chaque application qu'il protège.