Аутентификация аутентификации через 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, что неверно.