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

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

Google заявляет, что& quot; Вы можете использовать систему аутентификации Google в качестве способа аутсорсинга аутентификации пользователя для вашего приложения. Это может устранить необходимость создавать, поддерживать и защищать хранилище имен пользователей и паролей. & Quot; что я и хочу сделатьHowever когда я просматриваю все их примеры и еще много чего, я могу только найти материал о наличии веб-сайтаor приложение аутентифицирует пользователя с помощью сервисов Google.

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

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

OAuth2 flow diagram

User asks MyApp to access his private data. App uses Android's AccountManager class to request an access token for Google's APIs. Android says to user "The app 'MyApp' wants access to your Basic Information on Google. Is this ok?" User says yes. AccountManager connects to Google's OAuth2 server using the credentials stored on the phone, and asks for an access token. Access token (which follows the green lines) is returned. AccountManager returns the access token to MyApp. MyApp sends a request to MySite for the user's private data, including the access token. MySite needs to verify the user, using the access token. It validates the token as described here, with Google - "Google, is this token valid?". Now, what I want to happen is that Google says "Yes, whoever gave it to you is indeed that user.", but what I think will actually happen (based on the OAuth2 draft and Google's documentation) is that it will say "No way! That token is only valid for MyApp, and you're MySite. GTFO!".

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

Edit

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

Update

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

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

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

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

Ответы на вопрос(6)

Ваш ответ на вопрос