West Ham had held a two-goal lead through Cheikhou Kouyate and Diafra Sakho with 10 minutes remaining but Danny Rose’s scuffed shot set up a grandstand finish and then Kane – brought down by Alex Song – struck at the second attempt, six minutes into time added on.
Tottenham, who have earned 16 points from losing positions this season, remain three points off the top four in seventh, while the visitors sit a place back after being denied what would have been a first victory in four Premier League games.
Kane – now with 24 goals to his name this season – was recalled alongside Moussa Dembele and Ryan Mason after starting the midweek draw against Fiorentina on the bench, boss Mauricio Pochettino keen to keep legs fresh for a gruelling schedule that includes next weekend’s Capital One Cup final.
The home side started the game brightly with Nabil Bentaleb recording the first shot on target in the eighth minute, Adrian pushing the ball around his right-hand post.
Kane followed that up moments later when he tried to cheekily chip the West Ham keeper but failed to get a proper strike on the ball.
Kouyate gave Sam Allardyce’s men the lead against the run of play in the 22nd minute. A good run down the left saw Aaron Cresswell deliver a pinpoint cross into the box and the midfielder outjumped Eric Dier and Jan Vertonghen to head home.
Cresswell was causing problems again six minutes later but this time Spurs were alert to the danger and cleared the ball.
Spurs struggled to create any real chances in the first-half and their passing looked disjointed as time went on.
Enner Valencia should have doubled the visitors’ lead just before the hour when he beat Kyle Walker for pace before unleashing a shot from just outside the box, but Dier and Vertonghen were there to block it with their bodies and keep the score at 1-0.
West Ham finally increased their lead two minutes after the hour as Sakho got his first away goal since October 18. The forward started the move when his cross-shot bounced across the box and Mark Noble – on hand to pick up the loose ball – allowed Sakho to knock it past Hugo Lloris at the near post.
That appeared to the belated impetus that Spurs needed as Kane had a goal ruled out for offside, before Adrian saved low to his left from substitute Christian Eriksen’s dipping free-kick.
Nine minutes from time the assured Adrian made his first mistake of the game as he punched Erik Lamela’s shot away but mistimed his jump, allowing Rose’s effort to sneak in.
Allardyce fumed at lengthy stoppage-time as Spurs continued to attack and with seconds left, Kane – running into the box – was caught by Alex Song.
The referee pointed to the spot and when Adrian parried his spot-kick, the in-form striker was alert enough to send the rebound home.
Tottenham: Lloris (7), Walker (6), Dier (6), Vertonghen (7), Rose (7), Mason (7), Bentaleb (6), Townsend (6), Dembele (6), Lamela (6), Kane (7).
Used subs: Soldado (6), Chadli (6), Eriksen (7)
West Ham: Adrian (7), Jenkinson (7), Reid (6), Tomkins (6), Cresswell (8), Noble (7), Song (6), Kouyate (7), Downing (6), Valencia (7), Sakho (7).
Used subs: Jarvis (5), Collins (5), Cole (5)
Man of the match: Aaron Cresswell