Тестовое приложение. Зарегистрировал app во VK. Получил ID и защитный ключ. Для hosts сделал перенаправление зарегистрированного во ВК домена. Далее сделал через PuCharm:
pip install django-social-auth
В settings.py добавил 'social_auth' к INSTALLED_APPS:
INSTALLED_APPS = (
# bla-bla-bla
#...
'social_auth',
)
Добавил туда же:
VK_APP_ID = '12345678' # мой ID для ВКонтакте
VK_API_SECRET = 'ir7HneLl1G8ugtIL1Z3z' # мой защитный ключ для ВКонтакте
После прописал бэкенды в том же setting.py:
AUTHENTICATION_BACKENDS = (
'social_auth.backends.contrib.vk.VKOAuth2Backend', # авторизация чекрез VKontakte
'django.contrib.auth.backends.ModelBackend', # джанговский бэкэнд, иначе войти на сайт по связке пароль&логин будет невозможно.
)
добавил дефолтного пользователя и разрешил создавать пользователей через social_auth:
SOCIAL_AUTH_DEFAULT_USERNAME = 'аnonymous'
SOCIAL_AUTH_CREATE_USERS = True
Перечислил pipeline для последовательной обработки отклика от ВКонтакте:
SOCIAL_AUTH_PIPELINE = (
'social_auth.backends.pipeline.social.social_auth_user',
'social_auth.backends.pipeline.associate.associate_by_email',
'social_auth.backends.pipeline.user.get_username',
'social_auth.backends.pipeline.user.create_user',
'social_auth.backends.pipeline.social.associate_user',
'social_auth.backends.pipeline.social.load_extra_data',
'social_auth.backends.pipeline.user.update_user_details',
)
Кстати, до работы pipeline похоже дело даже не доходит... Далее в urls.py добавляю паттерн:
url(r'', include('social_auth.urls')),
и не забываю "from django.conf.urls import include"… Кстати, вот на счет r'' не очень ясно.. можно и r'social/' писать с тем-же результатом...
После, конечно, исполняю:
manage.py syncdb
manage.py migrate social_auth
А в шаблоне пишу:
<a href="{% url 'socialauth_begin' 'vkontakte-oauth2' %}">Enter VK</a>
Вроде все.
Запускаю.
Проверяю, что шаблон рендерит все правильно и получает:
<a href="/login/vkontakte-oauth2/">Enter VK</a>
Но когда кликаешь эту ссылку то вываливается по ошибке:
Exception Type: WrongBackend
Exception Value: Incorrect authentication service "vkontakte-oauth2"
Traceback сообщает:
C:\Program Files\Python\2.7\lib\site-packages\social_auth\decorators.py in wrapper
raise WrongBackend(backend)
И не понятно, что делать. Ощущение, что где-то не подключено где-то, от social_auth… что-то типа "from social_auth import ????" надо добавить.
P.S. Пока бился с проблемой, обратил внимание, что manager.py иногда сыпятся вот такие сообщения:
Traceback (most recent call last):
File "C:\Program Files\Python\2.7\lib\wsgiref\handlers.py", line 86, in run
self.finish_response()
File "C:\Program Files\Python\2.7\lib\wsgiref\handlers.py", line 128, in finish_response
self.write(data)
File "C:\Program Files\Python\2.7\lib\wsgiref\handlers.py", line 212, in write
self.send_headers()
File "C:\Program Files\Python\2.7\lib\wsgiref\handlers.py", line 270, in send_headers
self.send_preamble()
File "C:\Program Files\Python\2.7\lib\wsgiref\handlers.py", line 194, in send_preamble
'Date: %s\r\n' % format_date_time(time.time())
File "C:\Program Files\Python\2.7\lib\socket.py", line 324, in write
self.flush()
File "C:\Program Files\Python\2.7\lib\socket.py", line 303, in flush
self._sock.sendall(view[write_offset:write_offset+buffer_size])
error: [Errno 10053] ��������� �� ����� ����-
[15/Aug/2014 19:23:29] "GET /nav/124/31x40/?_=1408116205829 HTTP/1.1" 500 59
Traceback (most recent call last):
File "C:\Program Files\Python\2.7\lib\SocketServer.py", line 595, in process_request_thread
self.finish_request(request, client_address)
File "C:\Program Files\Python\2.7\lib\SocketServer.py", line 334, in finish_request
self.RequestHandlerClass(request, client_address, self)
File "C:\Program Files\Python\2.7\lib\site-packages\django\core\servers\basehttp.py", line 150, in __init__
super(WSGIRequestHandler, self).__init__(*args, **kwargs)
File "C:\Program Files\Python\2.7\lib\SocketServer.py", line 653, in __init__
self.finish()
File "C:\Program Files\Python\2.7\lib\SocketServer.py", line 712, in finish
self.wfile.close()
File "C:\Program Files\Python\2.7\lib\socket.py", line 279, in close
self.flush()
File "C:\Program Files\Python\2.7\lib\socket.py", line 303, in flush
self._sock.sendall(view[write_offset:write_offset+buffer_size])
error: [Errno 10053] ��������� �� ����� ����-
----------------------------------------
Exception happened during processing of request from ('127.0.0.1', 59045)
----------------------------------------
Но иногда не сыпятся. Отчего такое случается не понял. Вроде зависит от того вызываешь через 127.0.0.1 или доменный алиас из hosts. Но может и нет...
P.P.S. Запускаю все на 8000 порту. Какая разница ВКонтакту какие у меня порты?!