'unauthenticated']); exit; } try { $claims = sassly_auth()->verifyAccessToken($token, 'sassly-api'); // add a scope as 3rd arg if needed } catch (SasslyAuthException $e) { http_response_code($e->reason === 'insufficient_scope' ? 403 : 401); header('WWW-Authenticate: Bearer error="invalid_token"'); echo json_encode(['error' => $e->reason]); exit; } // Map the Sassly account to the local user exactly like web logins do (sub only; no email linking here). $st = sassly_app_pdo()->prepare('SELECT * FROM users WHERE sassly_sub = ? AND is_active = 1'); // ADAPT $st->execute([$claims['sub']]); $user = $st->fetch(PDO::FETCH_ASSOC); if ($user === false) { http_response_code(403); echo json_encode(['error' => 'not_registered']); exit; } echo json_encode(['ok' => true, 'user_id' => $user['id']]);