Аутентификация с помощью OAuth2 для приложения *и *веб-сайта

Я разрабатываю веб-сайт, доступ к которому в основном осуществляется через приложение, и я хочу использовать OAuth2 для регистрации и аутентификации пользователей. Поскольку это приложение для Android, я начну использовать OAuth2 от Google, так как он обеспечивает достойный пользовательский интерфейс на Android.

Google заявляет, что «Вы можете использовать систему аутентификации Google в качестве способа аутсорсинга аутентификации пользователей для вашего приложения. Это может устранить необходимость создавать, поддерживать и защищать хранилище имен пользователей и паролей». именно это я и хочу сделать. Однако, когда я просматриваю все их примеры и тому подобное, я могу найти информацию только о веб-сайте или приложении, аутентифицирующем пользователя в службах Google.

И действительно, когда я регистрирую свое приложение («клиент» )с помощью Google OAuth2, есть варианты для клиентов веб-сайтов и «установленных» клиентов (, т.е.мобильное приложение ), но не то и другое одновременно. Я могу создать два отдельных клиента, но я прочитал проект OAuth2 и думаю, что будет проблема, которую я сейчас объясню.

Вот как я себе это представлял:

OAuth2 flow diagram

  1. Пользователь просит MyApp получить доступ к его личным данным.
  2. Приложение использует класс Android AccountManagerдля запроса токена доступа к API Google.
  3. Android говорит пользователю: «Приложение MyApp хочет получить доступ к вашей базовой информации в Google. Это нормально?»
  4. Пользователь говорит да.
  5. AccountManagerподключается к серверу Google OAuth2, используя учетные данные, хранящиеся на телефоне, и запрашивает токен доступа.
  6. Токен доступа (, который следует за зелеными линиями ), возвращается.
  7. AccountManagerвозвращает токен доступа к MyApp.
  8. MyApp отправляет запрос на MySite для личных данных пользователя, включая токен доступа.
  9. MySite необходимо проверить пользователя, используя токен доступа. Он проверяет токен , как описано здесь , с помощью Google -«Google, этот токен действителен?».
  10. Теперь я хочу, чтобы Google сказал: «Да, тот, кто дал вам это, действительно является этим пользователем», но то, что я думаю, действительно произойдет (на основе проекта OAuth2 и документации Google )заключается в том, что он скажет: «Ни за что! Этот токен действителен только для MyApp, а вы — MySite. GTFO!».

Итак, как мне это сделать? И ПОЖАЛУЙСТА, не говорите «Используйте OpenID» или «Не используйте OAuth2» или другие подобные бесполезные ответы. О, и я действительно хотел бы продолжать использовать приятный AccountManagerпользовательский интерфейс, а не дрянные всплывающие окна WebViewс

Изменить

Предварительный ответ (Я отчитаюсь, если получится! )от Николая заключается в том, что это действительно должно работать, и серверам Google будет все равно, откуда взялся токен доступа. Мне это кажется немного небезопасным, но я посмотрю, сработает ли это!

Обновление

Я реализовал этот шаблон с Facebook вместо Google, и он полностью работает. Серверу OAuth2 все равно, откуда берется токен доступа. По крайней мере, в Facebook нет,поэтому я предполагаю, что Google тоже этого не делает.

В свете этого очень и очень плохая идея хранить токены доступа! Но мы также не хотим обращаться к серверам Facebook/Google для проверки аутентификации для каждого запроса, так как это замедлит работу. Вероятно, лучше всего добавить дополнительный файл cookie для проверки подлинности для вашего сайта, который вы раздаете, когда их токен доступа проверяется, но более простой способ — просто рассматривать токен доступа как пароль и хранить его хэш. Вам также не нужно солить его, поскольку токены доступа действительно очень длинные. Таким образом, приведенные выше шаги становятся чем-то вроде:

9. MySite должен проверить пользователя, используя токен доступа. Сначала он проверяет свой кэш хешированных действительных токенов доступа. Если там найден хэш токена, он знает, что пользователь аутентифицирован. В противном случае он проверяет с помощью Google , как описано здесь , с помощью Google -«Google, этот токен действителен?».

10. Если Google говорит, что токен доступа недействителен, мы сообщаем пользователю GTFO. В противном случае Google говорит «Да, это действительный пользователь», и мы затем проверяем нашу базу данных зарегистрированных пользователей. Если это имя пользователя Google (или идентификатор Facebook при использовании Facebook )не найдено, мы можем создать нового пользователя. Затем мы кэшируем хешированное значение токена доступа.

63
задан j0k 15 November 2012 в 13:02
поделиться