Python-social-auth авторизация для iframe приложения Вконтакте?

Использую python-social-auth с бакэндом "vk-oauth2". На сайте работает нормально.

Если делаю приложение iframe, как описано тут
python-social-auth.readthedocs.org/en/latest/backe...

авторизации не происходит.

Первоначально когда iframe дергает приложение там в GET параметрах передаются всякие oauth_token, user_id и прочие параметры. В принципе если python-social-auth, позволяет авторизоваться зная эти параметры, этот вариант тоже подойдет. Пока не нашел такого примера.

Подскажите почему может не работать с iframe? Или как можно авторизовать пользователя через python-social-auth, зная oauth_token и прочие параметры.
  • Вопрос задан
  • 1920 просмотров
Пригласить эксперта
Ответы на вопрос 1
un1t
@un1t Автор вопроса
Была така я же проблема. Там когда в iframe в GET параметрах передается access_token и прочее и его сразу нужно использовать чтобы авторизоваться. Немного кривовато, но нужно было очень быстро решить проблему и сильно вникать некогда было. Почему не работает по документации я так и не понял, но почитав исходники и посмотрев как открывается ифрейм написал такой код.

# settings.py

SOCIAL_AUTH_VK_OAUTH2_KEY = '1239'
SOCIAL_AUTH_VK_OAUTH2_SECRET = 'asdfdasfsdfasdfsdfsda'
SOCIAL_AUTH_VK_APP_USER_MODE = 1

# views.py

from django.contrib.auth import authenticate, login
from social.apps.django_app.utils import psa, load_strategy, load_backend
from social.exceptions import AuthTokenRevoked

def home(request):
    if 'access_token' in request.GET:
        backend = 'vk-oauth2'
        request.social_strategy = load_strategy(request)
        uri = '/'

        request.backend = load_backend(request.social_strategy,
                                                   backend, uri)

        token = request.GET['access_token']
        try:
            user = request.backend.do_auth(token)
        except AuthTokenRevoked:
            user = None
        else:
            if user:
                login(request, user)
                print('OK')
            else:
                print('ERROR')
            return redirect('/')
    return render(request, 'home.html')


# home.html

user: {{ request.user.get_full_name }}
<script src="//vk.com/js/api/xd_connection.js?2" type="text/javascript"></script>
<script type="text/javascript">
	$(function () {
	    VK.init(function() {
	            VK.addCallback("onApplicationAdded", requestRights);
	            VK.addCallback("onSettingsChanged", onSettingsChanged);
	        }
	    );		
        {% if not request.user.is_authenticated %}
            startConnect();
        {% endif %}
	})


    function startConnect() {
        VK.callMethod('showInstallBox');
    }

    function requestRights() {
        VK.callMethod('showSettingsBox', 1 + 2); // 1+2 is just an example
    }

    function onSettingsChanged(settings) {
        window.location.reload()
    }
</script>
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы