def _get_credentials(self):
        """
        Gets valid user credentials from storage.

        If nothing has been stored, or if the stored credentials are invalid,
        the OAuth2 flow is completed to obtain the new credentials.

        Returns:
            Credentials, the obtained credential.
        """

        home_dir = os.path.expanduser('~')
        credential_dir = os.path.join(home_dir, '.credentials')

        if not os.path.exists(credential_dir):
            os.makedirs(credential_dir)

        credential_path = os.path.join(
            credential_dir,
            'bernard.sheets-sync.json',
        )

        store = Storage(credential_path)
        credentials = store.get()

        if not credentials or credentials.invalid:
            with NamedTemporaryFile(suffix='.json') as f:
                data = ujson.dumps(settings.GOOGLE_SHEET_SYNC['credentials'])
                f.write(data.encode('utf-8'))
                f.flush()
                flow = client.flow_from_clientsecrets(f.name, SCOPES)

            flow.user_agent = APPLICATION_NAME
            credentials = tools.run_flow(flow, store, self.flags)
            print('Storing credentials to ' + credential_path)

        return credentials