<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: pizzacat83</title>
    <description>The latest articles on DEV Community by pizzacat83 (@pizzacat83).</description>
    <link>https://dev.to/pizzacat83</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F865723%2Fbef824db-501c-4322-8188-6a03c9b9be48.png</url>
      <title>DEV Community: pizzacat83</title>
      <link>https://dev.to/pizzacat83</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pizzacat83"/>
    <language>en</language>
    <item>
      <title>A Useful Custom Function to Debug Firestore Security Rules</title>
      <dc:creator>pizzacat83</dc:creator>
      <pubDate>Sat, 21 May 2022 11:57:52 +0000</pubDate>
      <link>https://dev.to/pizzacat83/a-useful-custom-function-to-debug-firestore-security-rules-2p9g</link>
      <guid>https://dev.to/pizzacat83/a-useful-custom-function-to-debug-firestore-security-rules-2p9g</guid>
      <description>&lt;p&gt;Firestore security rules provide a function &lt;a href="https://firebase.google.com/docs/reference/rules/rules.debug#debug"&gt;&lt;code&gt;debug&lt;/code&gt;&lt;/a&gt;, which logs the given value to &lt;code&gt;firestore-debug.log&lt;/code&gt; (only when using the Firestore Emulator; it's no-op in production). But it just prints the value, with no information on its context. When your security rule doesn't work as expected, you might wrap every suspicious expression with &lt;code&gt;debug&lt;/code&gt; and then struggle to figure out the correspondence between each log entires and the plenty calls to &lt;code&gt;debug&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;What if there's a function to log custom messages that explain why the request is denied? Like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;
&lt;span class="nx"&gt;allow&lt;/span&gt; &lt;span class="kd"&gt;get&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt;
  &lt;span class="c1"&gt;// logs "not admin" if the user's role is not admin&lt;/span&gt;
  &lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;role&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;admin&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;not admin&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
  &lt;span class="c1"&gt;// logs "email is not verified" if email_verified is false&lt;/span&gt;
  &lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email_verified&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;email is not verified&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Actually, you can implement this &lt;code&gt;assert&lt;/code&gt; function! The definition is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;condition&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When &lt;code&gt;condition&lt;/code&gt; is truthy, it just returns &lt;code&gt;condition&lt;/code&gt;. Otherwise, it logs &lt;code&gt;message&lt;/code&gt; to &lt;code&gt;firestore-debug.log&lt;/code&gt; and returns &lt;code&gt;false&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I hope this function helps you debug your security rules!&lt;/p&gt;

</description>
      <category>firestore</category>
      <category>firebase</category>
    </item>
  </channel>
</rss>
