Авторизация в VK с помощью логина и пароля в Python.

Для доступа к API ВКонтакте с Вашего сайта предусмотрен механизм серверной авторизации на базе протокола OAuth 2.0. Этот метод позволяет реализовать безопасную аутентификацию пользователей на Вашем сайте через ВКонтакте и получить доступ к API с сервера Вашего приложения.

Процесс авторизации сайта состоит из 4-х шагов:

  1. Открытие окна браузера для аутентификации пользователя на сайте ВКонтакте.
  2. Разрешение пользователем доступа к своим данным.
  3. Передача сайту значения code
    для получения ключа доступа.
  4. Получение сервером приложения ключа доступа access_token
    для доступа к API ВКонтакте.

Для авторизации пользователя необходимо перенаправить его браузер по адресу: https://oauth.vk.com/authorize, передав следующие параметры:

client_id
Обязательно
Идентификатор Вашего приложения.
redirect_uri
Обязательно
Адрес, на который будет переадресован пользователь после прохождения авторизации (домен указанного адреса должен соответствовать основному домену в настройках приложения и перечисленным значениям в списке доверенных redirect uri — адреса сравниваются вплоть до path-части).
display
Обязательно
Указывает тип отображения страницы авторизации. Поддерживаются следующие варианты:
  • page
    — форма авторизации в отдельном окне;
  • popup
    — всплывающее окно;
  • mobile
    — авторизация для мобильных устройств (без использования Javascript)

Если пользователь авторизуется с мобильного устройства, будет использован тип mobile

.

scopeБитовая маска настроек доступа приложения, которые необходимо проверить при авторизации пользователя и запросить, в случае отсутствия необходимых.
response_typeТип ответа, который Вы хотите получить. Укажите code
, чтобы осуществлять запросы со стороннего сервера.
vВерсия API, которую Вы используете. Актуальная версия: 5.103
.
stateПроизвольная строка, которая будет возвращена вместе с результатом авторизации.

Пример запроса:

Если пользователь не вошел на сайт, то в диалоговом окне ему будет предложено ввести свой логин и пароль.

После успешного входа на сайт пользователю будет предложено авторизовать приложение, разрешив доступ к необходимым настройкам, запрошенным при помощи параметра scope

. Полный список настроек доступен в разделе прав доступа приложений.

Параметр code

может быть использован в течение 1 часа для получения ключа доступа к API
access_token
с Вашего сервера.

В случае возникновения ошибки браузер пользователя будет перенаправлен с кодом и описанием ошибки:

Для получения access_token

необходимо выполнить запрос с Вашего сервера на https://oauth.vk.com/access_token, передав следующие параметры:

client_id
Обязательно
Идентификатор Вашего приложения
client_secret
Обязательно
Защищенный ключ Вашего приложения (указан в настройках приложения)
redirect_uri
Обязательно
URL, который использовался при получении code на первом этапе авторизации. Должен быть аналогичен переданному при авторизации.
code
Обязательно
Временный код, полученный после прохождения авторизации.

Пример запроса:

В результате выполнения данного запроса Ваш сервер получит вновь созданный access_token

. Вместе с access_token серверу возвращается время жизни ключа
expires_in
в секундах. Процедуру авторизации приложения необходимо повторять в случае истечения срока действия
access_token
, смены пользователем своего логина или пароля или удаления приложения из настроек.

Если у пользователя указан email, а приложением были запрошены соответствующие права, сервер также вернет email

пользователя.

В случае ошибки будут переданы параметры error

и
error_description
.

За несколько лет своего существования протокол OAuth смог зарекомендовать себя и обрел широкую популярность. Не удивительно, ведь это удобный и безопасный способ обмена данными между сервисами. Если до него для того, чтобы получить данные пользователя со стороннего сервиса, нужно было запрашивать пользовательские логин и пароль, что, разумеется, небезопасно, то с помощью OAuth всё происходит иначе.

Для начала немного терминов. В OAuth авторизации выделяются три роли – клиент, сервер и владелец ресурса (пользователь). Клиент – это сервис, которому предоставляется доступ к данным, сервер – это сервис, который хранит данные, а владелец ресурса – это пользователь, который предоставляет свои данные. Или на примере: Вы сделали на своем сайте авторизацию через ВКонтакте. На этот сайт зашел пользователь и хочет авторизоваться. В данном случае клиентом является Ваш сайт, сервером – ВКонтакте, а владельцем ресурса – этот самый пользователь.

Еще один термин, с которым придется часто сталкиваться – это токен. Токен в нашем случае – это средство авторизации в OAuth запросах, текстовый ключ, который предоставляет ограниченный временный доступ к данным владельца ресурса на сервере. Нередко используется связка из нескольких токенов.

Способы OAuth авторизации на разных серверах отличаются, но схема у них одна:

  1. Клиент отправляет на сервер запрос на получение токена авторизации. В запросе используются идентификационные данные клиента.
  2. После распознавания клиента сервер отдает токен авторизации.
  3. Клиент, используя этот токен, перенаправляет пользователя на сервер
  4. На сервере пользователь авторизовывается и подтверждает доступ клиенту к своим данным.
  5. После авторизации и подтверждения пользователь перенаправляется к клиенту, передавая при этом дополнительные токены (обычно один или два) доступа (обычно в GET-параметрах)
  6. Используя токен доступа клиент обращается к серверу за данными и получает их уже без подтверждения пользователем. Обычно доступ к данным по одному и тому же токену ограничивается лишь по времени, некоторые серверы дополнительно ограничивают количество запросов.

Шаги 1 и 2 – редкость, обычно идентификационные данные клиента передаются серверу вместе с перенаправлением пользователя на авторизацию вместо токена авторизации. Идентификационные данные клиенту выдаются при регистрации сайта на сервере, зачастую в виде приложения.

ВКонтакте – это социальная сеть с огромной аудиторией – более 40 млн. посетителей ежеджевно. Почему бы не упростить регистрацию этих людей на Вашем сайте? Для вступления достаточно, пора приступить к делу.

Регистрация приложения

Скорее всего Вы уже зарегистрированы в соц. сети ВКонтакте, если нет, то Вам придется это сделать. Указывать номер телефона при регистрации обязательно. Переживать не стоит — никакой смс-рассылки от этих сервисов не приходит. Далее необходимо создать приложение. (Скриншоты были сделаны в апреле 2015, с той поры интерфейс мог измениться)

Oauth vk com что такое

После смс-подтверждения создания приложения оно, как можно догадаться, создаётся и Вы попадаете на страницу её редактирования. Всю информацию и иконки желателно добавить, но больше всего нас там интересуют id приложения и защищённый ключ— это и есть идентификационные данные нашего сайта:

Oauth vk com что такое

Приложения ВКонтакте поддерживают работу с несколькими доменами, так что можно создать одно приложение сразу для всех Ваших сайтов.

Что такое VK API?

API социальной сети VK предоставляет разработчикам довольно большой спект возможностей. К основым из них относятся:

  • Получение информации о пользователях социальной сети
  • Получение информации из базы данных VK
  • Управление пользователями групп и сообществ
  • Управление рекламными компаниями
  • Управление фото и видео

В общей сложности программисты и разработчики приложений могут использовать более 550 различных функций. Такой богатый набор функций предлагает широкие возможности для автоматизации взаимодействия с социальной сетью VK. С помощью API вы сможете развивать свой проект и расширить охват аудитории, в которую можно включить пользователей самой популярной социальной сети на просторах СНГ.

Полный список методов вы сможете получить, перейдя по адресу — https://vk.com/dev/methods

Для работы со всеми API функциями VK нужно выполнить несколько важных шагов, но основной из них это получение уникального идентификатора (ID), который позволит вам получать нужную информацию и взаимодействовать с серверами VK. Ниже мы подробно описали процесс регистрации и получения нужного вам ID.

Что и как

Для удобства создаём класс, в него пишем константы (скачать конечный результат можно ниже из раздела «дополнительно»):

class OAuthVK < const APP_ >= 1234567 ; //ID приложения const APP_SECRET = ‘sometestappsecret’ ; //Защищенный ключ const URL_CALLBACK = ‘https://example.com/oauth/vk.php’ ; //URL, на который произойдет перенаправление после авторизации >

Первым делом нужно авторизовать пользователя, поэтому нужно перенаправить его на сайт ВКонтакте. Добавляем метод в имеющийся класс:

В поле scope передаются запрашиваемые права доступа приложения. Для считывания основной информации достаточно offline . Но если нужно большее, то их можно перечислять через запятую:

Небольшое пояснение: redirect() — это метод, реализующий перенаправление. Для удобства в этом примере он вынесен в класс Utils

class Utils < public static function redirect ( $uri = » ) < header ( «HTTP/1.1 301 Moved Permanently» ) ; header ( «Location: » . $uri , TRUE , 302 ) ; exit ; > >

После авторизации и подтверждения доступа пользователь переадресовывается на адрес URL_CALLBACK ?code=xxx . Теперь нужно по переданному нам коду взять токен и запросить данные пользователя. Если же пользователь отклонил запрос или возникла ошибка, то он перенаправится на адрес URL_CALLBACK с кодом и описанием ошибки, например URL_CALLBACK?error=inval > .

То есть, логику можно разместить в эти условия:

if ( ! empty ( $_GET [ ‘error’ ] ) ) < // Пришёл ответ с ошибкой. > elseif ( empty ( $_GET [ ‘code’ ] ) ) < // Самый первый запрос. Отправляем пользователя на авторизацию OAuthVK::goToAuth(); > else < // Ответ от ВК пришёл удачный // Запрос токена и данных пользователя >

class OAuthVK < . const URL_ACCESS_TOKEN = ‘https://oauth.vk.com/access_token’ ; private static $token ; public static $userId ; . public static function getToken ( $code ) < $url = self :: URL_ACCESS_TOKEN . ‘?client_ > . self :: APP_ID . ‘&client_secret=’ . self :: APP_SECRET . ‘&code=’ . $_GET [ ‘code’ ] . ‘&redirect_uri=’ . urlencode ( self :: URL_CALLBACK ) ;

if ( ! ( $res = @ file_get_contents ( $url ) ) ) < return false ; >

$res = json_decode ( $res ) ; if ( empty ( $res -> access_token ) || empty ( $res -> user_id ) ) < return false ; >

self :: $token = $res -> access_token ; self :: $userId = $res -> user_id ;

Объект $res при удачном запросе будет содержать такие поля:

stdClass Object ( [ access_token ] => xxx [ expires_in ] => 43200 [ user_ >] => xxx )

Expires_in — это время жизни токена в секундах, оно может понадобится только при длительных запросах на сервер, а по остальным ключам и так понятно что здесь что. Далее, если используете OAuth для полноценной регистрации, логично сделать проверку зарегистрирован ли на сайте кто-либо с таким user_id и при наличии оного авторизовать его и перекинуть на главную страницу сайта (или любую другую), исключив последующие действия.

Далее по токену и user_id остается запросить данные пользователя. Все запросы к API ВКонтакте выполняются по такому адресу: https://api.vk.com/method/METHOD_NAME?PARAMETERS&access_token=ACCESS_TOKEN

METHOD_NAME – название метода из списка функций API PARAMETERS – параметры соответствующего метода API ACCESS_TOKEN – ключ доступа, полученный в результате успешной авторизации приложения

Ответ приходит в формате JSON. Если же вы более привыкли в XML, то либо привыкайте к JSON, либо отсылайте запросы на такой адрес: https://api.vk.com/method/METHOD_NAME.xml?PARAMETERS&access_token=ACCESS_TOKEN

Запрос данных пользователей по их user_id осуществляется через метод getProfiles или его полный аналог users.get. При необходимости можно также отправлять параметр fields и получать дополнительные данные пользователя.

class OAuthVK < . const URL_GET_PROFILES = ‘https://api.vk.com/method/getProfiles’ ; public static $userData ; . public static function getUser ( ) <

if ( ! self :: $userId ) < return false ; >

if ( ! ( $res = @ file_get_contents ( $url ) ) ) < return false ; >

$user = json_decode ( $res ) ;

if ( ! empty ( $user -> error ) ) < self :: printError ( $user -> error ) ; return false ; >

if ( empty ( $user -> response [ 0 ] ) ) < return false ; >

$user = $user -> response [ 0 ] ; if ( empty ( $user -> uid ) || empty ( $user -> first_name ) || empty ( $user -> last_name ) ) < return false ; >

return self :: $userData = $user ; > . >

В нашем примере ответ от сервера приходит в таком виде (в зависимости от параметров количество полей может быть больше):

stdClass Object ( [ response ] => Array ( [ 0 ] => stdClass Object ( [ u >] => 1 [ first_name ] => Павел [ last_name ] => Дуров ) ) )

Имя, фамилия и uid пользователя теперь известны нам, что делать с ними дальше — решайте сами. Я использую OAuth для полноценной регистрации и создаю с этими данными нового пользователя на сайте.

С каждым днём влияние социальных сетей и сервисов только крепчает. Это означает, что нам, как веб разработчикам нужно это учитывать. Сегодня я расскажу и покажу, как создать аутентификацию ваших пользователей через социальную сеть ВКонтакте. Для этого мы не будем пользоваться какими-то сторонними библиотеками, а реализуем всё с нуля, собственными руками. Думаю, многие ждали подобного урока, так что томить не буду. Начнём!

Заметка. Пример, созданный в данном уроке, предназначен для работы на локальном сервере.

Как получить токен VK.COM

Получение токена состоит из двух частей: регистрации своего приложения и получение токена в этом приложении.

Создать приложение можно на странице. Указав название приложения, и выбрав его тип. Я выбираю Standalone, потому что тогда можно будет получить токены с бОльшим возможностями, чем в остальных вариантах (придётся поверить мне на слово, что это правда).

Создав приложение и перейдя на вкладку настроек, будет показано: id приложения, секретный ключ

Теперь, имея id приложения, можно получить токен доступа. Для этого нужно сформировать ссылку, подставив в неё id своего приложения.

https://oauth.vk.com/authorize?client_id={CLIENT_ID}&display=page&redirect_uri=https://oauth.vk.com/blank.html&scope=friends,notify,photos,wall,email,mail,groups,stats,offline&response_type=token&v=5.74

где вместо {CLIENT_ID} нужно вставить id своего приложения. а в параметре scope — перечислены разрешения, которыми мы хотим наделить токен, список всех разрешений Однако здесь, одним из самых важных разрешений является offline, которое создаёт бессрочный токен, не имеющий ограниченного времени жизни.

Если вы не хотите создавать своё приложение, то можете получить токен по ссылке

Перейдя по сформированной ссылке, откроется диалоговое окно, в которому будут зачитаны права показаны разрешения, которыми наделяется токен (чем больше указано scope свойств, тем больше будет этот список)

Я сократил токен для сохранения читабельности. У вас он будет длиннее

Скопировав этот токен, можно делать первые запросы к API.

Описание задачи и пути решения.

Практически для любых действий с VK API требуется авторизация. Поэтому поставлена задача реализовать авторизацию наиболее удобным способом, а именно, с помощью логина и пароля.

Для того, чтобы не приходилось каждый раз вводить логин и пароль было решено сохранять ключ доступа в текстовом файле. Это не единственный и не самый безопасный способ, но зато самый простой, особенно для первой реализации.

Файл программы предполагается использовать использовать двумя путями: в качестве самостоятельного консольного приложения и в качестве библиотеки для последующих примеров использования VK API.

В качестве самостоятельного консольного приложения программа будет просто сообщать удалась авторизация или нет

Итак, используем следующий основной алгоритм:

  • Если текстовый файл существует, то считываем из него ключ доступа.
  • Иначе
      авторизируемся с помощью логина и пароля,
  • сохраняем ключ доступа в текстовый файл.
  • Используем ключ доступа для работы с VK API
  • Разбор кода примера авторизации в ВК на Python-е.

    Весь примера находится в файле ‘auth_vk.py’. Этот файл предполагается использовать в качестве модуля. В этом модуле будет всего две функции: 1) auth_vk_token() — авторизация с помощью сохранённого в файле ключа доступа (access_token); 2) auth_vk_password() — авторизация с помощью логина и пароля.

    Функция auth_vk_password()

    def auth_vk_password(): session = vk.AuthSession(app_id=APP_ID, user_login=input(«user_login: «), user_password=input(«user_password: «)) file = open(«auth_vk.ini», ‘w’) file.writelines(session.access_token) return session

    Данная функция использует метод ‘AuthSession‘ библиотеки vk для авторизации в ВК с помощью логина и пароля. После успешной авторизации, мы получаем ключ доступа (access_token) и сохраняем его в файле ‘auth_vk.ini’. Функция возвращает Сессию — объект библиотеки vk.

    session = vk.AuthSession(app_id=APP_ID, user_login=input(«user_login: «), user_password=input(«user_password: «))

    Метод ‘AuthSession‘ в качестве аргументов принимает ID приложения в ВК. Следующие аргументы соответственно логин и пароль от вашего аккаунта ВК. Я их получаю с помощью встроенной функции input().

    Простое консольное приложение авторизация в VK на Python-е.

    Для начала пошёл по самому простому пути и сделал консольное приложение.

    Приложение использует общедоступную библиотеку vk. Так что, если вы её ещё не установили, то это нужно сделать:

    pip3 install vk —user

    Для запуска необходимо в командную строку вбить строчку:

    python3 auth_vk.py

    После чего приложение запросит логин и пароль и выдаст результат:

    Конечно, в таком виде использовать приложение довольно бессмысленно так, как оно ничего не делает, кроме авторизации. Его предполагается использовать в качестве библиотеки. Как это делается будет в следующих примерах.

    Приложение использует access_token сохранённый в текстовом файле auth_vk.ini. При первом запуске (т.е. когда файл не удаётся найти) или когда access_token не подходит, используется авторизация с помощью логина и пароля.

    При последующем запуске авторизация происходит автоматически.
    Будьте осторожны! Приложение создаёт вечный access_token. Не передавайте файл кому попало.
    Чтобы обезопасить себя, вы всегда можете отменить действующие токены и выйти из всех приложение с помощью функции ВК «Завершить все сеансы».

    Рейтинг
    ( 2 оценки, среднее 4 из 5 )
    Понравилась статья? Поделиться с друзьями:
    Для любых предложений по сайту: [email protected]