2014-11-15 3 views
3

Я нашел этот фрагмент кода, который помогает мне аутентифицировать пользователя, а затем создать для них токен rest_framework. Клиент, которого я использую, является родным андроидным приложением, и я получу токен доступа с клиентской стороны и отправлю его в django в классе ObtainAuth. Вот код для серверной части.Использование python social auth для регистрации пользователей по токену доступа

@psa('social:complete')  
def register_by_access_token(request, backend): 
    backend = request.strategy.backend 
    # Split by spaces and get the array 
    auth = get_authorization_header(request).split() 

    if not auth or auth[0].lower() != b'token': 
     msg = 'No token header provided.' 
     return msg 

    if len(auth) == 1: 
     msg = 'Invalid token header. No credentials provided.' 
     return msg 

    access_token = auth[1] 

    user = backend.do_auth(access_token) 

    return user  



class ObtainAuthToken(APIView): 
     model = Token 
     serializer_class = AuthTokenSerializer 
     parser_classes = (parsers.FormParser, parsers.MultiPartParser, parsers.JSONParser,) 
     renderer_classes = (renderers.JSONRenderer,) 


     def post(self,request): 
      serializer = self.serializer_class(data= request.DATA) 

     if backend == 'auth': 
      if serializer.is_valid: 
       token, created = Token.objects.get_or_create(user=serializer.object['user']) 
       if token: 
        return Response({'token': token.key}) 
       else:  
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 
      else: 

       user = register_by_access_token(request, backend) 

       if user and user.is_active: 
        token, created = Token.objects.get_or_create(user=user) 
       return Response({'id': user.id, 'email': user.email, 'firstname': user.first_name, 'userRole': 'user', 'token': token.key}) 

Метод register_by_access_token получит доступ facebook маркер, а затем создать пользователя с rest_framework.It принимает запрос и бэкенд будет использоваться «например фейсбук».

Если пользователь входит в систему с моим бэкэндом то Бэкэнд «Auth» и использует нормальный процесс получения электронной почты и пароль, а затем дать мне маркер use.As подробно here

Мой вопрос как я могу разместить бэкэнд аутентификации, будь то «facebook» или «auth», чтобы я мог получить токен?

Что я пробовал. Я попытался отправить бэкэнд-тип ('facebook' или 'auth') с токеном доступа, но я получаю сообщение об ошибке, что метод принимает 3 аргумента, и я только предоставил 2. Я попытался сделать URL-адрес бакэнду так:

url(r'^login/(?P<backend>[^/]+)/$',views.ObtainAuthToken.as_view()) 

затем посылает маркер доступа к URL, как этот mysite.com:8000/login/facebook.

Ни одна из этих работ не имеет большого опыта с psa или django, чтобы знать, как передать этот параметр.

Как отправить, какой бэкэнд использовать, чтобы его можно было принять методом? Если кто-нибудь когда-либо имел этот прецедент, пожалуйста, помогите мне.

+0

Вы пытались определить метод '' post'' для '' def post (self, request, backend) '' при использовании ''^login/(? P [^ /] +)/$ '' URL? – omab

ответ

0

согласно моему пониманию социального входа требует маркер доступа, поэтому, когда вы войти в систему с Facebook, когда вы называете «mysite.com:8000/login/facebook» он ожидает маркер доступа,

для моего проекта Я определил mu urls как 'url (r'^login/(? P [^ /] +)/$ ', register_by_access_token, name =' register_by_access_token ')', с токеном, который я отправляю, завершает логин, для facebook i отправьте бэкэнд как «facebook» для google, я отправлю backend как «google-oauth2», но в обоих случаях я отправляю токен с учетом моего соответствующего бэкэнд, когда вы не используете сторонний бэкэнд, вы не получите токен, и логин ожидает, что ,

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

Смежные вопросы