283 lines
9.7 KiB
Markdown
283 lines
9.7 KiB
Markdown
---
|
|
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.
|
|
|
|

|
|
|
|
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.
|