← Documentation

CURL · SANS SDK

Essayez l’API,
depuis votre terminal.

Une commande pour vérifier la disponibilité du service. Puis un parcours OAuth complet pour tester votre propre application, sans installer de SDK.

1. Vérifiez que l’API répond

curl --fail-with-body --silent --show-error \
  https://auth.notif.ml/healthz

Réponse attendue : {"status":"ok","service":"notif-auth"}. Cette commande ne crée pas de compte et ne démarre pas de connexion.

2. Préparez votre connexion

Dans le dashboard, créez une application de type Serveur. Copiez son identifiant et enregistrez une URL de retour que vous contrôlez, sans paramètres ni fragment pour cet exemple. Cette URL doit permettre de récupérer le code sans l’échanger automatiquement. Le Live nécessite une URL HTTPS ; en Sandbox, une URL localhost est acceptée.

# Bash ou zsh, avec Python 3 et cURL.
# Remplacez ces valeurs par celles de votre application Serveur.
export NOTIF_CLIENT_ID='pk_live_VOTRE_CLIENT_ID'
export NOTIF_REDIRECT_URI='https://votre-app.example/auth/callback'
export NOTIF_VERIFIER="$(python3 -c 'import secrets; print(secrets.token_urlsafe(32))')"
export NOTIF_STATE="$(python3 -c 'import secrets; print(secrets.token_urlsafe(32))')"

python3 - <<'PY'
import os, hashlib, base64
from urllib.parse import urlencode
challenge = base64.urlsafe_b64encode(
    hashlib.sha256(os.environ['NOTIF_VERIFIER'].encode()).digest()
).decode().rstrip('=')
print('Ouvrez cette URL dans votre navigateur :')
print('https://auth.notif.ml/authorize?' + urlencode({
    'response_type': 'code',
    'client_id': os.environ['NOTIF_CLIENT_ID'],
    'redirect_uri': os.environ['NOTIF_REDIRECT_URI'],
    'state': os.environ['NOTIF_STATE'],
    'code_challenge_method': 'S256',
    'code_challenge': challenge,
}))
PY

3. Effectuez la vérification dans le navigateur

Ouvrez l’URL affichée. En Live, suivez le parcours WhatsApp ; en Sandbox, utilisez la simulation proposée. Votre callback reçoit code et state. Copiez son URL complète et revenez dans le même terminal. Le code est utilisable une seule fois, pendant 60 secondes : préparez la commande suivante avant de terminer la vérification.

4. Échangez le code avec cURL

# Gardez le même terminal : il contient le vérificateur PKCE et state.
# Le secret est saisi sans affichage et n'est pas écrit dans la commande.
printf 'Secret serveur : '
read -r -s NOTIF_CLIENT_SECRET
printf '\nURL complète reçue sur votre callback : '
read -r NOTIF_CALLBACK_URL
export NOTIF_CLIENT_SECRET NOTIF_CALLBACK_URL

# Vérifiez le callback et state avant d'envoyer le code.
if PAYLOAD="$(python3 - <<'PY'
import os, json, hmac, sys
from urllib.parse import urlsplit, parse_qs
actual = urlsplit(os.environ['NOTIF_CALLBACK_URL'])
expected = urlsplit(os.environ['NOTIF_REDIRECT_URI'])
query = parse_qs(actual.query)
state = query.get('state', [])
code = query.get('code', [])
valid = (
    (actual.scheme, actual.netloc, actual.path) ==
    (expected.scheme, expected.netloc, expected.path)
    and not actual.fragment
    and len(state) == 1 and len(code) == 1
    and hmac.compare_digest(state[0], os.environ['NOTIF_STATE'])
)
if not valid:
    sys.exit('Callback ou state invalide : échange annulé.')
print(json.dumps({
    'grant_type': 'authorization_code',
    'client_id': os.environ['NOTIF_CLIENT_ID'],
    'client_secret': os.environ['NOTIF_CLIENT_SECRET'],
    'redirect_uri': os.environ['NOTIF_REDIRECT_URI'],
    'code': code[0],
    'code_verifier': os.environ['NOTIF_VERIFIER'],
}))
PY
)"; then
  printf '%s' "$PAYLOAD" | curl --fail-with-body --silent --show-error \
    https://auth.notif.ml/token \
    --header 'Content-Type: application/json' \
    --data-binary @-
fi
unset PAYLOAD NOTIF_CLIENT_SECRET NOTIF_CALLBACK_URL

Une réponse réussie contient un token signé. Un mauvais secret, un code expiré ou déjà utilisé renvoie une erreur : consultez la référence des erreurs.

Pour votre application en production

Avant d’ouvrir une session, vérifiez la signature RS256 du token avec les clés publiques de Notif Auth, son émetteur, son audience, son expiration et son environnement. La réponse JSON seule ne suffit pas à authentifier une personne. Le SDK Node.js effectue ces vérifications ; vous pouvez aussi utiliser une bibliothèque de vérification JWT dans votre langage.

Les secrets restent côté serveur. Un client Sandbox ne remplace pas un client Live. Le rattachement à un compte existant doit être demandé depuis une session authentifiée ; ne fusionnez pas automatiquement les comptes.