The visitors withheld a barrage of pressure as they sought to protect their slender lead following Ryan Gauld's first senior goal, but sloppy marking in added time cost them a place in the top six, although a draw was the least that Saints deserved.
Murray Davidson headed inches over in a scrappy opening, but it was United who struck first on 24 minutes when Gauld raced onto Mark Millar's feed and held his nerve to slot past the onrushing Alan Mannus.
Dave Mackay and Craig both missed the target with free-kicks, Steven MacLean's deft backheel deflected onto the post as United held out until the break.
Gregory Tade drilled a half-volley wide early in the second half, and Michael Gardyne curled over in a rare United attack.
Radoslaw Czierzniak then pulled off a smart save to tip Craig's long-range drive wide, and Davidson's header was blocked on the line by Barry Douglas as Saints piled on the pressure.
MacLean beat Cierzniak with a looping header only to be denied by the upright, and the visitors had to play the last 12 minutes a man short after Stuart Armstrong picked up a second booking for diving in the box.
Czierzniak again kept his side in front with another outstanding save from Davidson, and MacLean pounced on a mistake from John Souttar and raced into the box before blazing over with only the keeper to beat.
But the home side were rewarded for their dominance in added time as Mehdi Abeid's corner picked out an unmarked Craig to power home an assertive header from six yards that guaranteed St Johnstone a top-six berth.