Как зайти через ВК и не остаться без штанов
В общем случае (а таковых 99.9%) — да. Дальше лучше не читать, чтобы спать спокойно.
ВАЖНО убедиться, что при авторизации в адресной строке vk.com
Как оно внутри работает?⌗
Пусть Петя заходит на новостной сайт, скажем, Тинькофф Журнал. ТЖ ничего про Петю не знает, кроме IP-адреса. Но предложит узнать через кнопку “Войти через ВКонтакте”. В браузере откроется новое окошко, которое отправит Петю на сайт ВК. ВКонтакте работает по HTTPS и Петя может чутка расслабиться. Браузеры умные и не отдадут данные окошка ВК какому-то там ТЖ.
Выглядит окошко вот так:
Обратите внимание на знак замочка в левом верхнем углу. Он подтверждает, что vk настоящий, а не подменный, выдан V Kontakte LLC
Это только кажется, что только два поля. Скрытых там целая куча, они понадобятся для объяснения позже. После нажатия «Разрешить» в ВК отправляется такая информация:
POST /authorize
HOST oauth.vk.com
client_id = 123456
redirect_uri = http://tjournal.ru/auth/vk
login = petya
password = $миллион_баксов_на_счету$
Здесь, client_id — это уникальный идентификатор ТЖ, login и password — учетные данные Пети. Если Петя правильно ввёл логин и пароль от своего аккаунта ВК, то процедуру входа считаем успешной. Всё дальнейшее общение между ТЖ и ВК будет происходить вообще без участия Пети и его браузера. ВК вытащит из сообщения redirect_uri адрес ТЖ и отправит на него специально сгенерированный под нашего Петю шифр YGFHJNKLMVGFQTGH.
С этого момента у ТЖ будет ровно час, чтобы с помощью шифра YGFHJNKLMVGFQTGH обратиться в ВК напрямую, без Пети, чтобы получить другой шифр, который называется API access_token. Вот он:
{
"access_token": "SlAV32hkKG",
"token_type": "bearer",
"expires_in": 3600,
"refresh_token": "8xLOxBtZp8",
}
Этот токен даётся на короткое время (3600 секунд) и работает только для Пети. Теперь ТЖ должен прикладывать access_token к ЛЮБОМУ запросу к ВКонтакте, если хочет что-то узнать про Петю или его друзей. Если ТЖ попробует с использованием этого токена узнать имя Тани, то ВК вернёт ему ошибку. Более того, если ТЖ не захочет плясать под дудку ВК и работать без шифрования, то его тоже ждёт неудача.
Важно отметить, что пароль мы вводили в ВК, а не в ТЖ. У ТЖ нет никаких ваших данных. Всё, что у него есть на руках, лишь на короткое время. Как только оно истечет, ТЖ придётся заново отправлять Петю на страницу аутентификации ВК. По токену нельзя получить логин и пароль ВК.
Схематично всё взаимодействие:
НО ВЕДЬ⌗
Внимательный читатель скажет:
Но ведь ТЖ может сделать такую же формочку, как у ВК и пусть пользователь вводит логин и пароль ВК прямо на сайте ТЖ.
Тогда у ТЖ будут данные нашего Пети и сможет ТЖ нашему Пете наломать дров в его аккаунте. Девок хороших из друзей удалить и деньги со счёта снять.
Чтобы такого бардака не было, в форму аутентификации зашивают специальные скрытые поля, в которых записан шифр. ВК при получении запросов проверяет этот шифр. И если ВК никогда такой шифр не выдавал, то ответит ошибкой на запрос.
ВАЖНО убедиться, что при авторизации в адресной строке vk.com
А как насчет публичного WiFi?⌗
Сниферы позволят перехватить данные Пети только, когда сайт работает без шифрования. Сейчас все сайты, которые взаимодействуют с аутентификацией VK/Google/Facebook обязаны использовать шифрование. Так положено по стандарту OAuth 2.0. Как вообще возможно перехватить токен или данные ВК?
Такое возможно через атаки Man in the middle. Это когда у пользователя установлен рут, то есть физический доступ к телефону/компьютеру, подменены сертификаты и где-то в пределах сети работает злоумышленник. Такую штуку сложно провернуть и ради рядовых пользователей заморачиваться не будут. А если есть физический доступ к телефону, там и так уже делов можно натворить.
Итоги⌗
На сайтах, где есть авторизация через соцсети, можно не вводить пароль. И не запоминать, чтобы не забыть.
В случае удаления или изменения вашей учетки ВК все токены становятся недействительными.
По токену можно получить только те данные, которые вы разрешаете передать стороннему сервису.
Удобно!