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)