Плодить модели по числу OAuth-провайдеров смысла нет. Обычно, как я понимаю, SSO реализуется путем поиска в таблице юзера с таким емейлом. Таким образом, юзер может логиниться и регаться через что угодно, если указан один и тот же адрес. Достаточно поля для email и пароля. Можно по желанию добавить поля типа facebookId, twitterId и т.п., и еще какой-то опциональной инфой, которую можно вытащить. Я так делал и это работает. Если у вас Postgre, то неструктурированную/опциональную инфу можно класть в ячейку типа JSON.
С теми провайдерами, которые не отдают почту, сложнее. С точки зрения UI это работает так: в личном кабинете есть кнопочка типа «привязать аккаунт Steam», по ее нажатию юзер редиректится на стимовскую авторизацию. Теперь наша задача связать нашего юзера, с известным емейлом, с таким-то айдишником, который отдал Steam — сессии нам помогут.