python - 使用python social auth通过访问 token 注册用户

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

我发现这段代码可以帮助我对用户进行身份验证,然后为他们创建一个 rest_framework token 。我使用的客户端是 native android 应用程序,我将从客户端获取访问 token 并将其发布到 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 访问 token ,然后使用 rest_framework 创建用户。它需要一个请求和要使用的后端,例如“facebook”。

如果用户使用我的后端登录,那么后端是“auth”,它使用检索电子邮件和密码的正常过程,然后给我一个要使用的 token 。详见 here

我的问题是如何发布身份验证后端(“facebook”或“auth”)以便我可以接收 token ?

我试过的。 我尝试使用访问 token 发送后端类型(“facebook”或“auth”),但我收到一个错误消息,该方法需要 3 个参数,而我只提供了 2 个。 我试过让 url 采用这样的后端:

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

然后将访问 token 发送到类似 mysite.com:8000/login/facebook 的 url。

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

如何发送要使用的后端,以便该方法可以接受它?如果有人遇到过这个用例,请帮助我。

最佳答案

根据我的理解,社交登录需要访问 token ,因此当您使用 facebook 登录时调用“mysite.com:8000/login/facebook”时,它需要访问 token ,

对于我的项目,我将我的 url 定义为 'url(r'^login/(?P[^/]+)/$',register_by_access_token,name='register_by_access_token')',使用我发送的 token 完成登录,对于 facebook,我将后端发送为“facebook”,对于谷歌,我将后端发送为“google-oauth2”,但在这两种情况下,我都在给定各自的后端发送 token ,当您不使用第三方后端时,您将无法获得 token 和登录期望的。

所以我的建议是,如果您要使用身份验证,请使用普通登录帖子,而不是相同的 URL。

关于python - 使用python social auth通过访问 token 注册用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26942843/

相关文章:

python - 如何为 DRF 模型编写 float 列表 ModelSerializer?

django - 将一些新属性/字段附加到 django rest 框架中的validated_data

python - Selenium webdriver用python来抓取动态页面找不到元素

python 图像抓取器在 bing 上无法正常工作

python - 导入 nltk 时 PyCharm 打印 'True'

Django:URL conf、url 模板标签的最佳实践

python - Django 的加载数据在有效日期给出 ValidationError

Django REST Framework 和 Vue.js 在发布时抛出 IntegrityError

python - Django REST Framework 序列化器验证错误

python - 在堆积条形图上显示总数