Авторизация через соц. сети с помощью sdk небезопасна (android). Как должен выглядеть алгоритм на сервере?
Я пишу android-приложение, клиент для сайта. Остановился на авторизации, стоит серьезный вопрос безопасности. Итак, для начала расскажу как работает на этом сайте авторизация/регистрация через соц. сети (подправьте если тут допущены ошибки). Сначала пользователь делает запрос на my-site.com/oauth_vk, далее сервер шлет запрос с clientID, clientSecret и callbackURL на сервер соц.сети, при успешной авторизации когда пользователь подтвердил разрешение использовать его данные, мы получаем его данные от сервера соц. сети. Среди этих данных есть его ID в соц. сети, по нему мы делаем запрос к бд и понимаем нужно нам зарегать его или просто авторизовать, но в любом случае мы из нашей бд достаем его ID на нашем сайте и хэш для того чтоб записать в куки (для дальнейшей аутентификации по ним).
Этот процесс с моей точки зрения является безопасным, т.к. clientID, clientSecret хранятся на сервере, и подделать запрос не возможно.
Но, ситуация с android-приложением другая. Я написал часть, когда мы уже получили данные юзера из соц. сети в приложении. Далее, надо бы делать запрос на сервер с ID юзера из соц. сети чтоб достать из нашей бд его ID на нашем сайте и хэш для выполнения дальнейших запросов. Здесь я остановился, т.к. любой кто декомпилирует приложение, увидит как получить ID и хэш на сайте используя ID юзера в соц. сети (его не трудно узнать любому), и может таким образом авторизовываться от имени кого угодно. (А так же, он узнает app_id соц. сети).
Это критическая проблема, пока не пойму что делать дальше. Подскажите, как все же правильно реализовать авторизацию на сервере используя android-sdk, чтобы не было таких дыр в безопасности.
мей би... сделать так, чтобы все сравнения (ID) проходили не в андроид приложении? а на самом сайте? И вообще, всю процедуру сделать так, чтобы андроид передаёт только специальные запросы (например в формате json) на сайт, а на самом сайте идёт всё остальное (проверка, подключение и прочие алгоритмы)? В приложении единственное, что должно - это "методика" (например API) общения с сайтом (без каких-либо хранений подключений к БД). И в зависимости от полученных результатов сайт - передаёт те или иные сообщения(ответы) в приложение.
Тут непонятно, что именно android-приложение будет передавать на сайт. Распишите подробнее, с того этапа на котором я остановился, когда получаем все данные юзера из соц. сети, что с ними делать дальше, как на сервере безопасно авторизовать его?
Al:
1) после того, как пользователь подтвердит в социальной сети, что он доверяет вашему приложению/сайту - парсим(получаем) его ID. Пускай это ID получите в андроид приложении.
2) этот ID отправляется get/post запросом из вашего приложения на ваш сайт (специальная страница). + можно в запрос добавить ещё пару вещей: например дополнительные поля (не важно как зашифрованные) которые будут проверяться на сайте. (это "праздношатающих" остановит)
3) ваш сайт принимает get/post запрос. Если он корректен: идёт подключение к БД, получение данных, сравнивание.
4) Если всё ок - возвращает данные в андроид приложение, если не всё ок - ошибку.
т.е. суть этой методики в том, андроид приложение в себе ничего не хранит (данные), оно лишь "оболочка" для них (или инструмент). Взламывай/не взламывай - ничего кроме функционала не получишь. Самих данных нет. А данные даёт только сервер(сайт).
Tom Nolane: так здесь тоже-самое. Так можно узнать ID юзера в соц. сет, отправить его на сайт (специальная страница) и получить доступ к аккаунту юзера уже на нашем сайте.
Я думаю, можно ли как то с помощью accessToken на сервере доставать данные юзера? Ну всмылсе так, вот мы получили данные юзера из соц сети в приложении, вмести с ними и accessToken. Теперь не ID юзера соц сети слать на спец страницу на сервере, а accessToken, и по этому accessToken'y ориентироваться - авторизовать на серевере или нет. Если можно, то как? Что нужно будет делать с эти accessToken'ом на сервере?
Al: accessToken выдаётся на время - хранить не вариант. На многих сервисах используют следующее: доп. используют логин/пароль от сайта либо делать привязку (как я сделал, правда не для андроид приложения) - вместе с id отправляется серийный номер материнской карты и номер сетевухи (для андроид можно IMEI к примеру), который хранится в БД при регистрации. Брать какие-либо данные (по мимо в ID) с ВК не вариант - это не улучшит безопасность. Соответственно, нужно что-то дополнительное (то, что выше написал)
т.е. что-то "статическое".
Логин && пароль от сайта (при регистрации) - позволит юзать приложение на любых устройствах
данные IMEI позволит без логина/пароля, но тогда пользователь сможет юзать только на одном устройстве
Tom Nolane: вот, я предлагаю вариант такой, с accessToken. Значит еще раз поэтапно.
1. Юзер разрешил доступ в android-приложении и vk вернул ему его данные соц сети и accessToken
2. Android-приложение шлет данные юзера и accessToken на сервер
3. Сервер проверяет - валидный ли accessToken запросом к vk. Если да, то можно авторизовать юзера используя данные что пришли вместе с accessToken'ом, и после авторизации уже выдать клиенту ID и хэш по котором будет делать запросы к сайту.
Это будет правильно? И accessToken хранить нигде не нужно, он нужен только один раз.
1. Юзер разрешил доступ в android-приложении и vk вернул ему его данные соц сети и accessToken
Да. Примечание: accessToken - имеет "срок годности". Примечание2: зная accessToken можно выполнять от имени пользователя (например вам) - какие-нибудь действия в вконтакте.....
2. Android-приложение шлет данные юзера и accessToken на сервер
допустим
3. Сервер проверяет - валидный ли accessToken запросом к vk.
??? это как? сервер также пытается авторизоваться от имени юзера в ВК, потом получить accessToken и сравнить с accessToken-юзера??? Так они разные будут!! Точнее не получиться так, перед этим вылетит окошко об авторизации на сайте ВК, только после этого будет идти подключение/запросы в API... (через oauth2 авторизацию)
чтобы лучше понять о чём вы говорите - скажите хотя бы в двух словах, что делает приложение??? Оно возвращает данные с ВК(сообщения, новости, музыку, видео, лайки и пр.) или что-то ваше с сайта и ВК используется только для авторизации????
Al: я предлагаю то, что описал выше:
либо доп. нужен ввод логина и пароля для сайта(и далее сохранение в кукисах)
либо передавать какие-нибудь другие данные, которые нельзя получить(узнать) в ВК по юзеру.
Либо чтобы вся процедура oauth2 проходила на сайте (через браузер) и тогда в этом случае подмена id не получиться
Узнать айди приложения может каждый, зайдя в настройки своих приложений. Критической дыркой в безопасности здесь является то, что пользователь делитсф своими данными с вами.