The Vikings (8-6), completing a sweep of the season series with Detroit, took a 24-16 lead on Johnson's 30-yard touchdown pass to Cris Carter with 4:56 to play.
The Lions (5-9) answered 2 1/2 minutes later with a two-yard touchdown run by Barry Sanders, capping a 71-yard drive in four plays. But Scott Mitchell's pass to Johnnie Morton on the two-point conversion effort was knocked away by strong safety Robert Griffith at the goal line.
Carter then recovered Detroit's onside kick, and the Vikings ran out the clock with two first downs to pull even with Washington and Philadelphia in the NFC wild-card race. One of the three spots definitely will be filled by San Francisco or Carolina.
Johnson, who has started the Vikings' last five games, completed 19 of 29 passes for 195 yards against the Lions.
"We've had confidence in Brad since the first time he came in," said Jake Reed, who had three receptions for 32 yards, including a 13-yard touchdown catch. "But now he knows that he can play in this league, and we know that he can win."
Mitchell completed 21 of 31 passes for 250 yards and two touchdowns.
Sanders, who moved up to No. 7 on the NFL's career rushing chart, gained 134 yards in 20 carries. With 11,472 career yards, Sanders is only 16 shy of Kansas City's Marcus Allen, who plays tonight against the Oakland Raiders.
The Vikings were nearly flawless in the first half, scoring on their first three possessions. Leroy Hoard carried 17 times for 66 yards.
Johnson took advantage of Detroit's loose coverage, completing short passes underneath. As a result, the Vikings had drives of 65, 62 and 80 yards for a 17-10 halftime lead.