Dusan Vlahovic opened the scoring for the Gigliati, who dominated the first half, while Alvaro Morata equalised with an excellent strike for the Bianconeri, who had the better of the play in the second.
Wojciech Szczesny was active in the first half, saving a shot from Nikola Milenkovic, while a deflected Erick Pulgar effort bounced off the post and into the hands of the Juve goalkeeper.
There were calls for a penalty when Vlahovic was impeded by Bonucci but referee Davide Massa waved play on. Bianconeri veteran Giorgio Chiellini was called upon when Szczesny failed to collect a Ribery flick pass.
Juventus midfielder Adrien Rabiot handballed in the penalty area but Massa didn’t blow his whistle immediately. After a VAR review, the penalty was given and Vlahovic chipped the ball over Szczesny in the 30th minute.
Gigliati defender German Pezzella had pushed Matthijs de Ligt in the penalty area, but nothing was awarded, then Aaron Ramsey squandered a great chance to equalise as he directed the ball wide with his right foot.
Morata replaced an anonymous Paulo Morata at half-time and the substitution immediately paid off. The Juventus striker ran onto a Juan Cuadrado pass, beat Pezzella, and curled the ball into the left side of the net.
A Pulgar free-kick was deflected for a corner and another long-range effort from the Fiorentina midfielder was saved by Szczesny soon after.
Chiellini came close to giving Juve the lead but his header was cleared away and Vlahovic could have got a second but he shot straight at Szczesny.
Juventus dominated possession for the remainder of the game but Cristiano Ronaldo failing to connect with a header was the closest they got.
The Bianconeri go to third in Serie A with 66 points after 33 games while Fiorentina are 14th with 34.