class GoogleView(APIView):

    def post(self, request):
        # get id_token from post request
        token = {'id_token': request.data.get('id_token')}
        try:
            # verify google oauth2 token
            idinfo = id_token.verify_token(token['id_token'], requests.Request())
            
            # check audience
            if idinfo['aud'] not in [FIREBASE_ANDROID_APP_ID, FIREBASE_IOS_APP_ID]:
                raise ValueError('Could not verify audience.')

            # check issuer
            if idinfo['iss'] not in ['accounts.google.com', 'https://accounts.google.com']:
                raise ValueError('Wrong issuer.')

            # search for an existent user, if not, register
            if User.objects.filter(email=idinfo['email']).exists():
                user = User.objects.get(email=idinfo['email'])
            else:
                password = User.objects.make_random_password()
                user = User.objects.create_user(email=idinfo['email'], username=idinfo['email'],
                                                first_name=idinfo['given_name'],
                                                last_name=idinfo['family_name'],
                                                password=password)
                name = idinfo['email'].replace('@', '_').replace('.', '_') + '.png'
                
                # get user profile image and save it
                response = requester.get(idinfo['picture'], stream=True)
                if response.status_code != requester.codes.ok:
                    lf = tempfile.NamedTemporaryFile()
                    for block in response.iter_content(1024 * 8):
                        if not block:
                            break
                        lf.write(block)
                    user.image.save(name, files.File(lf))

            # handle JWT token generation for user 
            # authentication in the server
            jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
            jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
            payload = jwt_payload_handler(user)
            token = jwt_encode_handler(payload)
            
            # serialize user data and send it to your frontend 
            # or mobile application
            serializer = UserRegisterSerializer(user)
            return Response({'token': token, 'user': serializer.data})
        except ValueError as err:
            # Handle value exceptions
            content = {'message': err.__str__()}
            return Response(content, 500)