【问题标题】:django facebook and user password authenticationdjango facebook和用户密码认证
【发布时间】:2016-09-19 22:19:05
【问题描述】:

我是 django 的新手,我需要使用用户名和密码或 facebook 登录,我正在使用 api 端点的 rest 框架。 ¿ 我该怎么做?

我尝试:

django-rest-framework-social-oauth2 但不适用于我,因为我需要在第一次输入后保存用户的其他信息。

我希望有 2 个端点,一个发送用户和密码,另一个发送 facebook 身份验证令牌

【问题讨论】:

    标签: django login


    【解决方案1】:

    这是 Django Rest Framework 的用户登录示例代码:

    class Login(APIView):
    
        @csrf_exempt
        def dispatch(self, *args, **kwargs):
            return super(Login, self).dispatch(*args, **kwargs)
    
        @staticmethod
        def post(request):
            request_data = JSONParser().parse(request)
    
            if 'email' in request_data and 'password' in request_data:
                try:
                    validate_email(request_data['email'])
                except ValidationError:
                    return JsonResponse({'result': 'E-mail is invalid'}, status=400)
    
                user = authenticate(email=request_data['email'], password=request_data['password'])
    
                if user is not None:
                    if user.is_active:
                        try:
                            token = Token.objects.get(user=user)
                        except Token.DoesNotExist:
                            token = Token.objects.create(user=user)
    
                        return JsonResponse({'result': 'success', 'token': token.key, 'id': user.id}, status=200)
    
                return JsonResponse({'result': 'E-mail or password is incorrect'}, status=400)
    
            return JsonResponse({'result': 'E-mail or password is empty'}, status=400)
    

    这是 Django Rest Framework 的 FB 登录代码示例(来自我的测试项目):

    class FbLogin(APIView):
        authentication_classes = (authentication.TokenAuthentication,)
        permission_classes = (permissions.AllowAny,)
    
        @csrf_exempt
        def dispatch(self, *args, **kwargs):
            return super(FbLogin, self).dispatch(*args, **kwargs)
    
        @staticmethod
        def post(request):
            request_data = JSONParser().parse(request)
    
            if 'access_token' in request_data:
                response = requests.get(
                    url='https://graph.facebook.com/v2.5/me/',
                    params={
                        'access_token': request_data['access_token'],
                        'fields': 'email,first_name,last_name',
                    },
                )
    
                json_response = json.loads(response.text)
    
                if 'error' not in json_response:
                    response_photo = requests.get(
                        url='https://graph.facebook.com/v2.5/%s/picture' % json_response['id'],
                        params={
                            'redirect': 'false',
                            'type': 'large',
                        },
                    )
                    response_photo_json = json.loads(response_photo.text)
    
                    response_friends = requests.get(
                        url='https://graph.facebook.com/v2.5/me/friends/',
                        params={
                            'access_token': request_data['access_token'],
                            'limit': 300,
                        },
                    )
    
                    generated_password = get_random_string(10, '0123456789abcdefghijklmnopqrstuvwxyz')
                    try:
                        json_response_email = json_response['email']
                    except:
                        first_name = json_response['first_name'].lower()
                        last_name = json_response['last_name'].lower()
                        id = json_response['id']
                        json_response_email = first_name + last_name + id + '@facebook.com'
                    try:
                        current_user = User.objects.get(email=json_response_email)
                        current_user.set_password(generated_password)
                        current_user.save()
                    except User.DoesNotExist:
                        new_user = User.objects.create_user(email=json_response_email,
                                                            password=generated_password)
    
                        new_user.provider_id = json_response['id']
                        new_user.provider_type = 'facebook'
    
                        if 'first_name' in json_response:
                            new_user.first_name = json_response['first_name']
    
                        if 'last_name' in json_response:
                            new_user.last_name = json_response['last_name']
    
                        new_user.save()
    
                        photo_name = urlparse(response_photo_json['data']['url']).path.split('/')[-1].split('?')[-1]
                        photo_content = urllib.request.urlretrieve(response_photo_json['data']['url'])
    
                        new_user.profile_photo.save(photo_name, File(open(photo_content[0], 'rb')), save=True)
                    user = authenticate(email=json_response_email, password=generated_password)
                    try:
                        token = Token.objects.get(user=user)
                    except Token.DoesNotExist:
                        token = Token.objects.create(user=user)
                    if user is not None:
                        if user.is_active:
                                fullname = json_response['first_name'] + ' ' + json_response['last_name']
                                return JsonResponse({'result': 'success', 'token': token.key, 'name': fullname}, status=200)
    
                return JsonResponse({'result': 'User access token is incorrect'}, status=400)
    

    【讨论】:

      猜你喜欢
      • 2011-08-23
      • 1970-01-01
      • 1970-01-01
      • 2015-12-16
      • 1970-01-01
      • 1970-01-01
      • 2011-02-07
      • 1970-01-01
      • 2019-08-10
      相关资源
      最近更新 更多