Vérifier un OTP

Vérifie le code saisi par l'utilisateur.

POST/v1/otp/verify

Body

{
  "phone": "+22375673336",
  "code": "1234"
}

Exemples

TS=$(date +%s)
BODY='{"phone":"+22375673336","code":"1234"}'
SIG=$(node -e "const c=require('crypto');const s=c.createHmac('sha256','$APP_SECRET').update('POST/v1/otp/verify'+'$TS'+'$BODY').digest('hex');console.log(s)")

curl -X POST https://api.otp.julakai.com/v1/otp/verify \
  -H "Content-Type: application/json" \
  -H "X-Julak-Key: $APP_KEY" \
  -H "X-Julak-Timestamp: $TS" \
  -H "X-Julak-Signature: $SIG" \
  -d "$BODY"

Succès (200)

{
  "verified": true,
  "verificationToken": "eyJhbG..."
}

Le verificationToken est un JWT signé par julakAI (EdDSA, valable 2 minutes). Ton app le vérifie, puis crée sa propre session — julakAI ne gère aucun utilisateur.

Vérifier le verificationToken

Ne fais jamais confiance à un jeton sans le vérifier. Utilise la clé publique de julakAI, publiée sur https://api.otp.julakai.com/.well-known/jwks.json. Elle permet de vérifier un jeton, jamais d'en fabriquer. Impose l'émetteur et ton appKey comme audience : un jeton émis pour une autre app sera refusé.

// npm install jose
const { createRemoteJWKSet, jwtVerify } = require("jose");

const JWKS = createRemoteJWKSet(
  new URL("https://api.otp.julakai.com/.well-known/jwks.json")
);

async function numeroVerifie(verificationToken) {
  const { payload } = await jwtVerify(verificationToken, JWKS, {
    issuer: "https://api.otp.julakai.com",
    audience: APP_KEY,          // ton jak_live_...
    algorithms: ["EdDSA"],
  });
  return payload.sub;           // le numéro vérifié, ex. "+22375673336"
}

Payload : { iss, aud, sub, iat, exp, jti, appId, phone, verifiedAt }. jti identifie l'OTP : garde-le quelques minutes pour refuser un jeton rejoué.

Erreurs

401expired_or_not_found
Aucun OTP en attente ou expiré
401invalid_code
Code incorrect, tentatives restantes
403locked
Verrouillé 30 min après 3 échecs