<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Pages Functions on Jamie Ede</title>
    <link>https://jamieede.com/tags/pages-functions/</link>
    <description>Recent content in Pages Functions on Jamie Ede</description>
    <generator>Hugo</generator>
    <language>en-US</language>
    <lastBuildDate>Fri, 26 Jun 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://jamieede.com/tags/pages-functions/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Hardened admin auth on Cloudflare Pages: JWT validation, AUD pinning, and pages.dev lockdown</title>
      <link>https://jamieede.com/posts/hardened-admin-auth-cloudflare-pages/</link>
      <pubDate>Fri, 26 Jun 2026 00:00:00 +0000</pubDate>
      <guid>https://jamieede.com/posts/hardened-admin-auth-cloudflare-pages/</guid>
      <description>&lt;p&gt;Every admin request to the &lt;a href=&#34;https://jamieede.com/posts/building-a-photography-portfolio-on-cloudflares-full-stack/&#34; &gt;photography portfolio&lt;/a&gt;&#xA; goes through three checks before it can touch a &lt;a href=&#34;https://developers.cloudflare.com/d1/&#34; target=&#34;_blank&#34; &gt;D1&lt;/a&gt;&#xA; row or a &lt;a href=&#34;https://developers.cloudflare.com/images/&#34; target=&#34;_blank&#34; &gt;Cloudflare Images&lt;/a&gt;&#xA; API call: the &lt;a href=&#34;https://developers.cloudflare.com/cloudflare-one/&#34; target=&#34;_blank&#34; &gt;Cloudflare Access&lt;/a&gt;&#xA; edge proves identity, the &lt;a href=&#34;https://developers.cloudflare.com/pages/functions/&#34; target=&#34;_blank&#34; &gt;Pages Function&lt;/a&gt;&#xA; verifies the JWT Access minted, and the verifier rejects anything whose audience claim does not match this specific application.&lt;/p&gt;&#xA;&lt;p&gt;This post is how that pipeline is built, why each layer is there, and the operational decisions around it.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
