Jeremy Lamb had 19 points, including a key 3-pointer with 1:38 left for the Western Conference-leading Thunder, who have won 14 of their last 16 games.
Nicolas Batum had 18 points for Portland, which has lost five of seven and appears tired as the league approaches the All-Star break. Robin Lopez had 17 points and 14 rebounds.
Portland led by as many as 13 points in the first half and held a 55-45 advantage at the break, but the Thunder kept chipping away and the teams went into the fourth quarter tied at 80.
Derek Fisher hit a 3-pointer and Lamb made a layup to put the Thunder up 85-84. Portland reclaimed the lead on rookie CJ McCollum's running shot, but Durant re-tied it at 91 with a long hook.
The teams wrestled for the lead until Lamb's 3-pointer gave the Thunder a 96-95 advantage. Damian Lillard missed a 3-pointer for Portland with 45.9 seconds left.
Portland got the ball with 12.3 seconds left after officials reviewed an out-of-bounds call, but LaMarcus Aldridge's mid-range jumper with 2 seconds left was off and Reggie Jackson hit free throws for the final margin.
It was the fourth meeting between the teams. Portland won two of the first three, but the Thunder won the last 105-97 in Oklahoma City last month. Durant paced the Thunder with 42 points.
Overall against the Blazers this season, Durant was averaging 38.7 points a game. In the previous games against the Thunder this season, Aldridge was averaging 30.7 points and 14.3 rebounds.
Aldridge was a game-time decision because of soreness, but he started and finished with 12 points and 12 rebounds. The Blazers are the only team that has started the same five players in all of their games this season.
Portland jumped out to a quick 18-6 lead, but the Blazers were hurt late in the opening quarter when reserve forward Joel Freeland's right knee buckled underneath him and he had to be helped off the court. The extent of the injury was not immediately known, but the Blazers depend on the 6-foot-11 Brit to spell starting center Lopez.
The Thunder closed to 25-21 on Lamb's 12-foot jumper early in the second quarter. Portland held them off, but Lamb's dunk narrowed it to 34-32 and the Thunder finally pulled ahead 41-39 on Lamb's 3-pointer.
The Blazers answered with a 16-4 run to take a 55-45 lead into halftime. Lillard and McCollum each had 13 points at the break to lead Portland.
The Thunder again threatened when Kendrick Perkins' jumper got them within 66-63. Serge Ibaka's jumper with 2:18 left in the third finally gave Oklahoma City a 76-75 lead, their first of the second half.
Jackson led the rally with 13 points after going 0-for-6 in the first half. The teams went into the fourth quarter tied at 80.
The Blazers were coming off a 2-2 road trip, including 117-110 victory over the Minnesota Timberwolves on Saturday. Following the loss to the Thunder, they were headed to Los Angeles for a game against the Clippers on Wednesday night before the All-Star break.
The Thunder were coming off a 112-100 victory over the New York Knicks, with Durant's 41 points leading the way.
NOTES: Portland was without guard Mo Williams, who had just returned from attending to a family matter. It was hoped that Williams could travel with the team to face the Clippers on Wednesday night. ... Aldridge and Lillard were presented with their All-Star jerseys before the game. ... Thunder guard Thabo Sefolosha appeared to injure his right hand in the first half, but he returned to start the second half with his hand taped. ... Freeland was scheduled for an MRI on his knee.