在Django中使用Python Social Auth token身份验证时发生值错误?

2024-04-20 04:54:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在向服务器发送一个Facebook令牌,以使用Python社交身份验证进行身份验证。在

在发送获取身份验证的帖子时,我得到的错误是:

Traceback: File "/Library/Python/2.7/site-packages/django/core/handlers/base.py" in get_response
  111.                     response = wrapped_callback(request, *callback_args, **callback_kwargs) File "/Library/Python/2.7/site-packages/django/views/decorators/csrf.py" in wrapped_view
  57.         return view_func(*args, **kwargs) File "/Library/Python/2.7/site-packages/django/views/generic/base.py" in view
  69.             return self.dispatch(request, *args, **kwargs) File "/Library/Python/2.7/site-packages/rest_framework/views.py" in dispatch
  407.             response = self.handle_exception(exc) File "/Library/Python/2.7/site-packages/rest_framework/views.py" in dispatch
  404.             response = handler(request, *args, **kwargs) File "/Users/vedantdasswain/GitRepositories/MovieMiner/Django/MovieMiner/mine/views.py" in post
  45.                 token, created = Token.objects.get_or_create(user=user) File "/Library/Python/2.7/site-packages/django/db/models/manager.py" in manager_method
  92.                 return getattr(self.get_queryset(), name)(*args, **kwargs) File "/Library/Python/2.7/site-packages/django/db/models/query.py" in get_or_create
  424.             return self._create_object_from_params(lookup, params) File "/Library/Python/2.7/site-packages/django/db/models/query.py" in _create_object_from_params
  454.         obj = self.model(**params) File "/Library/Python/2.7/site-packages/django/db/models/base.py" in __init__
  440.                 setattr(self, field.name, rel_obj) File "/Library/Python/2.7/site-packages/django/db/models/fields/related.py" in __set__
  597.                     self.field.rel.to._meta.object_name,

Exception Type: ValueError at /api-auth/facebook/ Exception Value: Cannot assign "<UserProfile: VedantDasSwain>": "Token.user" must be a "User" instance.

我使用的自定义用户模型如下所示:

^{pr2}$

这是处理请求的视图:

class ObtainAuthToken(APIView):
    throttle_classes = ()
    permission_classes = ()
    authentication_classes = ()
    parser_classes = (FormParser, MultiPartParser, JSONParser,)
    renderer_classes = (JSONRenderer,)
    serializer_class = AuthTokenSerializer
    model = Token

    # Accept backend as a parameter and 'auth' for a login / pass
    def post(self, request, backend):
        if backend == 'auth':
            serializer = self.serializer_class(data=request.DATA)
            if serializer.is_valid():
                token, created = Token.objects.get_or_create(user=serializer.object['user'])
                return Response({'token': token.key})
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
        else:
            # Here we call PSA to authenticate like we would if we used PSA on server side.
            print 'calling PSA'
            user = register_by_access_token(request, backend)
            # If user is active we get or create the REST token and send it back with user data
            if user and user.is_active:
                token, created = Token.objects.get_or_create(user=user)
                return Response({'id': user.id, 'name': user.username, 'userRole': 'user', 'token': token.key})


@psa(redirect_uri=None)
def register_by_access_token(request, backend):
    # Split by spaces and get the array
    auth = get_authorization_header(request).split()
    print auth

    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]
    print access_token

    # Real authentication takes place here
    user = request.backend.do_auth(access_token)
    print user
    return user

def get_authorization_header(request):
    print 'getting header'
    return request.META['HTTP_AUTHORIZATION']

我甚至在我的设置.py公司名称:

AUTH_PROFILE_MODULE = 'mine.UserProfile'
SOCIAL_AUTH_USER_MODEL = 'mine.UserProfile'

有人能帮我吗。我不明白我为什么会犯这个错误。谢谢。在


Tags: djangoinpyselftokenauthgetreturn