false, 'ERROR' => 'missing_fields']); } $row = queryOne( "SELECT ID, FirstName FROM Users WHERE (EmailAddress = ? OR ContactNumber = ?) AND Password = ? AND IsEmailVerified = 1 AND IsContactVerified > 0 LIMIT 1", [$username, $username, md5($password)] ); if (!$row) { apiAbort(['OK' => false, 'ERROR' => 'bad_credentials']); } $token = generateSecureToken(); queryTimed( "INSERT INTO UserTokens (UserID, Token) VALUES (?, ?)", [$row['ID'], $token] ); jsonResponse([ 'OK' => true, 'ERROR' => '', 'UserID' => (int) $row['ID'], 'FirstName' => $row['FirstName'], 'Token' => $token, ]);