Пишем модуль для авторизации в VK API / Хабр
На днях возникла необходимость сохранить все фотографии из своего фотоальбома ВКонтакте на жесткий диск. Естественно, вариант, с сохранением фотографий по одной, меня не устроил. Тут вспомнилось, что у ВКонтакте есть API. Пять минут чтения мануалов, и все нужные функции найдены. Единственная проблема – не существует нормального способа, для получения доступа к API. В документации сказано следующее:Процесс авторизации приложения состоит из 3-х шагов:На первый взгляд, набросать простенький портабельный скрипт не получится. Хотя, что мешает нам притвориться браузером?
- Открытие окна браузера для аутентификации пользователя на сайте ВКонтакте.
- Разрешение пользователем доступа к своим данным.
- Передача в приложение ключа access_token для доступа к API.
Для достижения наших целей, будем использовать только стандартные модули Python:
- urllib2
- cookielib
- HTMLParser
Создаем opener
Для того, чтобы прикинутся настоящим браузером, просто загружать нужные страницы недостаточно. Как минимум, нужно корректно обрабатывать cookies и редиректы. Для этого создаем opener, который будет делать всю работу за нас:opener = urllib2.build_opener( urllib2.HTTPCookieProcessor(cookielib.CookieJar()), urllib2.HTTPRedirectHandler())
Обращаемся к странице авторизации
response = opener.open( "http://oauth.vk.com/oauth/authorize?" + \ "redirect_uri=http://oauth.vk.com/blank.html&response_type=token&" + \ "client_id=%s&scope=%s&display=wap" % (client_id, ",".join(scope)) )Подробно про параметры обращения можно прочитать в документации. Здесь следует отметить, что мы будем использовать параметр
display
со значением wap
, т.к. в этом варианте странички практически отсутствует javascript. scope
представляет собой список названий прав, к которым мы хотим получить доступ.Парсим ответ
Посмотрим на код странички авторизации. Больше всего нас будет интересовать следующий участок:<form method="POST" action="https://login.vk.com/?act=login&soft=1&utf8=1"> <input type="hidden" name="q" value="1"> <input type="hidden" name="from_host" value="oauth.vk.com"> <input type="hidden" name="from_protocol" value="http"> <input type="hidden" name="ip_h" value="df5a3639f3cb32ecc1" /> <input type="hidden" name="to" value="aHR0cDovL29hdXRoLnZrLmNvbS9vYXV0aC9hdXRob3JpemU/Y2xpZW50X2lkPTI5NTE4NTcmcmVkaXJlY3RfdXJpPWJsYW5rLmh0bWwmcmVzcG9uc2VfdHlwZT10b2tlbiZzY29wZT00JnN0YXRlPSZkaXNwbGF5PXdhcA--"> <span>Телефон или e-mail:</span><br /> <input type="text" name="email"><br /> <span>Пароль:</span><br /> <input type="password" name="pass"> <div> <div> <input type="submit" value="Войти" /> </div> <a href="https://oauth.vk.com/grant_access?hash=95a8fc64a19d011436&client_id=2951857&settings=4&redirect_uri=blank.Для последующей отправки формы необходимо распарсить все input-ы (ы том числе и hidden), а также url, на который форма сабмитится. Пишем простенький парсер на основеhtml&cancel=1&state=&token_type=0"> <div> Отмена </div> </a> </form>
HTMLParser
:class FormParser(HTMLParser): def __init__(self): HTMLParser.__init__(self) self.url = None self.params = {} self.in_form = False self.form_parsed = False self.method = "GET" def handle_starttag(self, tag, attrs): tag = tag.lower() if tag == "form": if self.form_parsed: raise RuntimeError("Second form on page") if self.in_form: raise RuntimeError("Already in form") self.in_form = True if not self.in_form: return attrs = dict((name.lower(), value) for name, value in attrs) if tag == "form": self. url = attrs["action"] if "method" in attrs: self.method = attrs["method"] elif tag == "input" and "type" in attrs and "name" in attrs: if attrs["type"] in ["hidden", "text", "password"]: self.params[attrs["name"]] = attrs["value"] if "value" in attrs else "" def handle_endtag(self, tag): tag = tag.lower() if tag == "form": if not self.in_form: raise RuntimeError("Unexpected end of <form>") self.in_form = False self.form_parsed = True
Авторизируемся
Подставляем в параметры запроса email и пароль пользователя и отправляем форму:parser.params["email"] = email parser.params["pass"] = password response = opener.open(parser.url, urllib.urlencode(parser.params))
Разрешаем доступ
Следующим этапом, если пользователь этого еще не делал, нам надо дать приложению те права, которые мы запрашивали в параметре scope. Для этого нам будет предложена страничка с формой, на которой будут кнопки Allow и Deny. Парсим и отправляем форму методом, описаным выше.Получаем token и user_id
Если мы все сделали правильно, то нас в итоге перекинет на страничку с url видаhttp://oauth.vk.com/blank.html#access_token= 533bacf01e11f55b536a565b57531ad114461ae8736d6506a3&expires_in=86400&user_id=8492откуда несложными манипуляциями мы можем достать нужные нам
access_token
и user_id
.Пример использования модуля
Собственно, ради чего все и затевалось – скрипт для загрузки альбома:import vk_auth import json import urllib2 from urllib import urlencode import json import os import os.path import getpass import sys def call_api(method, params, token): if isinstance(params, list): params_list = [kv for kv in params] elif isinstance(params, dict): params_list = params.items() else: params_list = [params] params_list. append(("access_token", token)) url = "https://api.vk.com/method/%s?%s" % (method, urlencode(params_list)) return json.loads(urllib2.urlopen(url).read())["response"] def get_albums(user_id, token): return call_api("photos.getAlbums", ("uid", user_id), token) def get_photos_urls(user_id, album_id, token): photos_list = call_api("photos.get", [("uid", user_id), ("aid", album_id)], token) result = [] for photo in photos_list: #Choose photo with largest resolution if "src_xxbig" in photo: url = photo["src_xxbig"] elif "src_xbig" in photo: url = photo["src_xbig"] else: url = photo["src_big"] result.append(url) return result def save_photos(urls, directory): if not os.path.exists(directory): os.mkdir(directory) names_pattern = "%%0%dd.jpg" % len(str(len(urls))) for num, url in enumerate(urls): filename = os.path.join(directory, names_pattern % (num + 1)) print "Downloading %s" % filename open(filename, "w").и как оно выглядит в работе:write(urllib2.urlopen(url).read()) if len(sys.argv) != 2: print "Usage: %s destination" % sys.argv[0] sys.exit(1) directory = sys.argv[1] email = raw_input("Email: ") password = getpass.getpass() token, user_id = vk_auth.auth(email, password, "2951857", "photos") albums = get_albums(user_id, token) print "\n".join("%d. %s" % (num + 1, album["title"]) for num, album in enumerate(albums)) choise = -1 while choise not in xrange(len(albums)): choise = int(raw_input("Choose album number: ")) - 1 photos_urls = get_photos_urls(user_id, albums[choise]["aid"], token) save_photos(photos_urls, directory)
Заключение
Конечно этот модуль не подходит для использования в серьезных проектах, но для личных целей – вполне.Ссылка на GitHub.
Авторизация через ВК NestJS + React | Andrew Boev
4 min read·
Aug 3, 2020Привет! В этой статье я хочу рассказать как сделать авторизацию через ВК по способу Authorization code flow на примере NestJS + React.
Давайте за основу возьмем то, что авторизация через Вконтакте — это один из возможных способов входа, но кроме него существует классический по почте и паролю. Поэтому для начала давайте реализуем просто авторизацию по токену.
Авторизация по токену
Для тех кто незнаком с авторизацией по токену, я рекомендую прочитать тут.
Для упрощения примера мы не будем сохранять токены в БД и не будем делать механизм обновления токена.
Backend
Запросы принимают два ресурса /login /register. Первый авторизует, второй создает пользователя.
При успешной авторизации мы возвращаем объект пользователя вместе с токеном.
Пользователь выглядит следующим образом:
Так же нам понадобится ресурс /profile для получения данных о пользователе:
Frontend
Для хранения бизнес логики будем использовать MobX.
На фронте будет три маршрута:
- маршрут доступен всем (/)
Если пользователь авторизован, то меняется текст
- маршрут доступен всем (/signin)
- маршрут доступен после авторизации (/user)
Нам понадобится метод, который будет запрашивать данные пользователя с сервера:
После этого в лейауте, который будет использоваться на всех страницах, будем проверять есть ли у пользователя токен и если есть, то будем пытаться запросить профиль. Если у нас это не получается (например токен стал невалидным), то будем очищать токен и объект пользователя в сторе, а затем перекидывать его на страницу входа. Данные очищаются для того, чтобы при недействительном токене пользователя не редиректило на страницу входа.
После того как у нас настроена базовая авторизация можем присупить к авторизации через ВК.
Для того чтобы начать, необходимо зарегистрировать приложение во Вконтакте перейдя по ссылке https://vk.com/editapp?act=create
После регистрации вам будет доступен айди приложения (client_id) и защищенный ключ (client_secret).
Авторизация в целом выглядит следующим образом:
Authorization Code FlowЯ использую авторизацию по коду (Authorization Code Flow), потому что считаю ее наиболее безопасным вариантом авторизации.
Далее рассмотрим каждый из этапов.
Frontend
На фронте авторизация сводится к перенаправлению пользователя по ссылке, получению кода авторизации вместе с ссылкой для редиректа и отправке этого кода на сервер.
Всю логику связанную с авторизацией я выношу в отдельный компонент VKButton. Полностью компонент выглядит так:
После нажатия на кнопку входа через ВК нас перебрасывает по ссылке:
https://oauth.vk.com/authorize?client_id=${client_id}&display=popup&redirect_uri=${cbLink}&scope=email&response_type=code&v=5.120
Суть этой ссылки примерно следующая:
- просим доступ на почту пользователя (scope=email)
- просим вернуть код (response_type=code) вместе с url на который нас перенаправит вк в случае успешной авторизации (redirect_uri)
Важные моменты
- Ссылка на редирект должна совпадать с той же ссылкой, что вы передаете с сервера.
- Код авторизации будет действовать в течение часа и по нему можно сделать только один запрос.
После того как мы нажали на кнопку “Разрешить”, нас перенаправляет назад и в url добавляется code. Чтобы достать его из url, я буду использовать библиотеку query-string, но лучше написать хелпер, который будет уметь то же самое.
После получения кода мы отсылаем его на сервер и ждем, что нам придут данные авторизации:
Backend
На сервере нам надо принять код, по которому получить токен. С помощью токена мы сможем запросить профиль пользователя от которого пришел код. Вместе с токеном нам также возвращается email и user_id.
Для того чтобы делать запросы с сервера необходимо подключить HttpService из библиотеки @nestjs/common и импортировать HttpModule в AuthModule.
По ссылке выше мы запрашиваем все необходимые нам поля.
https://api.vk.com/method/users.get?user_ids=${userId}&fields=photo_400,has_mobile,home_town,contacts,mobile_phone&access_token=${token}&v=5.120
Полный перечень можно увидеть на странице https://vk.com/dev/users.get. Полный список методов можно найти на странице https://vk.com/dev/methods
В первую очередь мы будем искать пользователя по vk_id, так как может возникнуть такая ситуация, при которой у пользователя не указан email в профиле вк.
Раньше при регистрации аккаунта во Вконтаке email был обязательным, но сейчас нет. Если вам нужен email пользователя, то можно добавить проверку email’а на фронте и в зависимости от этого перенаправлять пользователя на форму добавления необходимых данных.
Немного изменим логику аутентификации. Добавим туда параметр для пропуска пароля, так как при авторизации через соц. сети он будет отсутствовать.
В данной статье мы рассмотрели как делать авторизацию через ВК с помощью метода Authorization code flow. Помимо него существуют ещё Implicit flow и Client credentials flow. Подробнее про них можно прочитать тут.
- Документация ВК https://vk.com/dev/manuals
- Репозиторий с всем кодом https://github.com/ndrwbv/vk-auth-react-nestjs
Https vk com логин акт заблокирован
🧓🏼
Julio Mims
Чтобы войти в систему с помощью Https vk com вход в систему заблокирован , вы можете использовать официальные ссылки, которые мы предоставили ниже.
Популярные В
UP
Статус обслуживания
23 часа назад
Последняя проверка
Посетите официальную страницу
Руководство по устранению неполадок
Если у вас возникли проблемы со входом в свою учетную запись, выполните следующие действия.
- Шаг 1 — Чтобы войти в заблокированную учетную запись Https vk com, откройте это руководство в новом окне. Вы сможете следить за шагами, видя их!
- Шаг 2 — Войдите в систему, введя свои данные для входа в систему Https vk com. Эта информация будет предоставлена вам либо при регистрации, либо от уполномоченного представителя веб-сайта.
- Шаг 3 – После получения сообщения «успешно авторизовался» вы официально подключены к Https vk com вход в систему акт заблокирован!
- Шаг 4 — Действие входа в систему Https vk com заблокировано, могут возникнуть проблемы с принятием ваших учетных данных для входа. Мы рекомендуем следовать этим пошаговым инструкциям, чтобы решить эту проблему.
Если вы входите в систему из мобильных приложений , вы можете оформить заказ ниже:
- Определите, требует ли приложение входа в систему. Нажмите на текстовое поле идентификации
- Шаг 1. Перейти на страницу по официальной ссылке ниже.
- Шаг 2. Войдите, используя свое имя пользователя и пароль. Экран входа появляется после успешного входа.
Понимание основ входа в систему
- Знать, что такое вход в систему
- Понимать, что включает в себя регистрационная информация
- Понимать, что такое имя пользователя
- Понимать, что такое пароль
- Ознакомиться с основами входа в систему
- Понять, что такое двухфакторная аутентификация
- Восстановление утерянного пароля
- Рассмотрите возможность сохранения регистрационной информации
- Если вы забудете регистрационную информацию, возможно, вы не сможете восстановить свою учетную запись. Это особенно верно, если вы потеряете доступ к электронной почте или номеру телефона, который вы использовали для создания учетной записи.
Хотя может показаться заманчивым использовать свою учетную запись Facebook для входа в систему, а не создавать новую учетную запись, лучше ограничить количество мест, в которых Facebook может отслеживать вашу активность в Интернете.
Настройка приватности ВКонтакте
В рамках нашей серии статей, посвященных конфиденциальности, мы рассмотрим ВКонтакте (также известную как VK.com), российскую социальную сеть, чтобы продемонстрировать, как они относятся к конфиденциальности по сравнению с Google и Facebook.
Социальные сети — желанный кусок пирога для мошенников и чудаков всех мастей, и vk.com — не исключение. Злоумышленники придумывают множество креативных способов кражи учетных данных пользователя: от обычных взломов и фишинга до таких экзотических методов, как установка точек доступа Wi-Fi, которые собирают ваши данные для входа в социальные сети в обмен на «бесплатный» Интернет.
Конечно, можно попробовать восстановить скомпрометированную учетную запись, заблокировать спам и игнорировать подозрительные запросы от друзей, которые, похоже, были взломаны. Однако иногда это не так просто, как кажется.
Лучший способ обезопасить себя от киберпреступников — настроить конфиденциальность своей учетной записи. Это не так сложно, ведь интерфейс ВКонтакте очень удобный. Кроме того, в этом посте мы собираемся выяснить, на что вам следует обратить внимание.
Мошенники взломали #Skype и обманули друзей жертвы, чтобы отправить им около 5000 долларов: https://t.co/lv9нлыГвВг
— Kaspersky (@kaspersky) 24 марта 2015 г.
1. Начнем с вашего списка друзей . Если у вас их много — больше сотни — лучше разделить их на несколько категорий. Это поможет вам и вашим друзьям настроить, какой контент может видеть каждый конкретный человек. Для всех артистов, фитнес-тренеров, интернет-магазинов и других коммерческих аккаунтов лучше сделать отдельный список. SMM-менеджерам таких страниц не нужно просматривать фотографии ваших детей, не так ли?
2. Откройте Мои настройки -> вкладка Конфиденциальность . Здесь вы можете выбрать, какой контент будет скрыт от общего доступа (в принципе, вы можете скрыть что угодно, от постов и фотографий до групп и заметок). Обратите внимание на настройку Определенные списки друзей , которая доступна в выпадающем окне. Теперь вы понимаете, почему мы попросили вас сделать отдельную категорию для всех коммерческих аккаунтов!
Дело в том, что владельцы этих страниц обычно первыми рассылают спам и приглашают пользователей вступать в разные группы. Они продвигают товары через ваш список друзей и тем самым надоедают вашим настоящим друзьям! Гораздо лучше ограничить доступ к вашему списку друзей для всех людей из вашего коммерческого списка.
SMS #троян обходит #CAPTCHA и крадет деньги: https://t. co/9fjQ0PwZuw pic.twitter.com/r5jKqQUc3y
— Kaspersky (@kaspersky) 18.03.2015
3. При загрузке фотографий в ВК вы можете отметить, где сделан снимок. С помощью этих тегов социальная сеть составляет карту ваших путешествий . Мы рекомендуем вам ограничить доступ к указанной карте. В противном случае его могут использовать, например, взломщики, которые отслеживают, когда людей нет дома. Они часто мониторят соцсети и геолокационные метки, чтобы выбрать лучшее время для проникновения в дом.
4. С помощью специальной ссылки, которая находится под вкладкой Конфиденциальность, вы можете проверить, как другие люди видят ваш профиль . Если пройти по этой ссылке, будет доступна еще одна опция: проверить , как конкретный человек видит вашу страницу . Для этого вам потребуется ввести имя друга или ссылку на профиль пользователя. Посмотрите — это очень интересно.
5. Фотография вашего профиля всегда общедоступна. Единственный способ скрыть это от определенного пользователя — полностью забанить его. Вы можете сделать это во вкладке «Черный список».
[Kaspersky] Как оплатить «Бесплатный Wi-Fi» паролем от аккаунта в социальной сети http://t.co/q9EbDdYq0m
— Инцидент с безопасностью (@security_inci) 10 апреля 2015 г.
6. Когда вы отклоняете чей-то запрос на добавление в друзья, этот человек становится вашим подписчиком — он/она по-прежнему может видеть все ваши публичные обновления. То же самое относится и к бывшим друзьям. Поэтому, если вы хотите разорвать связь с кем-то полностью и окончательно, не просто удалите его из друзей, но и добавьте в черный список.
7. Просмотрите настройки, указанные на вкладке « Security ». Обязательно включите двухэтапную аутентификацию. Эта мера значительно повысит безопасность вашего профиля.
8. ВКонтакте отслеживает время, местонахождение и устройства, с которых недавно был доступ к вашему профилю. Если вы пользовались социальной сетью в интернет-кафе, с компьютера друга или если вы потеряли телефон с активным приложением ВКонтакте, вам следует воспользоваться кнопкой « Завершить все сеансы ». Эта мера не позволит посторонним просмотреть ваши сообщения или полностью украсть ваш аккаунт.
9. Пользователи ВКонтакте могут включить протокол безопасного соединения , правда необычным образом. Вы можете найти этот параметр на вкладке «Безопасность», но он будет скрыт, пока вы не откроете сайт с помощью безопасного соединения. Для этого нужно добавить префикс «https://» в начале адреса ВКонтакте и нажать Enter. Как вариант, можно пройти по этой ссылке: https://vk.com/settings?act=security
После этого вы увидите настройки шифрования. Теперь вы можете установить флажок «Всегда использовать безопасное соединение (HTTPS)» и сохранить изменения.
Настоятельно рекомендуем вам включить эту настройку, особенно если вы часто пользуетесь бесплатным Wi-Fi в кафе, отелях и на улице.