Аутентификация аутентификации через Python через токен доступа

В настоящее время я разрабатываю serverbackand с Django (1.7), который должен обрабатывать аутентификацию через социальные сети, используя python-social-auth. Я следил за Tutorial на этом сайте, в котором описывается процесс простого Webapp. Это отлично работало для входа в Google и Twitter.

Поскольку сервер должен быть просто REST-FULL Backend, я решил получить токен доступа на стороне клиента и отправить его на сервер. Сервер будет аутентифицироваться вместе с ним. Этот процесс не должен быть проблемой и даже приведен в качестве примера в документах python-social-auth.

Однако, если я все сделаю, я получу ошибку, которая говорит: "Backend not Found 404".

Здесь минимальная часть проекта:

settings.py: (Я также включил API_KEY и SECRET)

AUTHENTICATION_BACKENDS = (
   #'social.backends.facebook.FacebookOAuth2',
   'social.backends.google.GoogleOAuth2',
   'social.backends.twitter.TwitterOAuth',
   'django.contrib.auth.backends.ModelBackend',
)

views.py(для просмотра аутентификации)

from django.contrib.auth import login

from social.apps.django_app.utils import psa

@psa('social:complete')
def register_by_access_token(request, backend):
    token = request.GET.get('access_token')
    user = request.backend.do_auth(request.GET.get('access_token'))
    if user:
        login(request, user)
        return 'OK'
    else:
        return 'ERROR'

Это я скопировал пролив из документов и только изменил backend.do_auth на request.backend.do_auth. Это, кажется, ошибка в документах.

urls.py:

...
url(r'^register-by-token/(?P<backend>[^/]+)/$', 'register_by_access_token')
...

Также, как указано в документах.

Я просто попытался заставить это работать только для google-oauth, потому что есть простой js-lib, который дает вам токен доступа. Это также сработало довольно хорошо, и я отправляю запрос на

GET http://localhost:8000/register-by-token/google-oauth2/<access-token>/

Как описано выше, возврат был 404 Бэкэнд не найден. Я немного отлаживал и выяснил, что ошибка возникает в функции входа, а не в функции do_auth() бэкэнд. Для этого выполняется настоящий процесс аутентификации. Я также попытался использовать случайную сгенерированную строку в качестве токена и получил соответствующую ошибку, что пользователь не может быть аутентифицирован.

Самое забавное, что у пользователя даже есть бэкенд, который содержит "social.backends.google.GoogleOAuth2", как и должно быть.

Спасибо, если вы останетесь со мной на длинный пост, и я надеюсь, что у кого-то есть идея, что может быть неправильным:). Ждем ваших ответов.

Ответы

Ответ 1

В представлении register_by_access_token вы получаете access_token в параметрах GET

user = request.backend.do_auth(request.GET.get('access_token'))

и URL-адрес, который вы определяете:

url(r'^register-by-token/(?P<backend>[^/]+)/$', 'register_by_access_token')

Итак, вам нужно запросить что-то вроде:

GET http://localhost:8000/register-by-token/google-oauth2/?access_token=<access_token>

тогда, когда вы делаете:

GET http://localhost:8000/register-by-token/google-oauth2/<access-token>/

Вы передаете access_token в параметрах url, что неверно.