Авторизация через вк на сайте: Авторизация на сайте с помощью ВК, простой и понятный способ на PHP! » KOTOFF.net

Авторизация в VK для людей / Хабр

Что случилось?

Здравствуй, дорогой читатель. Если тебе хотя бы однажды доводилось работать с API Вконтакте и при этом писать все на python, вероятно, авторизация приложения заставила тебя сделать несколько приседаний, после которых ног либо не чувствуешь и падаешь в обморок, либо вкачиваешь квадрицепс и все же пробиваешь API, как Ван Дамм.

По какой-то причине этот, казалось бы, самый непримечательный этап поначалу отнимает огромное количество сил и времени. Моя задача: помочь читателям Хабра избежать травм ног.

Далее я предлагаю рассмотреть небольшую библиотеку, позволяющую в одну строчку авторизовать свое приложение для конкретного пользователя и получить access_token. В конце статьи представлена ссылка на github-репозиторий этой библиотеки с quickstart’ом в README-файле.

Задача

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

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

Итак, используем python3.5, библиотеку для html запросов requests и getpass для скрытого ввода пароля.

Наша задача: несколько раз обратиться по верному адресу, каждый раз парсить <form>, отправлять ответ и наконец получить желанный access_token.

Реализация

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

Метод __init__

class VKAuth(object):
    def __init__(self, permissions, app_id, api_v, email=None, pswd=None, two_factor_auth=False, security_code=None, auto_access=True):
        """
        Args:
            permissions: list of Strings with permissions to get from API
            app_id: (String) vk app id that one can get from vk. com
            api_v: (String) vk API version
        """
        self.session        = requests.Session()
        self.form_parser    = FormParser()
        self.user_id        = None
        self.access_token   = None
        self.response       = None
        self.permissions    = permissions
        self.api_v          = api_v
        self.app_id         = app_id
        self.two_factor_auth= two_factor_auth
        self.security_code  = security_code
        self.email          = email
        self.pswd           = pswd
        self.auto_access    = auto_access
        if security_code != None and two_factor_auth == False:
            raise RuntimeError('Security code provided for non-two-factor authorization')

Как было сказано в уже упомянутой статье, нам необходимо искусно ворочать cookie и redirect’ы. Все это за нас делает библиотека requests с объектом класса Session. Заведем и себе такой в поле self.session. Для парсинга html документа используется стандартный класс HTMLParser из модуля html. parser. Для парсера тоже написан класс (FormParser), разбирать который большого смысла нет, так как он почти полностью повторяет таковой из упомянутой статьи. Существенное отличие лишь в том, что использованный здесь позволяет изящно отклонить авторизацию приложения на последнем шаге, если вы вдруг передумали.

Поля user_id и access_token будут заполнены после успешной авторизации, response хранит в себе результат последнего html запроса.

Пользователю библиотеки предоставим один-единственный метод – authorize, который совершает 3 шага:

  1. запрос на авторизацию приложения
  2. авторизация пользователя

    2.1 введение кода-ключа в случае двух-факторной авторизации
  3. подтверждение разрешения на использование permissions

Пройдемся по каждому шагу.

Шаг 1. Запрос на авторизацию приложения

Аккуратно составляем url запроса (про параметры можно прочитать здесь), отправляем запрос и парсим полученный html.

Метод authorize для Шага 1

def authorize(self):
        api_auth_url = 'https://oauth.vk.com/authorize'
        app_id = self.app_id
        permissions = self.permissions
        redirect_uri = 'https://oauth.vk.com/blank.html'
        display = 'wap'
        api_version = self.api_v
        auth_url_template = '{0}?client_id={1}&scope={2}&redirect_uri={3}&display={4}&v={5}&response_type=token'
        auth_url = auth_url_template.format(api_auth_url, app_id, ','.join(permissions), redirect_uri, display, api_version)
        self.response = self.session.get(auth_url)
        # look for <form> element in response html and parse it
        if not self._parse_form():
            raise RuntimeError('No <form> element found. Please, check url address')

Шаг 2. Авторизация пользователя

Реализованы методы _log_in() и _two_fact_auth() для [не]успешной авторизации пользователя в вк, если он не авторизован (а он точно не авторизован). Оба метода используют ранее определенные поля email, pswd, two_factor_auth и security_code. Если какое-то из полей не было подано аргументом при инициализации объекта класса VKAuth, их попросят ввести в консоли, а случае неудачи попросят ввести заново. Двух-факторная авторизация опциональна и по умолчанию отключена, и наш модуль уведомляет пользователя о ее присутствии ошибкой.

Метод authorize для Шага 2 (продолжение Шага 1)

#look for <form> element in response html and parse it
        if not self._parse_form():
            raise RuntimeError('No <form> element found. Please, check url address')
        else:
            # try to log in with email and password (stored or expected to be entered)
            while not self._log_in():
                pass;
            # handling two-factor authentication
            # expecting a security code to enter here
            if self. two_factor_auth:
                self._two_fact_auth()

Метод _log_in для Шага 2

def _log_in(self):
        if self.email == None:
            self.email = ''
            while self.email.strip() == '':
                self.email = input('Enter an email to log in: ')
        if self.pswd == None:
            self.pswd = ''
            while self.pswd.strip() == '':
                self.pswd = getpass.getpass('Enter the password: ')
        self._submit_form({'email': self.email, 'pass': self.pswd})
        if not self._parse_form():
            raise RuntimeError('No <form> element found. Please, check url address')
        # if wrong email or password
        if 'pass' in self.form_parser.params:
            print('Wrong email or password')
            self.email = None
            self.pswd = None
            return False
        elif 'code' in self.form_parser.params and not self.two_factor_auth:
            raise RuntimeError('Two-factor authentication expected from VK. \nChange `two_factor_auth` to `True` and provide a security code.')
        else:
            return True

Метод _two_fact_auth для Шага 2

def _two_fact_auth(self):
        prefix = 'https://m.vk.com'
        if prefix not in self.form_parser.url:
            self.form_parser.url = prefix + self.form_parser.url
        if self.security_code == None:
            self.security_code = input('Enter security code for two-factor authentication: ')
        self._submit_form({'code': self.security_code})
        if not self._parse_form():
            raise RuntimeError('No <form> element found. Please, check url address')

Шаг 3. Подтверждение

permissions и получение access_token

Самое сложное позади. Теперь дело за малым. Используем наше усовершенствование парсера формы, чтоб найти в только что поступившем к нам html документе кнопку с надписью «Allow» и вытащить из нее url подтверждения авторизации. Рядом находится кнопка с отказом – сохраним и ее url. Поле auto_access по умолчанию находится в состоянии True, так что это подтверждение ни чуть не должно осложнить нам жизнь.

Наконец, сохраним полученные access_token и user_id из url, который был передан после подтверждения авторизации.

Теперь можно весело пользоваться VK API.

http://REDIRECT_URI#access_token= 533bacf01e11f55b536a565b57531ad114461ae8736d6506a3&expires_in=86400&user_id=8492

Метод authorize для Шага 3

    # allow vk to use this app and access self.permissions
    self._allow_access()
     # now get access_token and user_id
     self._get_params()

Метод _allow_access для Шага 3

def _allow_access(self):
        parser = self.form_parser
        if 'submit_allow_access' in parser.params and 'grant_access' in parser. url:
            if not self.auto_access:
                answer = ''
                msg =   'Application needs access to the following details in your profile:\n' + \
                        str(self.permissions) + '\n' + \
                        'Allow it to use them? (yes or no)'
                attempts = 5
                while answer not in ['yes', 'no'] and attempts > 0:
                    answer = input(msg).lower().strip()
                    attempts-=1
                if answer == 'no' or attempts == 0:
                    self.form_parser.url = self.form_parser.denial_url
                    print('Access denied')
            self._submit_form({})

Метод _get_params для Шага 3

    def _get_params(self):
        try:
            params = self.response.url.split('#')[1].split('&')
            self.access_token = params[0].split('=')[1]
            self.user_id = params[2].split('=')[1]
        except IndexError(e):
            print(e)
            print('Coudln\'t fetch token')

github: VKAuth

Оставляйте комментарии и отзывы здесь и на github. Удачи на полях сражений, и берегите ноги.

Авторизация с помощью учетной записи во «ВКонтакте»

С помощью аккаунта в социальной сети «ВКонтакте» можно авторизоваться на hh.ru без регистрации и ввода пароля. Для этого достаточно нажать на логотип данной соцсети при входе на сайт.

Шаг 1. Выберите нужный способ авторизации:

 

Шаг 2. В открывшемся окне выполните одно из двух действий:

— введите логин и пароль к вашему профилю во «ВКонтакте», если вы в данный момент не залогинены в этой соцсети;

— либо разрешите приложению доступ к вашей информации, если вы уже залогинены во «ВКонтакте».

Обратите внимание! Вы не сообщаете сайту hh.ru свой логин и пароль от аккаунта во «ВКонтакте». Авторизация происходит при помощи протокола OAuth. Этот способ авторизации совершенно безопасен для данных вашего профиля в соцсети (см. «Вопросы и ответы»).

 

Шаг 3. Для завершения авторизации введите адрес вашей электронной почты (как отмечалось выше, HeadHunter не получает ваш пароль и логин во «ВКонтакте» — поэтому почту нужно ввести еще раз).

 

Шаг 4а. Если на hh.ru уже существует учетная запись с подобным адресом, то вы получите об этом уведомление. Введите пароль к своему кабинету на hh.ru, чтобы связать эти две учетные записи и в дальнейшем без проблем авторизовываться с помощью аккаунта во «ВКонтакте».

Вы авторизованы! И ваша учетная запись синхронизирована с учетной записью «ВКонтакте». Теперь вы будете входить на hh.ru нажатием одной кнопки «Войти через ВКонтакте».

 

Шаг 4б. Если у вас раньше не было регистрации на hh.ru, то при заходе через «ВКонтакте» у вас есть возможность импортировать данные о своем образовании, дате рождения и городе прямо из профиля.

Теперь вы не только авторизованы на hh. ru, но у вас даже есть заготовка под резюме: все основные пункты уже заполнены!

 

Полностью безопасно! Вы вводите свои авторизационные данные на сайте vk.com. HeadHunter не имеет к ним доступа.

Аккаунт используется только для входа на сайт. Никакие данные о вашей деятельности на сайте hh.ru или данные из ваших резюме не будут отражаться на вашем профиле.

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

Если же вы хотите, чтобы работодатель мог посмотреть ваш профиль во «ВКонтакте», нужно специально оставить ссылку на него в контактных данных на сайте hh.ru.

Во-первых, благодаря авторизации через «ВКонтакте», вам не нужно каждый раз вспоминать пароль к hh.ru.

Во-вторых, авторизация через «ВКонтакте» гораздо быстрее: достаточно один раз подтвердить подлинность своей учетной записи в соцсети и отметить галочкой поле «запомнить меня на этом компьютере» — теперь вы сможете всегда авторизовываться на hh. ru в один клик.

В-третьих, для новых пользователей это отличая экономия времени при создании резюме: при синхронизации аккаунтов импортируются деловые данные из учетной записи «ВКонтакте»: образование, дата рождения, пол, место проживания. После импорта резюме уже практически готово к публикации: молодым специалистам останется ввести только телефон, а опытным специалистам и менеджерам нужно будет добавить желаемую должность и опыт работы.

HeadHunter неизвестен ваш пароль от социальной сети. Если вы забыли этот пароль, попробуйте восстановить его на сайте vk.com.

Сейчас это можно сделать, обратившись в службу технической поддержки. А в скором времени вы сможете сделать это самостоятельно в настройках.

С помощью аккаунта соцсети может авторизоваться только соискатель. Для работодателей такой возможности в ближайшее время не предусматривается.

Мы планируем сделать возможность авторизации и через другие популярные соцсети.

На всех, кроме rabota.by.

 

Android официальный клиент ВКонтакте. Как авторизоваться

спросил

Изменено
2 года, 1 месяц назад

Просмотрено
1к раз

У меня на устройстве установлено официальное приложение от ВКонтакте.

И авторизировался там.

Я пытаюсь написать свое приложение, которое использует API ВКонтакте, но мне нужна авторизация.

Есть ли способ получить авторизованный статус пользователя из официального приложения с отправкой Intent с каким-либо действием?

  • андроид
  • андроид-намерение
  • вк

2

Теперь это возможно!
Пожалуйста, просмотрите этот учебник
http://vk. com/dev/android_sdk

Также можно авторизоваться через webview
Авторизация в Вконтакте — это OAuth-авторизация. Таким образом, следующие шаги одинаковы для всех сервисов, использующих OAuth: Facebook, Instagram и т. д.

  1. Создать заявку на vk.com:
    http://vk.com/editapp?act=create
  2. Получить его ID.
  3. В вашей учетной записи откройте веб-просмотр с URL-адресом входа
    https://oauth.vk.com/authorize?client_id=APP_ID&scope=SETTINGS&redirect_uri=REDIRECT_URI&display=DISPLAY&response_type=token

APP_ID — это идентификатор вашего приложения. Вы найдете его в ВКонтакте -> Приложения -> Настройки -> Приложения, которыми я управляю (внизу) -> Управление

Этот URL для входа покажет стандартный диалог авторизации ВКонтакте. Там пользователь введет свой логин и пароль.

После этого пользователь будет перенаправлен на ваш Redirect-Uri. Итак, вам нужно подготовить Redirect_Uri — это страница, которая будет открыта после успешного входа в систему.

К этому URL будет присоединен access_token. Access_token — единственный параметр, который необходимо сохранить после авторизации. В следующих запросах вам просто нужно будет предоставить access_token.

О других параметрах вы можете прочитать на сайте ВКонтакте:
http://vk.com/developers.php?oid=-17680044&p=Authorizing_Client_Applications

1

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя электронную почту и пароль

Опубликовать как гость

Электронная почта

Требуется, но никогда не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

python 2.

7 — Ошибка API авторизации ВК: u'{«error»:»invalid_request»,»error_description»:»Ошибка безопасности»}’

Пытаюсь авторизоваться из своего djano-приложения на vk.com. Я использую запросы и авторизацию клиента. Пытаюсь авторизоваться таким способом и получаю ошибку:

 {"ошибка":"invalid_request","error_description":"Ошибка безопасности"}
 

Интернет предлагает перелогиниться в ВК в браузере, но решения для авторизации по коду нет.

Мой код:

 класс VkApiSingleton(объект):
версия_api = '5.95'
def __init__(я,
app_id=config.APP_ID,
логин=config.ACCOUNT_LOGIN,
pswd=config.ACCOUNT_PASSWORD,
разрешения = 'видео, офлайн, группы'
):
# type: (int, str, str, str) -> Нет
self.app_id = app_id
self.app_user_login = логин
self.app_user_pass = пароль
self.access_token = Нет
self.user_id = Нет
self.session = запросы. Session()
self.form_parser = FormParser()
self.permissions = разрешения
def __new__(cls, *args, **kwargs):
если не hasattr(cls, 'экземпляр'):
cls.instance = super(VkApiSingleton, cls).__new__(cls, *args, **kwargs)
вернуть cls.instance
@свойство
защита get_session (я):
вернуть self.session
def _parse_form (я, ответ):
# тип: (requests.models.Response) -> Нет
self.form_parser = FormParser()
пытаться:
self.form_parser.feed (ул (ответ. содержание))
кроме исключения как ошибки:
регистратор.исключение(
'Ошибка проверки HTML-формы',
extra={'Тело ошибки': str(err)}
)
def _submit_form(я, **kwargs):
# type: (dict) -> request.models.Response
если self.form_parser.method == 'опубликовать':
полезная нагрузка = copy.deepcopy(self.form_parser.params)
если kwargs.get('is_login', False):
полезная нагрузка. обновление({
'электронная почта': self.app_user_login,
«пройти»: self.app_user_pass
})
с self.get_session в качестве сеанса:
пытаться:
вернуть session.post (self.form_parser.url, данные = полезная нагрузка)
кроме исключения как ошибки:
регистратор.исключение(
'Ошибка отправки формы авторизации',
extra={'Тело ошибки': str(err)}
)
поднять VkApiError('Ошибка отправки формы авторизации: %s' % str(err))
защита _log_in(я):
# тип: () -> запросы.модели.Ответ
ответ = self._submit_form(is_login=True)
self._parse_form(ответ)
если response.status_code != 200:
поднять VkApiError('Ошибка аутентификации: невозможно проанализировать HTML-форму')
если «пройти» в response.text:
регистратор.ошибка(
'Не верный логин или пароль'
)
поднять VkApiError('Неверный логин или пароль')
вернуть ответ
def _submit_permissions(self, url=None):
# тип: () -> запросы. модели.Ответ
если «submit_allow_access» в self.form_parser.params и «grant_access» в self.form_parser.url:
вернуть self._submit_form(token_url=url)
еще:
логгер.предупреждение(
«Не удается отправить разрешения для приложения»
)
def _get_token (я, ответ):
# тип: (requests.models.Response) -> Нет
пытаться:
params = response.url.split('#')[1].split('&')
self.access_token = параметры [0].split('=')[1]
self.user_id = params[2].split('=')[1]
кроме IndexError как ошибка:
регистратор.ошибка(
'Не могу получить access_token',
extra={'Тело ошибки': str(err)}
)
деф авторизация(я):
auth_url = 'https://oauth.vk.com/authorize?revoke=1'
redirect_uri = 'https://oauth.vk.com/blank.html'
дисплей = 'wap'
request_params = {
'client_id': self.app_id,
'область': self.

This entry was posted in Популярное