Трясогузка вручную логин пользователя - PullRequest
1 голос
/ 24 марта 2020

У меня есть приложение-трясогузка, которое должно войти в систему и аутентифицировать пользователей для секции /admin с помощью OAuth. Взаимодействие с поставщиком OAuth работает нормально только в конце представления authorize. Я получаю ошибку Too many redirects. Вот мой смысл:

SESSION_KEY = 'access_token'

oauth = OAuth()
oauth_client = oauth.remote_app(#oauth client setup here)

Просмотры

def login(request):
    """
    This view is redirecting to my oauth provider, log the user
    and redirect back to /authorize with the data in the request.
    """
    return HttpResponseRedirect(oauth_client.authorize(
        callback='http://localhost/admin/authorize'))


def authorize(request):    
    resp = oauth_client.authorized_response(request.GET)    
    request.session[SESSION_KEY] = (resp['access_token'], '')
    data = baton.get('/oauth/me')
    username = json.loads(data.data).get('username')

    user, _ = User.objects.get_or_create(
        username=username,
        defaults={'password': username, 'is_superuser': True}
    )
    auth_user = authenticate(username=username, password=username)
    login(auth_user)

    return HttpResponseRedirect('/admin')

Urls

urlpatterns = [
    url(r'^admin/login', login, name='login'),
    url(r'^admin/authorize', authorize, name='authorize'),

    url(r'^admin/', include(wagtailadmin_urls)),
]

Too many redirects Я вижу, что в браузерах происходит, когда представление authorize проверяет все логи c и пытается перенаправить на /admin, но я думаю, что происходит то, что Wagtail затем перенаправляет снова на /login, но я хотя и аутентифицируюсь и login пользователя должно быть достаточно для Wagtail, по-видимому, нет.

Любые идеи, как решить эту проблему, или программно войти в систему администратора Wagtail.

1 Ответ

2 голосов
/ 24 марта 2020

Строка login(auth_user) вызывает представление login, которое вы определили выше, но вы передаете пользовательский объект вместо запроса. Это должен был вызывать функцию login из django.contrib.auth? Если это так, вам нужно дать ему другое имя, которое не соответствует sh с представлением, возможно, с:

from django.contrib.auth import login as auth_login

(В этом случае вам все равно придется исправить параметры вашего login / auth_login вызова, так как он принимает и запрос, и пользователя - см. документацию по https://docs.djangoproject.com/en/3.0/topics/auth/default/#django .contrib.auth.login )

...