title: request.auth.uid seems to always be null in Cloud Firestore rules
body: <p>I must be missing something really basic here... but any time I make a call to my Cloud Firestore db and I try to institute any kind of rules for security, they always fail. </p>
  
  <p>Doing something like </p>
  
  <p><div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false">
  <div class="snippet-code">
  <pre class="snippet-code-js lang-js prettyprint-override"><code>    match /users/{userId} {
        allow create, read, update: if true;
      }</code></pre>
  </div>
  </div>
  </p>
  
  <p>works, but it obviously defeats the point. However, if I do any kind of additional scrutiny, such as the go-to example in all the docs like</p>
  
  <p><div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false">
  <div class="snippet-code">
  <pre class="snippet-code-js lang-js prettyprint-override"><code>    match /users/{userId} {
        allow create, read, update: if request.auth.uid != null;
      }</code></pre>
  </div>
  </div>
  </p>
  
  <p>it fails every time. Am I missing something obvious in how I'm wiring together my client side code?</p>
  
  <p>Here's my client side code that logs the user in, and then makes a call to the db to grab a user. 
  (Note that in my db the keys for the users are by email, not by uid)</p>
  
  <p><div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false">
  <div class="snippet-code">
  <pre class="snippet-code-js lang-js prettyprint-override"><code>// this is a snippet from the code where I log the user in
  firebase.auth().signInWithEmailAndPassword(email, FIREBASE_USER_PASSWORD)
              .then(user =&gt; {
              // the user comes back successfully logged in, 
              // I grab its uid and add it to a preparedUser object that I've been building, 
              // then pass this user to my getFirestoreUserObject function
                  preparedUser.uid = user.uid;
                  getFirestoreUserObject({dispatch, user: preparedUser, navigate});
              })
              
  // then the getFirestoreUserObject function:
  // note that all the code below works fine when there are no security rules in place
  
  const getFirestoreUserObject = ({dispatch, user, navigate}) =&gt; {
      const {name, email, imageUrl} = user;
      // if I ask for currentUser here, I get back my logged in user
      const currentUser = firebase.auth().currentUser;
  
      // email is defined correctly here as the user's email
      firebase.firestore().collection('users').doc(`${email}`)
          .get() // the request fails here due to insufficient permissions
          .then(doc =&gt; {
              if (doc.exists) {
                  const currentUser = doc.data();
  
                  getUserFavorites({dispatch, currentUser, navigate});
              } else {
                  createUserInFirestore({dispatch, user, navigate});
              }
          })
  };</code></pre>
  </div>
  </div>
  </p>
  
  <p>Is there something obvious that I'm missing? If I log a user in via <code>firebase.auth()</code>, and then immediately after call <code>firebase.firestore()</code>, shouldn't that have the context of the auth'd user? If not, how do I pass it to the firestore call?</p>
  
  <p>Thanks!</p>