在Django中使用Python社交身份验证令牌身份验证时的ValueError?

时间:2015-02-12 08:48:05

标签: python django django-models python-social-auth

我正在使用Python Social Auth将Facebook令牌发送到我的服务器进行身份验证。

在发送POST以获取身份验证时,这是我得到的错误:

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.

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

class UserProfileManager(BaseUserManager):
    def create_user(self, email, username):
        user = self.model(email=email, 
                          username=username)
        return user

    def create_superuser(self, email, username):
        user = self.create_user(email, username)
        user.save()
        return user

# Create your models here.
class UserProfile(AbstractBaseUser):
        username = models.CharField(max_length=200)
        email = models.EmailField(max_length=200)
        location = models.CharField(max_length=200)
        birthday = models.DateField(blank=False)

        USERNAME_FIELD = 'username'
        REQUIRED_FIELDS = ['email','username']

        objects = UserProfileManager()

        class Meta:
            db_table = u'user_profile'

这是处理请求的视图:

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']

我甚至在settings.py中添加了以下几行:

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

有人可以帮助我吗?我无法理解为什么我会收到此错误。感谢。

1 个答案:

答案 0 :(得分:0)

UserProfileManager类中的create_user func不保存用户。尝试添加user.save()