Django app for developing vk.com (aka vkontakte.ru largest, Russian social network) iframe applications.
Handles user authentication and registration.
$ pip install django-vkontakte-iframe
- django-annoying for AutoOneToOneField
Optional:
- vkontakte >= 0.9.4.1 for populating cities and countries info via admin action
Register and configure vkontakte iframe application here: http://vkontakte.ru/apps.php?act=add
Add your app's settings to settings.py:
VK_IFRAME_APP_ID = '1234567' # Application ID VK_IFRAME_APP_KEY = 'M1gytuHwni' # Application key VK_IFRAME_APP_SECRET = 'MiRFwrDYwcYFCTD18EcY' # Secure key
Add 'vk_iframe' to INSTALLED_APPS
Add 'vk_iframe.backends.VkontakteUserBackend' to AUTHENTICATION_BACKENDS:
AUTHENTICATION_BACKENDS = ( 'django.contrib.auth.backends.ModelBackend', 'vk_iframe.backends.VkontakteUserBackend', )
Put 'vk_iframe.middleware.AuthenticationMiddleware', 'vk_iframe.middleware.IFrameFixMiddleware' and 'vk_iframe.middleware.LoginRequiredMiddleware' to MIDDLEWARE_CLASSES:
MIDDLEWARE_CLASSES = [ # ... 'django.contrib.auth.middleware.AuthenticationMiddleware', # ... 'vk_iframe.middleware.IFrameFixMiddleware', 'vk_iframe.middleware.AuthenticationMiddleware', # ... 'django.middleware.locale.LocaleMiddleware', # ... 'vk_iframe.middleware.LoginRequiredMiddleware', ]
Please note that 'vk_iframe.middleware.AuthenticationMiddleware' must be after 'django.contrib.auth.middleware.AuthenticationMiddleware' but before 'django.middleware.locale.LocaleMiddleware'.
'vk_iframe.middleware.LoginRequiredMiddleware' must be after 'vk_iframe.middleware.AuthenticationMiddleware'.
Vkontakte visitors will be automatically registered and authorized as django users (username == vkontakte user id).
LoginRequiredMiddleware is an optional. It returns 403 for all unauthorized requests with urls not listed in settings.PUBLIC_URLS. You should enable it for security reasons. Example of PUBLIC_URLS:
PUBLIC_URLS = [ '^admin/$', '^my-callback/', ]
If i18n is in use then vkontakte user's language will be used as django's user language.
Run
python ./manage.py syncdb
(orpython ./manage.py migrate vk_iframe
if South is used)Optional: load initial geo data (cities and countries):
python manage loaddata vk-geo
If you want to store more user data then put the following line as the 'First API request' ('Первый запрос к API') option (in your app edit page at vkontakte.ru):
method=getProfiles&uids={viewer_id}&format=json&v=3.0&fields=uid,first_name,last_name,nickname,domain,sex,bdate,city,country,timezone,photo,photo_medium,photo_big,photo_rec,has_mobile,rate,contacts,education
For IE: adjust P3P policy header value according to your site privacy policy by providing VK_P3P_POLICY option in your settings.py:
VK_P3P_POLICY = 'IDC DSP COR IVAi IVDi OUR TST'
Default value is 'IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT'. See http://www.p3pwriter.com/LRN_111.asp for the full set of tags.
If you want to use django-vkontakte-iframe along with some other apps that store account information from vkontakte, you may be interested in the folowing feature.
By default django-vkontakte-iframe creates a new user if is unable to find user with given vk_id. But you can overload that behavior by helping to find apropriate user in your database.
Define your own function that recieves vk_id and returns user and boolean flag if found and (None, False) otherwise. For example, if you are using django-social-auth for authentication on your site, it might be something like this:
def get_user_by_vk_id(vk_id): user = None found = True try: user = User.objects.get(social_auth__provider='vkontakte', social_auth__uid=str(vk_id)) except ObjectDoesNotExist: found = False return (user, found)
Then tell django-vkontakte-iframe about your function:
VK_IFRAME_GET_VK_USER_FUNC = { 'module':'myproject.mymodule.utils', 'function':'get_user_by_vk_id', }
That's all. All your app's visitors are now registered and authenticated django users. Additional profile data is available as user.vk_profile.