Авторизация на сайтах через социальные сети очень удобна, не надо заполнять регистрационные формы и т.д., вам достаточно нажать на соответствующую кнопку и вас авторизует сам сайт, при этом нужные данные он сможет получить с сайта источника (той социальной сети, с которой выполняется авторизация).
На своих проектах я использую клёвую библиотеку django-social-auth, до неё пробовал django-ulogin, но сам сервис uLogin мне не понравился (мои сумбурные заметки об этом). На пыхе также обсуждали другие библиотеки, в частности loginza, но отзывы о ней плохие, поэтому даже не пробовал. В любом случае сервисы — это сервисы, и зависимость от сервисов это больше проблема (частые падения сервисов, убогие виджеты и внешний вид без кастомизаций и т.п.) чем зависимость от библиотеки, которая проксирует запросы к конечным «социальным сетям».
Далее будем обсуждать только django-social-auth.
Вообще, нам интересно два репозитория:
- Основной, от omab;
- И второй, со свежой поддержкой русских социалок от krvss, в который я пулял фиксы.
Регистрации в сетях
Для начала нам надо получить ключи от необходимых социальных сетей, на странице проекта в GitHub есть инструкции для множества социальных сетей, но в свое время у меня были трудности и я решил записать последовательность действий для некоторых из них.
Как узнать свой id и auth key для клиента в Копателе.
Зайдите на https://developers.facebook.com/apps/ и нажмите на + Create New App. Введите название приложения (название сайта или проекта), после сабмита формы вы увидите реквизиты «App ID» и «App Secret».
Добавьте их в свой settings.py, пример:
FACEBOOK_APP_ID = ‘696381432507483’ FACEBOOK_API_SECRET = ’15afb0bbeb173aae12e8e875ffccc7a4′
Теперь заполните поле «App Domains», укажите через пробел домены (например один локальный, другой продакшен домен). Поставьте галочку на «Website with Facebook Login» и введите адрес для редиректа, я редиректю в корень продакшен сайта.
Зайдите на https://dev.twitter.com/ и введите логин и пароль от вашей учетной записи в Twitter. Далее заходите на https://dev.twitter.com/apps и жмёте на Create a new application, заполните нужные поля и соглашаетесь с правилами, после чего вы получите «Consumer key» и «Consumer secret».
Добавьте их в settings.py, пример:
TWITTER_CONSUMER_KEY = ‘G2wMq4KYpTmgZDcjg0EzQ’ TWITTER_CONSUMER_SECRET = ‘rGHMGIbOwIEpoxjXzOahc2KmvxY8h10DpZ90LwqEjec’
По умолчанию вам выдадут Access level «Read-only», для авторизации этого вам хватит. Рекомендую прочитать The Application Permission Model.
Вконтакте
Зайдите на страницу https://vk.com/developers.php и нажмите Создать приложение, выберите Тип «Веб-сайт» и введите адрес сайта и имя домена. В ответ получите «ID приложения» и «Защищенный ключ».
Добавьте их в settings.py, пример:
VK_APP_ID = ‘1234567’ VKONTAKTE_APP_ID = VK_APP_ID VK_API_SECRET = ‘Q0owlQESOXRYd2lcgnLa’ VKONTAKTE_APP_SECRET = VK_API_SECRET
Для чего дублировать переменные, я спрашивал в блоге автора и получил ответ. Также смотрите документацию по бекенду.
Как найти свой id и auth key
Google+
Зайдите на страницу https://code.google.com/apis/console/ , нажмите Create, введите требуемые данные и во вкладке API Access увидите «Client ID» и «Client secret».
Добавьте их в settings.py, пример:
GOOGLE_OAUTH2_CLIENT_ID = ‘123456789.apps.googleusercontent.com’ GOOGLE_OAUTH2_CLIENT_SECRET = ‘p0dJSDjs-dAJsdSAdaSDadasdrt’
GitHub
Зайдите на страницу https://github.com/settings/applications/new и введите логин и пароль от вашей учетной записи в GitHub. Введите имя приложения, адреса сайта для «URL» и «Callback URL» (у меня это один адрес корневой страницы сайта). И получите «Client ID» и «Client Secret», после чего добавьте их в settings.py:
GITHUB_APP_ID = ‘da3bad06987041629b96’ GITHUB_API_SECRET = ‘8bb53dd4a0b1bbc12f77e147c11d5fd6082adb8d’
Теперь перейдем к настройке social_auth.
Установка и настройка django-social-auth
Для начала установим приложение:
pip install django-social-auth
Теперь отредактируйте settings.py:
# Добавляем в AUTHENTICATION_BACKENDS нужные бекенды, # смотрите полный список https://github.com/omab/django-social-auth/blob/master/doc/configuration.rst AUTHENTICATION_BACKENDS = ( ‘social_auth.backends.twitter.TwitterBackend’, ‘social_auth.backends.facebook.FacebookBackend’, ‘social_auth.backends.contrib.vk.VKOAuth2Backend’, ‘social_auth.backends.google.GoogleOAuth2Backend’, ‘social_auth.backends.contrib.github.GithubBackend’, ‘django.contrib.auth.backends.ModelBackend’, ) # Добавляем в TEMPLATE_CONTEXT_PROCESSORS процессор «social_auth_by_name_backends» TEMPLATE_CONTEXT_PROCESSORS = ( ‘django.contrib.auth.context_processors.auth’, ‘django.core.context_processors.request’, ‘social_auth.context_processors.social_auth_by_name_backends’, ) # И добавляем «social_auth» в INSTALLED_APPS INSTALLED_APPS = ( . ‘social_auth’, )
Дополнительные настройки social_auth, добавьте в settings.py:
import random # Если имя не удалось получить, то можно его сгенерировать SOCIAL_AUTH_DEFAULT_USERNAME = lambda: random.choice([‘Darth_Vader’, ‘Obi-Wan_Kenobi’, ‘R2-D2’, ‘C-3PO’, ‘Yoda’]) # Разрешаем создавать пользователей через social_auth SOCIAL_AUTH_CREATE_USERS = True # Перечислим pipeline, которые последовательно буду обрабатывать респонс SOCIAL_AUTH_PIPELINE = ( # Получает по backend и uid инстансы social_user и user ‘social_auth.backends.pipeline.social.social_auth_user’, # Получает по user.email инстанс пользователя и заменяет собой тот, который получили выше. # Кстати, email выдает только Facebook и GitHub, а Vkontakte и Twitter не выдают ‘social_auth.backends.pipeline.associate.associate_by_email’, # Пытается собрать правильный username, на основе уже имеющихся данных ‘social_auth.backends.pipeline.user.get_username’, # Создает нового пользователя, если такого еще нет ‘social_auth.backends.pipeline.user.create_user’, # Пытается связать аккаунты ‘social_auth.backends.pipeline.social.associate_user’, # Получает и обновляет social_user.extra_data ‘social_auth.backends.pipeline.social.load_extra_data’, # Обновляет инстанс user дополнительными данными с бекенда ‘social_auth.backends.pipeline.user.update_user_details’ )
Подключите роуты в urls.py:
urlpatterns = patterns(», . url(r», include(‘social_auth.urls’)), )
./manage.py syncdb ./manage.py migrate social_auth
Документацию можно посмотреть тут:
- Основная документация
- Документаци по pipeline
Виджет для вывода кнопочек
Это просто шаблонный inclusion-тег, который выводит ссылочки в виде кнопочек-логотипов социальных сетей
Сам виджет я не стал публиковать в PyPI, так как не считаю это важным, вам следует просто скопировать исходники отсюда https://github.com/adw0rd/django-social-auth-widget
После чего добавьте в settings.py следующий список:
SOCIAL_AUTH_PROVIDERS = [ ‘id’: p[0], ‘name’: p[1], ‘position’: ‘width’: p[2][0], ‘height’: p[2][1], >> for p in ( (‘github’, u’Login via GitHub’, (0, -70)), (‘facebook’, u’Login via Facebook’, (0, 0)), (‘twitter’, u’Login via Twitter’, (0, -35)), ) ]
В вашем шаблоне с формой авторизации использовать так:
load social_auth_widget %> form action=»» method=»post»> input name=»username» /> input name=»password» /> input type=»submit» value=»Sign in» /> form>
Обновление аватарок при авторизации
В статье Django Social Auth: now with images имеется пример как через сигналы обновлять аватарку пользователю, на мой вгляд, код служит только для примера.
Источник: indigotlt.ru
Создаём универсальный класс взаимодействия с вашим сервером
Здесь обсуждать нечего если вы хоть чуть — чуть знакомы с PHP
Теперь получим обязательные данные которые нужны скрипту :
$uid = $_POST[‘viewer_id’];$auth = $_POST[‘auth_key’];$act = $_POST[‘act’];$key = $_POST[‘key’];
- $uid — ID пользователя в вк
$auth — auth_key пользователя
$act — наша переменная обозначающая что мы хотим делать
$key — ключ защиты переменной act
>else< //Ошибка в key (скорее всего подмена данных >>else?>
Если вы не поняли что делает этот каркас, значит вам надо учить PHP
Итак продолжим реализацию :
Теперь нам надо записать пользователя в БД, код представлен ниже :
$result = mysql_query(‘INSERT INTO `users` (`uid`, `last_enter`) VALUES («‘.$uid.'»,»‘.time().'») ON DUPLICATE KEY UPDATE `last_enter` = «‘.time().'»;’);if (!$result)else
Обсудим что я сотворил выше
Я делаю запрос на занесение пользователя в базу и в случае ошибки выдаю пользователю в виде JSON ответа.
Думаю ничего сложного в этом нет поэтому приступим к рассмотрению второго вида акта : GET_USER_INFO
Я не буду разъяснять что мы делаем в этом акте т.к. это за меня сделал Александр (Тыц чтобы посмотреть урок) поэтому вот код :
$result = mysql_query(‘SELECT * FROM `users` WHERE `uid`=’.$uid.’;’);if (!$result)else’);>
- 1. money — это сколько надо добавить денег
2. rait — это сколько надо добавить рейтинга
3. checker — это хэш данных (защищает только money и rait и привязан к auth_key)
$money = $_POST[‘m_add’]; //Внимание : я использовал именование m_add, r_add вместо money и rait$rait = $_POST[‘r_add’]; //$hash = $_POST[‘c_add’]; //c_add это checkerif (md5($money.$auth.$rait) == $hash)< $result = mysql_query(‘UPDATE `users` SET `money` = `money` + «‘.$money.'», `rait` = `rait` + «‘.$rait.'» WHERE `uid`=’.$uid.’;’); if (!$result) < exit(»); >else< //Обновляем данные и выводим их $result_2 = mysql_query(‘SELECT * FROM `users` WHERE `uid`=’.$uid.’;’); if (!$result_2)< exit(»); >else< //Выводим обновлённые данные [код из акта 2] $data = mysql_fetch_assoc($result); //mysql_fetch_assoc потому что нам надо обращаться к переменныем таким способом : $data[‘money’]; //Создаём переменные которые надо вывести : $money = $data[‘money’]; $rait = $data[‘rait’]; $hash = md5(md5($money).md5($rait)); //Выводим результат exit(»); > >>else
Готово! Перед тем как приступить к клиенту напишем полный код файла core.php :
‘); >else< //Выводим что всё хорошо exit(»); > break; case «GET_USER_INFO»: //Получение данных $result = mysql_query(‘SELECT * FROM `users` WHERE `uid`=’.$uid.’;’); if (!$result)< //Ошибка mysql запроса выводим её в ответ : exit(»); >else< $data = mysql_fetch_assoc($result); //mysql_fetch_assoc потому что нам надо обращаться к переменныем таким способом : $data[‘money’]; //Создаём переменные которые надо вывести : $money = $data[‘money’]; $rait = $data[‘rait’]; $hash = md5(md5($money).md5($rait)); //Выводим результат exit(»); > break; case «UPDATE_USER_INFO»: //Обновление данных $money = $_POST[‘m_add’]; //Внимание : я использовал именование m_add, r_add вместо money и rait $rait = $_POST[‘r_add’]; // $hash = $_POST[‘c_add’]; //c_add это checker if (md5($money.$auth.$rait) == $hash)< $result = mysql_query(‘UPDATE `users` SET `money` = `money` + «‘.$money.'», `rait` = `rait` + «‘.$rait.'» WHERE `uid`=’.$uid.’;’); if (!$result) < exit(»); >else< //Обновляем данные и выводим их $result_2 = mysql_query(‘SELECT * FROM `users` WHERE `uid`=’.$uid.’;’); if (!$result_2)< exit(»); >else< //Выводим обновлённые данные [код из акта 2] $data = mysql_fetch_assoc($result); //mysql_fetch_assoc потому что нам надо обращаться к переменныем таким способом : $data[‘money’]; //Создаём переменные которые надо вывести : $money = $data[‘money’]; $rait = $data[‘rait’]; $hash = md5(md5($money).md5($rait)); //Выводим результат exit(»); > > >else< //Попытка обмана exit(»); > break; default: //Неизвестный акт exit(»); break; > >else< //Ошибка в key (скорее всего подмена данных exit(»); >>else?>
Просмотрите этот код внимательно, теперь мы приступаем к клиенту.
[шаг 4: пишем клиент]
Я не буду описывать весь процесс создания приложения поэтому приведу ниже код и расскажу о некоторых особенностях.
Файл [b]ServerAPI.as[/b] :package < import flash.net.*; import flash.events.*; import vk.api.MD5; import vk.api.serialization.json.JSON; public class ServerAPI < private var server:String = null; private var uid:String = null; private var auth:String = null; public function ServerAPI(parms:Object) < server = parms.url; uid = parms.uid; auth = parms.auth; >public function Executure(parms:Object) < /* Код представленный ниже взят из основы написанной в данной теме : http://flapps.ru/forum/topic165.html */ var core_loader:URLLoader = new URLLoader(); var core_request_URLRequest=new URLRequest(server + «core.php»); core_request.method=URLRequestMethod.POST; switch (parms.act) < case «AUTH_USR»: core_vars[‘viewer_id’] = uid; core_vars[‘auth_key’] = auth; core_vars[‘act’] = parms.act; core_vars[‘key’] = MD5.encrypt(MD5.encrypt(parms.act) + MD5.encrypt(auth) + MD5.encrypt(uid)); //Больше параметров нет break; case «GET_USER_INFO»: core_vars[‘viewer_id’] = uid; core_vars[‘auth_key’] = auth; core_vars[‘act’] = parms.act; core_vars[‘key’] = MD5.encrypt(MD5.encrypt(parms.act) + MD5.encrypt(auth) + MD5.encrypt(uid)); //Больше параметров нет break; case «UPDATE_USER_INFO»: core_vars[‘viewer_id’] = uid; core_vars[‘auth_key’] = auth; core_vars[‘act’] = parms.act; core_vars[‘key’] = MD5.encrypt(MD5.encrypt(parms.act) + MD5.encrypt(auth) + MD5.encrypt(uid)); //Прочие параметры core_vars[‘m_add’] = parms.money; core_vars[‘r_add’] = parms.rait; core_vars[‘c_add’] = MD5.encrypt(parms.money + auth + parms.rait); break; default: throw new Error(«Act is not valid»); break; >var core_vars:URLVariables = new URLVariables(); core_request.data=core_vars; core_loader.addEventListener(Event.COMPLETE, function(e:Event)< trace(e.target.data); //Для отладки var data:Object = JSON.decode(e.target.data); if (data[‘error’] == ‘0’)< //Ошибок нет parms.onComplete(data); >else < parms.onError(data); >>); core_loader.addEventListener(IOErrorEvent.IO_ERROR, function(e:Event)< //Если ошибка из — за отсуствия доступа к скрипту parms.onError(); //Даём понять что ошибка не в скрипте >); core_loader.load(core_request); > >>
- 1. Только 1 аргумент во всех функциях (включая конструктор)
2. Обработка всех основных событий
3. Дополняемость класса (вы можете дописать класс или переделать его)
var net:ServerAPI = new ServerAPI(); net.Executure(, onError: function(data:Object) < //Ошибка >>);
Ну вот и всё. Для тех кто знает азы и изучал уроки на этом форуме будет не сложно разобраться с кодом.
От себя : Поздравляю всех с днём знаний
P.S. В данном уроке я не рассмотрел проверку времени последнего захода (защита от частых заходов). Это будет ваша домашняя работа
Источник: flapps.ru
Что такое ID, UID? Подробно об идентификаторах
В этом уроке мы разберемся, что такое идентификаторы: (ID, UID, УИД). Эти аббревиатуры часто встречаются в теме информационной безопасности, которую мы начинаем осваивать в новой серии IT-уроков.
Что такое ID?
ID (читается «ай-ди») — это часть английского слова “identifier”, которое переводится как “идентификатор”.
ID или Идентификатор — это информация, которая может идентифицировать субъект (простыми словами — это номер или имя: число или строка символов).
Каждый раз, когда вы где-то регистрируетесь, вы получаете идентификатор, то есть, какое-то имя или номер. И внутри каждой отдельной системы ваш идентификатор уникальный.
Примеры идентификаторов (id):
Пример ID страницы в социальной сети ВКонтакте
Знакомясь с человеком мы в первую очередь спрашиваем его имя, а для связи просим сообщить номер телефона или e-mail, то есть, узнаем его идентификаторы (сюда же можно отнести номер машины, номер паспорта, номер банковской карты, штрих-код и т.д.)
Что такое UID?
Часто встречается надпись “UID”, в которой перед “ID” добавлена буква “U”, которая может быть расшифрована как “unique” — “уникальный”, или как “user” — “пользователь”.
Следовательно, есть два варианта расшифровки аббревиатуры UID:
UID (Unique identifier) или УИД — уникальный идентификатор.
UID (User identifier) — идентификатор пользователя в операционной системе или на сайте.
Всё просто: некоторые идентификаторы являются уникальными, то есть могут принадлежать только одному субъекту (имя может совпадать, а номер паспорта всегда отличается).
Примеры использования UID:
- уникальные идентификаторы применяются в ж/д билетах в качестве уникального идентификатора заказа
- в системе оплаты общественного транспорта Москвы используется индивидуальный заводской серийный номер карты
- В программах компании “1С” используется УИД — свойство ссылки с типом УникальныйИдентификатор
- В платежных документах государственных учреждений используется уникальный идентификатор начисления УИН (например, УИН12345678901234567890///)
- UNIX-подобные операционные системы различают пользователя по его номеру, который обозначается, как UID
- Некоторые сайты также используют аббревиатурой UID, указывая, что данный идентификатор относится именно к пользователю
ID с точки зрения информационной безопасности
Обычно идентификатор (id) не является секретным, поэтому только по нему нельзя предоставлять доступ к ресурсу (например, знание адреса электронной почты не даёт права доступа к письмам в почтовом ящике).
Определение идентификатора (идентификация) является первым шагом для доступа к информационным ресурсам (почта, аккаунт в социальной сети и т.д.), далее выполняется аутентификация и авторизация, но об этом мы поговорим в следующем IT-уроке.
Копирование запрещено, но можно делиться ссылками:
Источник: it-uroki.ru