Bain began his footballing career at Aberdeen's academy. Shortly after his promotion to the first team, he was loaned to Elgin City, where he made his professional debut.[3][4] In May 2011, Bain was released by Aberdeen.
Alloa Athletic
In June 2011, Bain signed a one-year contract with Scottish Third Division side Alloa Athletic.[5] He established himself as a first-team regular, and helped the club to consecutive promotions in his first two seasons.
Dundee
On 29 May 2014, Bain signed a three-year contract with Dundee.[6] He made his debut on 26 August 2014, in a 4–0 win against Raith Rovers in the Scottish League Cup.[7] Bain made a first league appearance for Dundee in October 2014, when Kyle Letheren was injured during a pre-match exercise.[8] On 6 April 2015, he signed a new contract with Dundee, extending his deal with the club until 2018.[9] Bain was dropped from the Dundee first team squad by manager Neil McCann in November 2017, for unspecified disciplinary reasons.[10][11]
Hibernian (loan)
On 1 January 2018, it was announced that Bain had joined Hibernian on loan until the end of the 2017–18 season.[12][13][14] Hibernian cancelled the loan on 31 January, which allowed Bain to join Celtic instead.[15]
Celtic
Bain joined Celtic on 31 January 2018, initially on loan from Dundee.[15] Celtic needed another goalkeeper to provide competition for Dorus de Vries, following an injury to Craig Gordon.[15] Bain made his first appearance for Celtic on 11 March, in a 3–2 win against Rangers, after de Vries suffered an injury in training.[16]
With his contract with Dundee due to expire at the end of the 2017–18 season, Bain signed a four-year contract with Celtic in May 2018.[17] Bain played regularly for Celtic after the January 2019 winter break.[18]
In October 2019, he signed a new one-year contract with the club.[19][needs update]
Bain was recalled to the squad in May 2018 for friendly matches against Peru and Mexico, after McGregor again dropped out through injury.[21] He made his first full international appearance on 2 June 2018, in a 1–0 defeat against Mexico.[22] His second cap came in a 3–0 defeat against Kazakhstan in Euro 2020 qualification.[23]
^Includes one appearance not recorded on Soccerway or Soccerbase, as Kyle Letheren was injured during pre-match exercises. Maclean, Rob (18 October 2014). "MOTHERWELL 1-3 DUNDEE". BBC Sport. Retrieved 1 January 2018.