使用python social auth通过访问令牌注册用户

时间:2014-11-15 05:20:24

标签: python django django-rest-framework python-social-auth

我找到了这段代码,可以帮助我验证用户身份,然后为他们创建rest_framework令牌。我使用的客户端是一个原生的Android应用程序,我将从客户端获取访问令牌,并将其发布到ObtainAuth类中的django。 这是服务器端的代码。

@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创建一个用户。它接受请求并使用后端,例如'facebook'。

如果用户使用我的后端登录,那么后端是'auth',它使用检索电子邮件和密码的正常过程,然后给我一个令牌供我使用。详细here

我的问题是如何将身份验证后端发布为'facebook'或'auth'以便我可以收到令牌?

我尝试过的。 我尝试使用访问令牌发送后端类型('facebook'或'auth'),但是我得到一个错误,该方法需要3个参数,而我只提供了2个。 我试过让网址像这样一个后端:

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

然后将访问令牌发送到类似于mysite.com:8000/login/facebook的网址。

这些都不起作用,我对psa或django没有多少经验知道如何传递这个参数。

如何发送使用哪个后端以便方法可以接受?如果有人曾经有这个用例,请帮助我。

1 个答案:

答案 0 :(得分:1)

根据我的理解,社交登录需要一个访问令牌,所以当你在调用'mysite.com:8000/login/facebook'登录facebook时,它会期待一个访问令牌,

对于我的项目我将我的网址定义为'url(r'^ login /(?P [^ /] +)/ $',register_by_access_token,name ='register_by_access_token')',其中我发送的令牌完成登录,对于Facebook我发送后端作为'facebook'谷歌我发送后端作为'谷歌oauth2',但两种情况我发送一个令牌给我我各自的后端,当你没有使用第三方后端你不会得到令牌和登录期望。

所以我的建议是,如果你要使用auth使用正常的登录帖子,而不是相同的URL。