A goal each from Dusan Vlahovic and Martin Caceres on either side of an own goal from Alex Sandro helped secure La Viola their first top-flight away win at Juventus in 12 years.
Juan Cuadrado was also sent off for the home side in the 18th minute for a rash challenge on Gaetano Castrovilli. It left the Bianconeri to play with a numerical disadvantage for much of the game.
The defeat now leaves Andrea Pirlo's men seven points behind runaway leaders AC Milan heading into the Christmas break. Here are the player ratings for Juventus:
Juventus Player Ratings vs. Fiorentina
Wojciech Szczesny - 6/10
You've got to feel for the Pole. He was let down by his Juventus defense tonight and conceded three goals which he could've done nothing about.
Juan Cuadrado - 4/10
He's been so crucial to Juventus this season, but Cuadrado's brazenness reared its head again, getting sent off after just 18 minutes for a studs-up tackle on Castrovilli. Not the best way to commemorate your 200th appearance.
Matthijs De Ligt - 6/10
He was outpaced by Vlahovic for the opening goal and continued to look unsettled thereafter. However, the Dutchman won six aerial duels and made five clearances, both of which were the highest in the game.
Leonardo Bonucci - 5/10
One word - horrendous. The veteran Juventini had one of his worst-ever games for the club. He looked uncharacteristically nervous at the back and left too many gaps for Fiorentina to exploit.
Alex Sandro - 6/10
What a shocker from Sandro, who arguably had one of his poorest outings this year. He looked shaky on and off the ball, while he also scored the own goal which effectively killed the contest for Juventus.
Federico Chiesa - 6.5/10
After a quiet first half, Chiesa showed signs of life in the second, but not enough to help Juventus turn the tide.
Weston McKennie - 6/10
A poor game from McKennie tonight as he was run over in the midfield by Fiorentina. Laying two key passes were the only highlight of his performance.
Rodrigo Bentancur - 6/10
The Uruguayan was anonymous once again and failed to control the midfield.
Aaron Ramsey - N/A
He was sacrificed after Cuadrado's sending off as the Welshman was taken off for Danilo in a tactical switch. However, he made his disappointment known, kicking a bottle on his way.
Alvaro Morata - 5/10
Morata went off the boil again, failing to offer any real threat during the opening stanza, which explains why he was taken off at the break for Bernardeschi.
Cristiano Ronaldo - 7/10
The best Juventus player even without scoring, Ronaldo tried his damnedest all night. He tested the visitors with some rasping shots, while also helping the side with chance creation. A goal would've been a cherry on the cake.
Danilo - 6/10
He came on to fill in for the red-carded Cuadrado but couldn't really impact the match.
Dejan Kulusevski - 5/10
The Swede barely even touched the ball for Juventus after coming on for the final quarter of the match.
Federico Bernardeschi - 6.5/10
Replacing the ineffective Morata, the former Fiorentina man showed a great eagerness and even troubled the visitors with his relentless running.
Gianluca Frabotta - N/A
The 21-year old was subbed to just see off the final few seconds of the match.Published 23 Dec 2020, 06:12 IST