title: oauth2client.clientsecrets.InvalidClientSecretsError: Missing property "redirect_uris" in a client type of "web"
body: <p>I am trying to send Gmail from a Python script to myself, and have the following code that used to be working:</p>
  
  <pre><code>#!/usr/bin/env python
  
  import base64
  from email.mime.audio import MIMEAudio
  from email.mime.base import MIMEBase
  from email.mime.image import MIMEImage
  from email.mime.multipart import MIMEMultipart
  from email.mime.text import MIMEText
  import mimetypes
  import os
  import httplib2
  
  from apiclient import discovery
  import oauth2client
  from oauth2client import client
  from oauth2client import tools
  from apiclient import errors
  
  from config import MY_EMAIL, CLIENT_SECRET_FILE
  
  SCOPES = 'https://www.googleapis.com/auth/gmail.compose'
  APPLICATION_NAME = 'Gmail API Python Quickstart'
  
  try:
      import argparse
      flags = argparse.ArgumentParser(parents=[tools.argparser]).parse_args()
  except ImportError:
      flags = None
  
  def send_message(service, user_id, message):
    """Send an email message.
  
    Args:
      service: Authorized Gmail API service instance.
      user_id: User's email address. The special value "me"
      can be used to indicate the authenticated user.
      message: Message to be sent.
  
    Returns:
      Sent Message.
    """
    try:
      message = (service.users().messages().send(userId=user_id, body=message)
                 .execute())
      print('Message Id: %s' % message['id'])
      return message
    except errors.HttpError as error:
      print('An error occurred: %s' % error)
  
  
  def create_message(sender, to, subject, message_text):
    """Create a message for an email.
  
    Args:
      sender: Email address of the sender.
      to: Email address of the receiver.
      subject: The subject of the email message.
      message_text: The text of the email message.
  
    Returns:
      An object containing a base64url encoded email object.
    """
    message = MIMEText(message_text)
    message['to'] = to
    message['from'] = sender
    message['subject'] = subject
    return {'raw': base64.urlsafe_b64encode(message.as_string())}
  
  
  def get_credentials():
      """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,
                                     'sendEmail.json')
  
      store = oauth2client.file.Storage(credential_path)
      credentials = store.get()
      if not credentials or credentials.invalid:
          flow = client.flow_from_clientsecrets(CLIENT_SECRET_FILE, SCOPES)
          flow.user_agent = APPLICATION_NAME
          if flags:
              credentials = tools.run_flow(flow, store, flags)
          else: # Needed only for compatibility with Python 2.6
              credentials = tools.run(flow, store)
          print('Storing credentials to ' + credential_path)
      return credentials
  
  
  def send_email(sender=MY_EMAIL, receiver=MY_EMAIL, subject=None, body=None):
      print("sending email to: %s, from: %s" % (receiver, sender))
      if not body:
          raise Exception("You need a body to send an email")
      credentials = get_credentials()
      http = credentials.authorize(httplib2.Http())
      service = discovery.build('gmail', 'v1', http=http)
      send_message(service, "me", create_message(sender, receiver, subject, body))
  
  
  if __name__ == "__main__":
      send_email(subject="Test gmail automatic emails", body="Hello world")
  </code></pre>
  
  <p>My client_secret.json looks like</p>
  
  <pre><code>{"web":{"client_id":"23423423423-234234234.apps.googleusercontent.com","project_id":"prime-imagery-4444","auth_uri":"https://accounts.google.com/o/oauth2/auth","token_uri":"https://accounts.google.com/o/oauth2/token","auth_provider_x509_cert_url":"https://www.googleapis.com/oauth2/v1/certs","client_secret":"asdfasdfasdf-trWCLxFdb", "redirect_uris": ["http://localhost:8000/fakeurl"]}}
  </code></pre>
  
  <p>I added in <code>redirect_uris</code> as that was the only good advice I found online, but I don't want to redirect. Last time I ran this script, having the <code>client_secret</code> was enough to send Gmails from my Gmail account using Python.</p>