Я разрабатываю веб-сайт, доступ к которому осуществляется в основном через приложение, и я хочу использовать OAuth2 для регистрации и аутентификации пользователя. Поскольку это приложение для Android, я начну использовать материал Google OAuth2, поскольку он обеспечивает достойный интерфейс для Android.
Google заявляет, что "Вы можете использовать систему проверки подлинности Google как способ аутсорсинга аутентификации пользователей для своего приложения. Это может устранить необходимость создания, поддержки, и защитить имя пользователя и пароль." , что и я хочу сделать. Однако, когда я просматриваю все их примеры и еще много чего, я могу только найти материал о том, что веб-сайт или приложение аутентифицируют пользователя в отношении сервисов Google.
И действительно, когда я отправляюсь регистрировать свое приложение ( "клиент" ) с Google OAuth2, есть варианты для клиентов веб-сайта и "установленных" клиентов (т.е. для мобильного приложения), но не для обоих. Я могу создать двух отдельных клиентов, но я прочитал проект OAuth2, и я думаю, что будет проблема, о которой я сейчас расскажу.
Вот как я это сделал:
- Пользователь запрашивает MyApp для доступа к своим личным данным.
- Приложение использует класс Android
AccountManager
для запроса токена доступа для API Google. - Android говорит пользователю: "Приложение MyApp хочет получить доступ к вашей базовой информации в Google. Это нормально?"
- Пользователь говорит "да".
-
AccountManager
подключается к серверу Google OAuth2, используя учетные данные, хранящиеся на телефоне, и запрашивает токен доступа. - Возвращается токен доступа (который следует за зелеными линиями).
-
AccountManager
возвращает токен доступа в MyApp. - MyApp отправляет запрос на MySite для личных данных пользователя, включая токен доступа.
- MySite необходимо проверить пользователя, используя токен доступа. Он проверяет токен как описано здесь, с Google - "Google, этот токен действителен?".
- Теперь я хочу, чтобы Google сказал: "Да, тот, кто дал это вам, действительно тот пользователь.", но то, что я думаю, действительно произойдет (на основе проекта OAuth2 и документации Google), заключается в том, что он будет скажем, "Нет, этот токен действителен только для MyApp, а вы MySite. GTFO!".
Итак, как мне это сделать? И ПОЖАЛУЙСТА не говорите "Использовать OpenID" или "Не использовать OAuth2" или другие подобные бесполезные ответы. О, и я действительно хотел бы использовать приятный пользовательский интерфейс AccountManager
, а не crappy popup WebView
s
Изменить
Предварительный ответ (я отчитаюсь, если это сработает!) от Николая - это то, что он действительно должен работать, а серверам Google будет все равно, откуда появился токен доступа. Кажется немного небезопасным для меня, но я увижу, если это сработает!
Update
Я реализовал этот шаблон с Facebook вместо Google, и он полностью работает. Сервер OAuth2 не заботится о том, откуда появился токен доступа. По крайней мере, Facebook этого не делает, поэтому я полагаю, что Google тоже не работает.
В свете этого очень плохой идеей хранить токены доступа! Но мы также не хотим, чтобы нажимать на серверы Facebook/Google, чтобы проверять аутентификацию для каждого запроса, так как это замедлит все. Вероятно, лучше всего добавить дополнительный cookie файл проверки подлинности для вашего сайта, который вы раздаете, когда их токен доступа проверен, но более простой способ - просто обработать токен доступа, как пароль, и сохранить его. Вам не нужно его солить, поскольку токены доступа действительно очень длинные. Таким образом, вышеприведенные шаги выглядят примерно так:
9. MySite необходимо проверить пользователя, используя токен доступа. Сначала он проверяет свой кеш с хэшированными действительными токенами доступа. Если хеш маркера найден там, он знает, что пользователь аутентифицирован. В противном случае он проверяет с помощью Google как описано здесь, с Google - "Google, этот токен действителен?".
10. Если Google говорит, что токен доступа неверен, мы указываем пользователю GTFO. В противном случае Google говорит "Да, это действительный пользователь", и мы затем проверяем нашу зарегистрированную базу данных пользователей. Если это имя пользователя Google (или идентификатор Facebook, если используется Facebook) не найдено, мы можем создать нового пользователя. Затем мы кэшируем хешированное значение токена доступа.