Почему я не могу просто положиться на OAuth?
С точки зрения поставщиков услуг, OAuth - это средство контроля доступа сторонних приложений к бизнес-логике. Конечный пользователь не обязан выдавать свой пароль стороннему приложению, и доступ можно контролировать. Например, поставщик может ограничить доступ только к частям службы в течение ограниченного периода времени.
Если вы пишете стороннее приложение, вам не нужно иметь собственные «пользовательские» артефакты. Вы можете положиться на пользователей, которые аутентифицируют ваше приложение.
Вы могли бы потребовать, чтобы у этого пользователя была учетная запись с таким провайдером, как Facebook или Twitter, и самостоятельно не вводить какие-либо пароли.
(Вам, вероятно, нужен какой-то артефакт для представления пользователя, в этом случае он должен содержать информацию о том, как этот пользователь аутентифицирует ваше приложение, например, токен OAuth или URL-адрес OpenID).
Если я это сделаю, нужно ли мне что-нибудь хеш / соль, если я его сохраню? Я не храню
любые пароли, но как насчет токенов?
Просто чтобы уточнить, в OAuth токен обычно является и ключом, и секретом, и они необходимы в открытом тексте для подписи запросов (здесь есть различия в зависимости от того, какую версию OAuth вы используете). Таким образом, вы можете хранить их в зашифрованном виде, если они для вас обратимы.
Мне все еще нужно сохранять пользователей, чтобы они не входили в систему каждый раз (как в ОС) - могу ли я
как-нибудь использовать токен OAuth (сохранить? имеет ли смысл)?
Да, это имеет смысл, токен представляет доступ ваших приложений к данным конкретного пользователя. Сохраните токен, если хотите сохранить «сеанс» в живых.
Как реализовать выход из системы? Я не могу заставить их выйти из провайдера OAuth, и если я только удаляю файл cookie httpOnly / делаю их сеанс недействительным локально, достаточно ли этого? и вопросы безопасности?
Нет концепции "выхода" из OAUth, токен либо имеет срок действия, либо нет. Конечно, вы можете «выйти», просто выбрав забыть токен. В следующий раз вам придется повторить аутентификацию. Вы не можете заставить пользователей аннулировать токен доступа, если у провайдера нет API для этого.
Вы можете сохранить токен в файле cookie, но я бы использовал другие уникальные идентификаторы для сеанса, который вы хотите сохранить. Вы можете сохранить информацию о стороне токенов на сервере. Информация, которую вы храните в своем cookie-файле, позволяет получить нужный вам токен.
Как мне реализовать единый вход? Я не хочу, чтобы пользователь после одобрения снова нажимал «войти в систему с помощью Facebook / Twitter / Google». Я хочу, чтобы эффект был похож на SO (страница обновляется и «приветствует вас обратно». Каковы наилучшие методы для этого? Почему ТАК обновляет страницу (я предполагаю, что это связано с тем, что она должна быть на стороне клиента, но я не до конца понимаю, как это работает, чтобы даже знать, что спрашивать)
Если вы сохраните токен в базе данных, сохраните идентификатор для этого токена в хорошем безопасном файле cookie. Когда пользователь обращается к вашему сервису, используйте информацию из куки-файла, чтобы позвонить из вашего сервиса провайдеру и проверить, действителен ли токен. Если это так, то вы установили достаточное доверие, чтобы «войти» в систему пользователя в вашем приложении, не выполняя процедуру OAuth снова.
И как сторона, StackOverflow использует OpenID, а не OAuth для аутентификации пользователя. OAuth может использоваться для той же цели, но в основном это спецификация для авторизации приложения.
Я надеюсь, что это помогло, и не продавайте себя коротко. Этот сайт предназначен для публикации вопросов, а не для показа всезнающего.