Leonardo Spinazzola scored at both ends in a frantic match, but it was Amadou Diawara’s late goal that sealed Roma’s win and a disappointing result for Fiorentina.
Pau Lopez was put to the test twice by Dusan Vlahovic, but only with power and no precision, while Bartlomiej Dragowski got away with a clumsy move when colliding with Igor to clear a long shot.
Roma’s first genuine chance came in the first half stoppages when Dragowski saved a Lorenzo Pellegrini long-range shot.
After Gianluca Mancini dinked up a pass over the top for the wing-back, Leonardo Spinazzola broke the deadlock with a well-taken right-foot volley from 12 yards at the Stadio Franchi.
After being sent clear by Jordan Veretout and helped by the Spinazzola back-heel flick, Henrikh Mkhitaryan should have made it 2-0, but he stumbled at the crucial moment.
Ribery twisted and turned in the box before Mancini charged down his shot, while Dragowski deflected Amadou Diawara’s scorcher over the bar.
As Rick Karsdorp rolled across from the right, the offside flag was up, and Diawara turned in reasonably undisturbed from eight yards.
However, VAR determined that Nikola Milenkovic kept him in play, and the goal was upheld.