CINXE.COM
FedCM updates: Origin trials for the Continuation API bundle and Storage Access API auto-grant | Privacy Sandbox | Google for Developers
<!doctype html> <html lang="en" dir="ltr"> <head> <meta name="google-signin-client-id" content="721724668570-nbkv1cfusk7kk4eni4pjvepaus73b13t.apps.googleusercontent.com"> <meta name="google-signin-scope" content="profile email https://www.googleapis.com/auth/developerprofiles https://www.googleapis.com/auth/developerprofiles.award"> <meta property="og:site_name" content="Google for Developers"> <meta property="og:type" content="website"><meta name="theme-color" content="#fff"><meta charset="utf-8"> <meta content="IE=Edge" http-equiv="X-UA-Compatible"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="manifest" href="/_pwa/developers/manifest.json" crossorigin="use-credentials"> <link rel="preconnect" href="//www.gstatic.com" crossorigin> <link rel="preconnect" href="//fonts.gstatic.com" crossorigin> <link rel="preconnect" href="//fonts.googleapis.com" crossorigin> <link rel="preconnect" href="//apis.google.com" crossorigin> <link rel="preconnect" href="//www.google-analytics.com" crossorigin><link rel="stylesheet" href="//fonts.googleapis.com/css?family=Google+Sans:400,500|Roboto:400,400italic,500,500italic,700,700italic|Roboto+Mono:400,500,700&display=swap"> <link rel="stylesheet" href="//fonts.googleapis.com/css2?family=Material+Icons&family=Material+Symbols+Outlined&display=block"><link rel="stylesheet" href="https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/developers/css/app.css"> <link rel="shortcut icon" href="https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/developers/images/favicon-new.png"> <link rel="apple-touch-icon" href="https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/developers/images/touchicon-180-new.png"><link rel="canonical" href="https://developers.google.com/privacy-sandbox/blog/fedcm-chrome-126-updates"><link rel="search" type="application/opensearchdescription+xml" title="Google for Developers" href="https://developers.google.com/s/opensearch.xml"> <link rel="alternate" hreflang="en" href="https://developers.google.com/privacy-sandbox/blog/fedcm-chrome-126-updates" /><link rel="alternate" hreflang="x-default" href="https://developers.google.com/privacy-sandbox/blog/fedcm-chrome-126-updates" /><link rel="alternate" hreflang="ar" href="https://developers.google.com/privacy-sandbox/blog/fedcm-chrome-126-updates?hl=ar" /><link rel="alternate" hreflang="bn" href="https://developers.google.com/privacy-sandbox/blog/fedcm-chrome-126-updates?hl=bn" /><link rel="alternate" hreflang="zh-Hans" href="https://developers.google.com/privacy-sandbox/blog/fedcm-chrome-126-updates?hl=zh-cn" /><link rel="alternate" hreflang="zh-Hant" href="https://developers.google.com/privacy-sandbox/blog/fedcm-chrome-126-updates?hl=zh-tw" /><link rel="alternate" hreflang="fa" href="https://developers.google.com/privacy-sandbox/blog/fedcm-chrome-126-updates?hl=fa" /><link rel="alternate" hreflang="fr" href="https://developers.google.com/privacy-sandbox/blog/fedcm-chrome-126-updates?hl=fr" /><link rel="alternate" hreflang="de" href="https://developers.google.com/privacy-sandbox/blog/fedcm-chrome-126-updates?hl=de" /><link rel="alternate" hreflang="he" href="https://developers.google.com/privacy-sandbox/blog/fedcm-chrome-126-updates?hl=he" /><link rel="alternate" hreflang="hi" href="https://developers.google.com/privacy-sandbox/blog/fedcm-chrome-126-updates?hl=hi" /><link rel="alternate" hreflang="id" href="https://developers.google.com/privacy-sandbox/blog/fedcm-chrome-126-updates?hl=id" /><link rel="alternate" hreflang="it" href="https://developers.google.com/privacy-sandbox/blog/fedcm-chrome-126-updates?hl=it" /><link rel="alternate" hreflang="ja" href="https://developers.google.com/privacy-sandbox/blog/fedcm-chrome-126-updates?hl=ja" /><link rel="alternate" hreflang="ko" href="https://developers.google.com/privacy-sandbox/blog/fedcm-chrome-126-updates?hl=ko" /><link rel="alternate" hreflang="pl" href="https://developers.google.com/privacy-sandbox/blog/fedcm-chrome-126-updates?hl=pl" /><link rel="alternate" hreflang="pt-BR" href="https://developers.google.com/privacy-sandbox/blog/fedcm-chrome-126-updates?hl=pt-br" /><link rel="alternate" hreflang="ru" href="https://developers.google.com/privacy-sandbox/blog/fedcm-chrome-126-updates?hl=ru" /><link rel="alternate" hreflang="es-419" href="https://developers.google.com/privacy-sandbox/blog/fedcm-chrome-126-updates?hl=es-419" /><link rel="alternate" hreflang="th" href="https://developers.google.com/privacy-sandbox/blog/fedcm-chrome-126-updates?hl=th" /><link rel="alternate" hreflang="tr" href="https://developers.google.com/privacy-sandbox/blog/fedcm-chrome-126-updates?hl=tr" /><link rel="alternate" hreflang="vi" href="https://developers.google.com/privacy-sandbox/blog/fedcm-chrome-126-updates?hl=vi" /><title>FedCM updates: Origin trials for the Continuation API bundle and Storage Access API auto-grant | Privacy Sandbox | Google for Developers</title> <meta property="og:title" content="FedCM updates: Origin trials for the Continuation API bundle and Storage Access API auto-grant | Privacy Sandbox | Google for Developers"><meta name="description" content="Chrome 126 starts origin trials for the Continuation API bundle and Storage Access API auto-grant"> <meta property="og:description" content="Chrome 126 starts origin trials for the Continuation API bundle and Storage Access API auto-grant"><meta property="og:url" content="https://developers.google.com/privacy-sandbox/blog/fedcm-chrome-126-updates"><meta property="og:image" content="https://developers.google.com/static/privacy-sandbox/assets/images/privacy-sandbox-for-developers.png"> <meta property="og:image:width" content="1600"> <meta property="og:image:height" content="900"><meta property="og:locale" content="en"><meta name="twitter:card" content="summary_large_image"><script type="application/ld+json"> { "@context": "https://schema.org", "@type": "BreadcrumbList", "itemListElement": [{ "@type": "ListItem", "position": 1, "name": "Privacy Sandbox", "item": "https://developers.google.com/privacy-sandbox" },{ "@type": "ListItem", "position": 2, "name": "FedCM updates: Origin trials for the Continuation API bundle and Storage Access API auto-grant", "item": "https://developers.google.com/privacy-sandbox/blog/fedcm-chrome-126-updates" }] } </script> <link rel="stylesheet" href="/extras.css"></head> <body class="" template="page" theme="white" type="blog" layout="docs" concierge='closed' display-toc pending> <devsite-progress type="indeterminate" id="app-progress"></devsite-progress> <section class="devsite-wrapper"> <devsite-cookie-notification-bar></devsite-cookie-notification-bar><devsite-header role="banner"> <div class="devsite-header--inner nocontent"> <div class="devsite-top-logo-row-wrapper-wrapper"> <div class="devsite-top-logo-row-wrapper"> <div class="devsite-top-logo-row"> <button type="button" id="devsite-hamburger-menu" class="devsite-header-icon-button button-flat material-icons gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Navigation menu button" visually-hidden aria-label="Open menu"> </button> <div class="devsite-product-name-wrapper"> <a href="https://developers.google.com/privacy-sandbox"> <div class="devsite-product-logo-container" size="medium" > <picture> <img class="devsite-product-logo" alt="Privacy Sandbox" src="https://developers.google.com/static/privacy-sandbox/assets/images/privacy-sandbox-logo.png" srcset="https://developers.google.com/static/privacy-sandbox/assets/images/privacy-sandbox-logo_36.png 36w, https://developers.google.com/static/privacy-sandbox/assets/images/privacy-sandbox-logo_48.png 48w, https://developers.google.com/static/privacy-sandbox/assets/images/privacy-sandbox-logo_72.png 72w, https://developers.google.com/static/privacy-sandbox/assets/images/privacy-sandbox-logo_96.png 96w, https://developers.google.com/static/privacy-sandbox/assets/images/privacy-sandbox-logo_480.png 480w, https://developers.google.com/static/privacy-sandbox/assets/images/privacy-sandbox-logo_720.png 720w, https://developers.google.com/static/privacy-sandbox/assets/images/privacy-sandbox-logo_856.png 856w, https://developers.google.com/static/privacy-sandbox/assets/images/privacy-sandbox-logo_960.png 960w, https://developers.google.com/static/privacy-sandbox/assets/images/privacy-sandbox-logo_1440.png 1440w, https://developers.google.com/static/privacy-sandbox/assets/images/privacy-sandbox-logo_1920.png 1920w, https://developers.google.com/static/privacy-sandbox/assets/images/privacy-sandbox-logo_2880.png 2880w" sizes="64px" loading="lazy" > </picture> </div> </a> <span class="devsite-product-name"> <ul class="devsite-breadcrumb-list" > <li class="devsite-breadcrumb-item "> <a href="https://developers.google.com/privacy-sandbox" class="devsite-breadcrumb-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Upper Header" data-value="1" track-type="globalNav" track-name="breadcrumb" track-metadata-position="1" track-metadata-eventdetail="Privacy Sandbox" > Privacy Sandbox </a> </li> </ul> </span> </div> <div class="devsite-top-logo-row-middle"> <div class="devsite-header-upper-tabs"> <devsite-tabs class="upper-tabs"> <nav class="devsite-tabs-wrapper" aria-label="Upper tabs"> <tab > <a href="https://developers.google.com/privacy-sandbox" track-metadata-eventdetail="https://developers.google.com/privacy-sandbox" class="devsite-tabs-content gc-analytics-event " track-type="nav" track-metadata-position="nav - overview" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Overview" track-name="overview" > Overview </a> </tab> <tab > <a href="https://developers.google.com/privacy-sandbox/cookies" track-metadata-eventdetail="https://developers.google.com/privacy-sandbox/cookies" class="devsite-tabs-content gc-analytics-event " track-type="nav" track-metadata-position="nav - cookies" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Cookies" track-name="cookies" > Cookies </a> </tab> <tab > <a href="https://developers.google.com/privacy-sandbox/private-advertising" track-metadata-eventdetail="https://developers.google.com/privacy-sandbox/private-advertising" class="devsite-tabs-content gc-analytics-event " track-type="nav" track-metadata-position="nav - private advertising" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Private advertising" track-name="private advertising" > Private advertising </a> </tab> <tab > <a href="https://developers.google.com/privacy-sandbox/protections" track-metadata-eventdetail="https://developers.google.com/privacy-sandbox/protections" class="devsite-tabs-content gc-analytics-event " track-type="nav" track-metadata-position="nav - privacy protections" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Privacy protections" track-name="privacy protections" > Privacy protections </a> </tab> <tab > <a href="https://developers.google.com/privacy-sandbox/learn" track-metadata-eventdetail="https://developers.google.com/privacy-sandbox/learn" class="devsite-tabs-content gc-analytics-event " track-type="nav" track-metadata-position="nav - learn" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Learn" track-name="learn" > Learn </a> </tab> <tab > <a href="https://developers.google.com/privacy-sandbox/blog" track-metadata-eventdetail="https://developers.google.com/privacy-sandbox/blog" class="devsite-tabs-content gc-analytics-event " track-type="nav" track-metadata-position="nav - blog" track-metadata-module="primary nav" data-category="Site-Wide Custom Events" data-label="Tab: Blog" track-name="blog" > Blog </a> </tab> </nav> </devsite-tabs> </div> <devsite-search enable-signin enable-search enable-suggestions enable-query-completion project-name="Privacy Sandbox" tenant-name="Google for Developers" project-scope="/privacy-sandbox" url-scoped="https://developers.google.com/s/results/privacy-sandbox" > <form class="devsite-search-form" action="https://developers.google.com/s/results" method="GET"> <div class="devsite-search-container"> <button type="button" search-open class="devsite-search-button devsite-header-icon-button button-flat material-icons" aria-label="Open search"></button> <div class="devsite-searchbox"> <input aria-activedescendant="" aria-autocomplete="list" aria-label="Search" aria-expanded="false" aria-haspopup="listbox" autocomplete="off" class="devsite-search-field devsite-search-query" name="q" placeholder="Search" role="combobox" type="text" value="" > <div class="devsite-search-image material-icons" aria-hidden="true"> </div> <div class="devsite-search-shortcut-icon-container" aria-hidden="true"> <kbd class="devsite-search-shortcut-icon">/</kbd> </div> </div> </div> </form> <button type="button" search-close class="devsite-search-button devsite-header-icon-button button-flat material-icons" aria-label="Close search"></button> </devsite-search> </div> <devsite-language-selector> <ul role="presentation"> <li role="presentation"> <a role="menuitem" lang="en" >English</a> </li> <li role="presentation"> <a role="menuitem" lang="de" >Deutsch</a> </li> <li role="presentation"> <a role="menuitem" lang="es" >Español</a> </li> <li role="presentation"> <a role="menuitem" lang="es_419" >Español – América Latina</a> </li> <li role="presentation"> <a role="menuitem" lang="fr" >Français</a> </li> <li role="presentation"> <a role="menuitem" lang="id" >Indonesia</a> </li> <li role="presentation"> <a role="menuitem" lang="it" >Italiano</a> </li> <li role="presentation"> <a role="menuitem" lang="pl" >Polski</a> </li> <li role="presentation"> <a role="menuitem" lang="pt_br" >Português – Brasil</a> </li> <li role="presentation"> <a role="menuitem" lang="vi" >Tiếng Việt</a> </li> <li role="presentation"> <a role="menuitem" lang="tr" >Türkçe</a> </li> <li role="presentation"> <a role="menuitem" lang="ru" >Русский</a> </li> <li role="presentation"> <a role="menuitem" lang="he" >עברית</a> </li> <li role="presentation"> <a role="menuitem" lang="ar" >العربيّة</a> </li> <li role="presentation"> <a role="menuitem" lang="fa" >فارسی</a> </li> <li role="presentation"> <a role="menuitem" lang="hi" >हिंदी</a> </li> <li role="presentation"> <a role="menuitem" lang="bn" >বাংলা</a> </li> <li role="presentation"> <a role="menuitem" lang="th" >ภาษาไทย</a> </li> <li role="presentation"> <a role="menuitem" lang="zh_cn" >中文 – 简体</a> </li> <li role="presentation"> <a role="menuitem" lang="zh_tw" >中文 – 繁體</a> </li> <li role="presentation"> <a role="menuitem" lang="ja" >日本語</a> </li> <li role="presentation"> <a role="menuitem" lang="ko" >한국어</a> </li> </ul> </devsite-language-selector> <a class="devsite-header-link devsite-top-button button gc-analytics-event" href="//privacysandbox.com/" data-category="Site-Wide Custom Events" data-label="Site header link" > Home </a> <devsite-user enable-profiles fp-auth id="devsite-user"> <span class="button devsite-top-button" aria-hidden="true" visually-hidden>Sign in</span> </devsite-user> </div> </div> </div> <div class="devsite-collapsible-section devsite-header-no-lower-tabs "> <div class="devsite-header-background"> </div> </div> </div> </devsite-header> <devsite-book-nav scrollbars hidden> <div class="devsite-book-nav-filter" hidden> <span class="filter-list-icon material-icons" aria-hidden="true"></span> <input type="text" placeholder="Filter" aria-label="Type to filter" role="searchbox"> <span class="filter-clear-button hidden" data-title="Clear filter" aria-label="Clear filter" role="button" tabindex="0"></span> </div> <nav class="devsite-book-nav devsite-nav nocontent" aria-label="Side menu"> <div class="devsite-mobile-header"> <button type="button" id="devsite-close-nav" class="devsite-header-icon-button button-flat material-icons gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Close navigation" aria-label="Close navigation"> </button> <div class="devsite-product-name-wrapper"> <a href="https://developers.google.com/privacy-sandbox"> <div class="devsite-product-logo-container" size="medium" > <picture> <img class="devsite-product-logo" alt="Privacy Sandbox" src="https://developers.google.com/static/privacy-sandbox/assets/images/privacy-sandbox-logo.png" srcset="https://developers.google.com/static/privacy-sandbox/assets/images/privacy-sandbox-logo_36.png 36w, https://developers.google.com/static/privacy-sandbox/assets/images/privacy-sandbox-logo_48.png 48w, https://developers.google.com/static/privacy-sandbox/assets/images/privacy-sandbox-logo_72.png 72w, https://developers.google.com/static/privacy-sandbox/assets/images/privacy-sandbox-logo_96.png 96w, https://developers.google.com/static/privacy-sandbox/assets/images/privacy-sandbox-logo_480.png 480w, https://developers.google.com/static/privacy-sandbox/assets/images/privacy-sandbox-logo_720.png 720w, https://developers.google.com/static/privacy-sandbox/assets/images/privacy-sandbox-logo_856.png 856w, https://developers.google.com/static/privacy-sandbox/assets/images/privacy-sandbox-logo_960.png 960w, https://developers.google.com/static/privacy-sandbox/assets/images/privacy-sandbox-logo_1440.png 1440w, https://developers.google.com/static/privacy-sandbox/assets/images/privacy-sandbox-logo_1920.png 1920w, https://developers.google.com/static/privacy-sandbox/assets/images/privacy-sandbox-logo_2880.png 2880w" sizes="64px" loading="lazy" > </picture> </div> </a> <span class="devsite-product-name"> <ul class="devsite-breadcrumb-list" > <li class="devsite-breadcrumb-item "> <a href="https://developers.google.com/privacy-sandbox" class="devsite-breadcrumb-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Upper Header" data-value="1" track-type="globalNav" track-name="breadcrumb" track-metadata-position="1" track-metadata-eventdetail="Privacy Sandbox" > Privacy Sandbox </a> </li> </ul> </span> </div> </div> <div class="devsite-book-nav-wrapper"> <div class="devsite-mobile-nav-top"> <ul class="devsite-nav-list"> <li class="devsite-nav-item"> <a href="/privacy-sandbox" class="devsite-nav-title gc-analytics-event devsite-nav-has-children " data-category="Site-Wide Custom Events" data-label="Tab: Overview" track-name="overview" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Overview" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Overview </span> <span class="devsite-nav-icon material-icons" data-icon="forward" > </span> </a> </li> <li class="devsite-nav-item"> <a href="/privacy-sandbox/cookies" class="devsite-nav-title gc-analytics-event devsite-nav-has-children " data-category="Site-Wide Custom Events" data-label="Tab: Cookies" track-name="cookies" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Cookies" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Cookies </span> <span class="devsite-nav-icon material-icons" data-icon="forward" > </span> </a> </li> <li class="devsite-nav-item"> <a href="/privacy-sandbox/private-advertising" class="devsite-nav-title gc-analytics-event devsite-nav-has-children " data-category="Site-Wide Custom Events" data-label="Tab: Private advertising" track-name="private advertising" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Private advertising" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Private advertising </span> <span class="devsite-nav-icon material-icons" data-icon="forward" > </span> </a> </li> <li class="devsite-nav-item"> <a href="/privacy-sandbox/protections" class="devsite-nav-title gc-analytics-event devsite-nav-has-children " data-category="Site-Wide Custom Events" data-label="Tab: Privacy protections" track-name="privacy protections" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Privacy protections" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Privacy protections </span> <span class="devsite-nav-icon material-icons" data-icon="forward" > </span> </a> </li> <li class="devsite-nav-item"> <a href="/privacy-sandbox/learn" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Tab: Learn" track-name="learn" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Learn" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Learn </span> </a> </li> <li class="devsite-nav-item"> <a href="/privacy-sandbox/blog" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Tab: Blog" track-name="blog" data-category="Site-Wide Custom Events" data-label="Responsive Tab: Blog" track-type="globalNav" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Blog </span> </a> </li> <li class="devsite-nav-item"> <a href="//privacysandbox.com/" class="devsite-nav-title gc-analytics-event " data-category="Site-Wide Custom Events" data-label="Responsive Tab: Home" track-type="navMenu" track-metadata-eventDetail="globalMenu" track-metadata-position="nav"> <span class="devsite-nav-text" tooltip > Home </span> </a> </li> </ul> </div> </div> </nav> </devsite-book-nav> <section id="gc-wrapper"> <main role="main" class="devsite-main-content" > <devsite-content> <article class="devsite-article"> <div class="devsite-article-meta nocontent" role="navigation"> <ul class="devsite-breadcrumb-list" aria-label="Breadcrumb"> <li class="devsite-breadcrumb-item "> <a href="https://developers.google.com/" class="devsite-breadcrumb-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Breadcrumbs" data-value="1" track-type="globalNav" track-name="breadcrumb" track-metadata-position="1" track-metadata-eventdetail="" > Home </a> </li> <li class="devsite-breadcrumb-item "> <div class="devsite-breadcrumb-guillemet material-icons" aria-hidden="true"></div> <a href="https://developers.google.com/privacy-sandbox" class="devsite-breadcrumb-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Breadcrumbs" data-value="2" track-type="globalNav" track-name="breadcrumb" track-metadata-position="2" track-metadata-eventdetail="Privacy Sandbox" > Privacy Sandbox </a> </li> </ul> <devsite-thumb-rating position="header"> </devsite-thumb-rating> </div> <devsite-feedback position="header" project-name="Privacy Sandbox" product-id="5335444" bucket="" context="" version="t-devsite-webserver-20241114-r00-rc02.464922260396498922" data-label="Send Feedback Button" track-type="feedback" track-name="sendFeedbackLink" track-metadata-position="header" class="nocontent" disable-product-feedback project-icon="https://developers.google.com/static/privacy-sandbox/assets/images/privacy-sandbox-logo.png" > <button> Send feedback </button> </devsite-feedback> <h1 class="devsite-page-title" tabindex="-1"> FedCM updates: Origin trials for the Continuation API bundle and Storage Access API auto-grant </h1> <devsite-feature-tooltip ack-key="AckCollectionsBookmarkTooltipDismiss" analytics-category="Site-Wide Custom Events" analytics-action-show="Callout Profile displayed" analytics-action-close="Callout Profile dismissed" analytics-label="Create Collection Callout" class="devsite-page-bookmark-tooltip nocontent" dismiss-button="true" id="devsite-collections-dropdown" dismiss-button-text="Dismiss" close-button-text="Got it"> <devsite-bookmark></devsite-bookmark> <span slot="popout-heading"> Stay organized with collections </span> <span slot="popout-contents"> Save and categorize content based on your preferences. </span> </devsite-feature-tooltip> <div class="devsite-page-title-meta"><devsite-view-release-notes></devsite-view-release-notes></div> <devsite-toc class="devsite-nav" depth="2" devsite-toc-embedded > </devsite-toc> <div class="devsite-article-body clearfix "> <p><style> .wd-authors { --avatar-size: 65px; display: flex; gap: 2em; } .wd-author { display: flex; flex-wrap: wrap; gap: 1em; line-height: calc(var(--avatar-size) / 2); } .wd-author img { border-radius: 50%; height: var(--avatar-size, 65px); width: var(--avatar-size, 65px); } </style> <style> .wd-authors { --avatar-size: 65px; display: flex; gap: 2em; } .wd-author { display: flex; flex-wrap: wrap; gap: 1em; line-height: calc(var(--avatar-size) / 2); } .wd-author img { border-radius: 50%; height: var(--avatar-size, 65px); width: var(--avatar-size, 65px); } </style> <div class="wd-authors" translate="no"> <div class="wd-author"> <img class="devsite-landing-row-item-icon" alt="Eiji Kitamura" src="https://web.dev/images/authors/agektmr.jpg" decoding="async" height="64" loading="lazy" width="64"> <div> <span> Eiji Kitamura </span> <div class="wd-author__links"> <a href="https://twitter.com/agektmr" aria-label="Eiji Kitamura on X" rel="me"> <svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 300 271"> <title>X</title> <path fill="currentColor" d="m236 0h46l-101 115 118 156h-92.6l-72.5-94.8-83 94.8h-46l107-123-113-148h94.9l65.5 86.6zm-16.1 244h25.5l-165-218h-27.4z"></path> </svg></a> <a href="https://github.com/agektmr" aria-label="Eiji Kitamura on GitHub" rel="me"> <svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 32.6 31.8"> <title>GitHub</title> <path d="M16.3 0C7.3 0 0 7.3 0 16.3c0 7.2 4.7 13.3 11.1 15.5.8.1 1.1-.4 1.1-.8v-2.8c-4.5 1-5.5-2.2-5.5-2.2-.7-1.9-1.8-2.4-1.8-2.4-1.5-1 .1-1 .1-1 1.6.1 2.5 1.7 2.5 1.7 1.5 2.5 3.8 1.8 4.7 1.4.1-1.1.6-1.8 1-2.2-3.6-.4-7.4-1.8-7.4-8.1 0-1.8.6-3.2 1.7-4.4-.1-.3-.7-2 .2-4.2 0 0 1.4-.4 4.5 1.7 1.3-.4 2.7-.5 4.1-.5 1.4 0 2.8.2 4.1.5 3.1-2.1 4.5-1.7 4.5-1.7.9 2.2.3 3.9.2 4.3 1 1.1 1.7 2.6 1.7 4.4 0 6.3-3.8 7.6-7.4 8 .6.5 1.1 1.5 1.1 3V31c0 .4.3.9 1.1.8 6.5-2.2 11.1-8.3 11.1-15.5C32.6 7.3 25.3 0 16.3 0z" fill-rule="evenodd" clip-rule="evenodd" fill="currentColor" /> </svg></a> <a href="https://glitch.com/@agektmr" aria-label="Eiji Kitamura on Glitch" rel="me"> <svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 32 32"> <title>Glitch</title> <path fill="currentColor" d="M31.734 16.76c-.385-.198-4.536 1.865-5.427 1.693-2.24-.401-1.828-.667-4.839-1.359-1.203-.266-1.031-.109-1.297-.307-.172-.135-.344-.161-.599-.401 4-.719 6.026-1.693 6.734-1.839.76-.146 5.161 1.958 5.427 1.469.266-.495-.964-1.578-.401-3.031.589-1.464-.693-2.422.016-3.583.719-1.161.573-2.932.396-3.026-.396-.203-4.531 1.865-5.438 1.693-2.24-.417-1.828-.682-4.839-1.359-1.203-.271-1.031-.12-1.297-.323-.266-.198-.521-.13-1.036-.974-.521-.839-6.51-2.13-6.906-2.13-.828 0-2.375 2.13-2.375 2.13s-.599 0-2.401.094c-1.802.094-3.375.896-5.495 2.563C-.173 9.737.134 11.414.134 11.414s1.969.667 1.969 1.042c0 .359-1.729.802-1.729.802 1.12 1.411 4.583 2.745 5.464 2.745h.693c-1.438.281-2.823 1.068-4.583 2.438-2.12 1.698-1.813 3.375-1.813 3.375s1.969.667 1.969 1.026-1.729.802-1.729.802c1.12 1.427 4.583 2.76 5.464 2.76.844 0 1.427.026 2.495-.172.078.172.906 1.932 2.599 2.292 1.786.385 2.776.078 2.776.078s.094-.786-.323-1.573c1.547.161 3.307.203 5.026-.068 4.76-.719 7.12-1.865 7.896-2.01.76-.161 5.161 1.948 5.427 1.464.266-.505-.964-1.583-.385-3.036.573-1.469-.708-2.417 0-3.589.719-1.161.573-2.932.396-3.026zM4.615 11.828a1.446 1.446 0 0 1-.297-.042h-.052c-.026-.01-.052-.026-.078-.042l-.052-.01-.083-.042h-.052a.418.418 0 0 1-.068-.042l-.068-.052-.063-.036-.057-.042c-.021-.016-.042-.036-.063-.052l-.042-.042c-.026-.026-.047-.052-.068-.078l-.026-.031a1.954 1.954 0 0 1-.094-.104l-.026-.026c-.021-.036-.036-.073-.052-.109l-.026-.036-.057-.083c-.005-.021-.016-.042-.026-.063l-.026-.083-.026-.052-.016-.094-.01-.068c-.01-.026-.021-.052-.026-.078v-.068c.094.573.557 1.016 1.104 1.016.63 0 1.146-.573 1.146-1.297 0-.719-.505-1.307-1.146-1.307-.625 0-1.13.573-1.146 1.281 0-.932.667-1.693 1.495-1.693.823 0 1.479.745 1.479 1.682 0 .932-.667 1.693-1.479 1.693zm-1-1.265c0-.203.13-.365.318-.365s.307.161.307.365c0 .198-.135.344-.307.344s-.318-.161-.318-.344zm1 11.651a.712.712 0 0 1-.146 0l-.057-.016a.6.6 0 0 1-.094-.01l-.052-.016-.078-.026-.052-.026c-.031-.005-.057-.016-.083-.026l-.052-.026c-.021-.016-.047-.026-.068-.042L3.881 22l-.068-.052-.052-.042-.068-.052-.042-.042c-.031-.031-.063-.057-.089-.094a.671.671 0 0 1-.094-.12l-.031-.026c-.016-.031-.036-.063-.052-.094l-.026-.052c-.016-.026-.036-.052-.052-.078l-.026-.057-.026-.094-.026-.052-.031-.094-.01-.052c-.01-.031-.021-.063-.026-.094v-.068c.094.573.557 1.016 1.104 1.016.63 0 1.146-.573 1.146-1.292 0-.724-.505-1.297-1.146-1.297-.625 0-1.13.563-1.146 1.266 0-.932.667-1.693 1.495-1.693.823 0 1.479.76 1.479 1.682 0 .917-.667 1.693-1.479 1.693zm-1-1.266c0-.188.13-.349.318-.349s.307.161.307.349c0 .188-.135.344-.307.344s-.318-.146-.318-.344zm6.77-7.333v-.042l.042-.078.078-.297c.182-.583.344-1.172.479-1.771.161-.708.229-1.281.203-1.599-.016-.12-.031-.245-.052-.359a8.276 8.276 0 0 0-.521-1.724l-.083-.172-.026-.068c-.12-.266.057-.573.323-.557h.188l.531.036 2.104.109 1.151.078a28.24 28.24 0 0 1 10.573 2.828l.891.401c.172.078.266.307.188.505-.068.188-.266.292-.438.214l-.896-.401a27.695 27.695 0 0 0-10.359-2.786l-1.146-.068-.51-.026-1.599-.094h-.156c.188.51.339 1.031.453 1.562l.063.427c.042.453-.036 1.078-.224 1.88l-.203.823a23.62 23.62 0 0 1-.385 1.323l-.026.078v.042c-.068.188-.266.292-.438.214-.177-.068-.271-.292-.203-.495zm-2-6.349a.307.307 0 0 1 .479.026c.208.26.396.536.563.828.292.531.495 1.068.547 1.615.026.307 0 .651-.052 1.026a8.718 8.718 0 0 1-.271 1.104c-.094.313-.208.62-.333.922-.078.188-.276.266-.453.172-.172-.094-.24-.318-.156-.521l.026-.052.068-.172c.073-.198.146-.396.214-.599.099-.328.182-.661.24-1 .052-.307.063-.573.052-.802a3.47 3.47 0 0 0-.453-1.292 4.794 4.794 0 0 0-.443-.667l-.036-.042a.417.417 0 0 1 .026-.531zm1.537 13.869c-.063.38-.151.76-.271 1.13a9.549 9.549 0 0 1-.333.906c-.078.188-.276.266-.453.177-.172-.094-.24-.323-.156-.521l.026-.057.068-.172c.073-.198.146-.396.214-.599.099-.328.182-.661.24-1 .052-.307.063-.573.036-.802a3.365 3.365 0 0 0-.438-1.276 4.794 4.794 0 0 0-.443-.667l-.036-.057a.417.417 0 0 1 .026-.531.3.3 0 0 1 .464 0c.214.266.396.547.563.839.292.536.495 1.083.547 1.615.026.307 0 .651-.052 1.026zm16.531.157c-.068.188-.266.297-.438.214l-.896-.401a27.695 27.695 0 0 0-10.359-2.786l-1.135-.063h-.063l-.458-.026c-.583-.036-1.172-.068-1.755-.094l.036.078c.234.615.396 1.255.479 1.906.042.453-.036 1.078-.224 1.88l-.203.828a24.99 24.99 0 0 1-.385 1.333l-.026.068v.036c-.068.203-.266.297-.438.229a.42.42 0 0 1-.203-.51v-.026l.042-.078.078-.292c.182-.589.344-1.177.479-1.776.161-.708.229-1.281.203-1.599-.016-.12-.031-.24-.052-.359a7.996 7.996 0 0 0-.521-1.708l-.052-.12-.031-.068-.026-.063c-.12-.271.057-.578.323-.563h.188l.531.042 2.12.104 1.135.083a28.14 28.14 0 0 1 10.573 2.823l.891.401c.172.078.266.307.188.505z"/> </svg></a> <a href="https://infosec.exchange/@agektmr" aria-label="Eiji Kitamura on Mastodon" rel="me"> <svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" viewBox="0 0 16 16"> <title>Mastodon</title> <path fill="currentColor" d="M 15.659 9.592 C 15.424 10.72 13.553 11.956 11.404 12.195 C 10.283 12.32 9.18 12.434 8.003 12.384 C 6.079 12.302 4.56 11.956 4.56 11.956 C 4.56 12.13 4.572 12.297 4.595 12.452 C 4.845 14.224 6.478 14.33 8.025 14.379 C 9.586 14.429 10.976 14.02 10.976 14.02 L 11.04 15.337 C 11.04 15.337 9.948 15.884 8.003 15.984 C 6.93 16.039 5.598 15.959 4.047 15.576 C 0.683 14.746 0.104 11.4 0.015 8.006 C -0.012 6.998 0.005 6.048 0.005 5.253 C 0.005 1.782 2.443 0.765 2.443 0.765 C 3.672 0.238 5.782 0.017 7.975 0 L 8.029 0 C 10.221 0.017 12.332 0.238 13.561 0.765 C 13.561 0.765 15.999 1.782 15.999 5.253 C 15.999 5.253 16.03 7.814 15.659 9.592 Z M 13.124 5.522 L 13.124 9.725 L 11.339 9.725 L 11.339 5.646 C 11.339 4.786 10.951 4.35 10.175 4.35 C 9.317 4.35 8.887 4.867 8.887 5.891 L 8.887 8.124 L 7.113 8.124 L 7.113 5.891 C 7.113 4.867 6.683 4.35 5.825 4.35 C 5.049 4.35 4.661 4.786 4.661 5.646 L 4.661 9.725 L 2.876 9.725 L 2.876 5.522 C 2.876 4.663 3.111 3.981 3.582 3.476 C 4.067 2.971 4.703 2.712 5.493 2.712 C 6.406 2.712 7.098 3.039 7.555 3.695 L 8 4.39 L 8.445 3.695 C 8.902 3.039 9.594 2.712 10.507 2.712 C 11.297 2.712 11.933 2.971 12.418 3.476 C 12.889 3.981 13.124 4.663 13.124 5.522 Z" style="stroke:none;stroke-miterlimit:10;fill-rule:evenodd;"></path> </svg></a> </div> </div> </div> </div></p> <p>From Chrome 126, developers can start running an origin trial for a bundle of desktop Federated Credential Management API (FedCM) features that enable some <strong>Authorization</strong> use cases. The bundle consists of the Continuation API and the Parameters API, which enable an OAuth authorization flow-like experience involving an identity provider (IdP)-provided permission dialog. The bundle also includes other changes such as the Fields API, Multiple configURLs, and Custom Account Labels. From Chrome 126, we are also introducing an origin trial for the Storage Access API (SAA) that auto-grants SAA requests if the user has successfully logged in using FedCM in the past.</p> <h2 id="origin_trial_fedcm_continuation_api_bundle" data-text="Origin Trial: FedCM Continuation API bundle" tabindex="-1">Origin Trial: FedCM Continuation API bundle</h2> <p>The FedCM Continuation API bundle consists of multiple FedCM extensions:</p> <ul> <li><a href="#continuation-api">Continuation API</a></li> <li><a href="#parameters-api">Parameters API</a></li> <li><a href="#fields-api">Fields API</a></li> <li><a href="#multiple-configurls">Multiple configURLs</a></li> <li><a href="#custom-account-labels">Custom Account Labels</a></li> </ul> <h3 id="continuation-api" data-text="Continuation API" tabindex="-1">Continuation API</h3> <figure> <video autoplay loop muted controls playsinline> <source src="/static/privacy-sandbox/assets/images/blog/fedcm-126-authorization.mp4" type="video/mp4" /></video> <figcaption>A user is signing in to the RP then authorize through the button mode.</figcaption> </figure> <p>You can check out a <a href="https://fedcm-rp-demo.glitch.me/authorization">demo of the API on Glitch</a>.</p> <p>The <a href="https://github.com/fedidcg/FedCM/issues/555">Continuation API</a> allows the IdP's <a href="/privacy-sandbox/cookies/fedcm-developer-guide#id-assertion-endpoint">ID assertion endpoint</a> to optionally return a URL that FedCM will render to allow the user to continue a multi-step sign-in flow. This allows the IdP to request the user to grant the relying party (RP) permissions beyond what is possible in the existing FedCM UI, such as access to the user's server-side resources.</p> <p>Typically, the ID assertion endpoint returns a token required for authentication.</p> <pre class="prettyprint lang-json" translate="no" dir="ltr"><code translate="no" dir="ltr">{ "token": "***********" } </code></pre> <p>However, with the Continuation API, the <a href="/privacy-sandbox/cookies/fedcm-developer-guide#id-assertion-endpoint">ID assertion endpoint</a> can return a <code translate="no" dir="ltr">continue_on</code> property which includes an absolute path or a relative path to the ID assertion endpoint.</p> <pre class="prettyprint lang-json" translate="no" dir="ltr"><code translate="no" dir="ltr">{ // In the id_assertion_endpoint, instead of returning a typical // "token" response, the IdP decides that it needs the user to // continue on a pop-up window: "continue_on": "/oauth/authorize?scope=..." } </code></pre> <p>As soon as the browser receives the <code translate="no" dir="ltr">continue_on</code> response, a new popup window is opened and navigates the user to the specified path.</p> <p>After the user interacts with the page, for example granting further permission to share extra information with the RP, the IdP page can call <code translate="no" dir="ltr">IdentityProvider.resolve()</code> to resolve the original <code translate="no" dir="ltr">navigator.credentials.get()</code> call and return a token as an argument.</p> <pre class="prettyprint lang-js" translate="no" dir="ltr"><code translate="no" dir="ltr">document.getElementById('allow_btn').addEventListener('click', async () => { let accessToken = await fetch('/generate_access_token.cgi'); // Closes the window and resolves the promise (that is still hanging // in the relying party's renderer) with the value that is passed. IdentityProvider.resolve(accessToken); }); </code></pre> <p>The browser will then close the popup by itself and return the token to the API caller.</p> <p>If the user rejects the request, you can close the window by calling <code translate="no" dir="ltr">IdentityProvider.close()</code>.</p> <pre class="prettyprint lang-js" translate="no" dir="ltr"><code translate="no" dir="ltr">IdentityProvider.close(); </code></pre><aside class="note"><strong>Note:</strong><span> The popup behaves as if <a href="https://developer.mozilla.org/docs/Web/HTML/Attributes/rel/noopener"><code translate="no" dir="ltr">noopener</code></a>, <a href="https://developer.mozilla.org/docs/Web/HTML/Attributes/rel/noreferrer"><code translate="no" dir="ltr">noreferrer</code></a> was specified (thus, <code translate="no" dir="ltr">window.opener</code> is null) and there is no way for both the parent window (RP) and the popup window (IdP) to interact with each other. The only way to communicate should be a one-time <code translate="no" dir="ltr">IdentityProvider.resolve()</code> call, which also closes the popup.</span></aside><aside class="note"><strong>Note:</strong><span> The Continuation API is only allowed when there is a user interaction (explicit clicks). Therefore, the user is required to select an account in <a href="/privacy-sandbox/blog/fedcm-chrome-125-updates#button-mode-api">widget mode</a> (with <code translate="no" dir="ltr">mediation: 'required'</code>), or in <a href="https://github.com/fedidcg/FedCM/issues/442#issuecomment-1949323416">button mode</a> (which always requires user activation). But the popup is not allowed for <code translate="no" dir="ltr">mediation: silent</code>. For <code translate="no" dir="ltr">mediation: optional</code> widget mode the API checks for transient user activation if auto re-authentication is triggered. Otherwise, no popup window is opened, and the promise is rejected.</span></aside> <p>If for some reason the user has changed their account in the popup (for example the IdP offers a "switch user" function, or in delegation cases), the resolve call takes an optional second argument allowing something like:</p> <pre class="prettyprint lang-js" translate="no" dir="ltr"><code translate="no" dir="ltr">IdentityProvider.resolve(token, {accountId: '1234'); </code></pre> <h3 id="parameters-api" data-text="Parameters API" tabindex="-1">Parameters API</h3> <p>The <a href="https://github.com/fedidcg/FedCM/issues/556">Parameters API</a> allows the RP to provide additional parameters to the <a href="/privacy-sandbox/cookies/fedcm-developer-guide#id-assertion-endpoint">ID assertion endpoint</a>. With the Parameters API, RPs can pass additional parameters to the IdP to request permissions for resources beyond basic sign-in. The user would authorize these permissions through an IdP-controlled UX flow that is launched via <a href="#continuation-api">the Continuation API</a>.</p> <p>To use the API, add parameters to the <code translate="no" dir="ltr">params</code> property as an object in the <code translate="no" dir="ltr">navigator.credentials.get()</code> call.</p> <pre class="prettyprint lang-js" translate="no" dir="ltr"><code translate="no" dir="ltr">let {token} = await navigator.credentials.get({ identity: { providers: [{ clientId: '1234', configURL: 'https://idp.example/fedcm.json', // Key/value pairs that need to be passed from the // RP to the IdP but that don't really play any role with // the browser. params: { IDP_SPECIFIC_PARAM: '1', foo: 'BAR', ETC: 'MOAR', scope: 'calendar.readonly photos.write', } }, } }); </code></pre> <p>The property names in the <code translate="no" dir="ltr">params</code> object are prepended with <code translate="no" dir="ltr">param_</code>. In the above example, the params property contains <code translate="no" dir="ltr">IDP_SPECIFIC_PARAM</code> as <code translate="no" dir="ltr">'1'</code>, <code translate="no" dir="ltr">foo</code> as <code translate="no" dir="ltr">'BAR'</code>, <code translate="no" dir="ltr">ETC</code> as <code translate="no" dir="ltr">'MOAR'</code> and <code translate="no" dir="ltr">scope</code> as <code translate="no" dir="ltr">'calendar.readonly photos.write'</code>. This will be translated as <code translate="no" dir="ltr">param_IDP_SPECIFIC_PARAM=1&param_foo=BAR&param_ETC=MOAR&param_scope=calendar.readonly%20photos.write</code> in the HTTP body of the request:</p> <pre class="prettyprint lang-http" translate="no" dir="ltr"><code translate="no" dir="ltr">POST /fedcm_assertion_endpoint HTTP/1.1 Host: idp.example Origin: https://rp.example/ Content-Type: application/x-www-form-urlencoded Cookie: 0x23223 Sec-Fetch-Dest: webidentity account_id=123&client_id=client1234&nonce=234234&disclosure_text_shown=false&param_IDP_SPECIFIC_PARAM=1&param_foo=BAR&param_ETC=MOAR&param_scope=calendar.readonly%20photos.write </code></pre> <h4 id="get_permissions_dynamically" data-text="Get permissions dynamically" tabindex="-1">Get permissions dynamically</h4> <p>In general, for users it is most helpful to request permissions when they are needed, rather than when the developer feels they are easiest to implement. For example, asking for permission to access a camera when the user is about to take a photo is preferred to asking for permission as soon as the user lands on the website. The same practice applies to server resources. Request permissions only when they're needed for the user. This is called "dynamic authorization".</p> <p>To request authorization dynamically with FedCM, the IdP can:</p> <ol> <li>Call <code translate="no" dir="ltr">navigator.credentials.get()</code> with required parameters the IdP can understand, such as <code translate="no" dir="ltr">scope</code>.</li> <li>The <a href="/privacy-sandbox/cookies/fedcm-developer-guide#id-assertion-endpoint">ID assertion endpoint</a> confirms the user is already signed in and responds with a <code translate="no" dir="ltr">continue_on</code> URL.</li> <li>The browser opens a popup window with the IdP’s permission page asking for additional permission that matches the requested scopes.</li> <li>Once authorized via <code translate="no" dir="ltr">IdentityProvider.resolve()</code> by the IdP, the window is closed and the RP's original <code translate="no" dir="ltr">navigator.credentials.get()</code> call gets a relevant token or an authorization code so that the RP can exchange it with a proper access token.</li> </ol> <h3 id="fields-api" data-text="Fields API" tabindex="-1">Fields API</h3> <p>The <a href="https://github.com/fedidcg/FedCM/issues/559">Fields API</a> allows the RP to declare account attributes to request from the IdP so that the browser can render a proper disclosure UI in the FedCM dialog; it's the IdP's responsibility to include the requested fields in the returned token. Consider this requesting a "basic profile" in OpenID Connect versus "scopes" in OAuth.</p> <figure style="max-width:800px; margin:auto;"> <img src="/static/privacy-sandbox/assets/images/blog/fedcm-126-with-disclosure-widget.jpg" alt="Disclosure message in widget mode." width="788" height="546"> <figcaption>Disclosure message in widget mode.</figcaption> </figure> <figure style="max-width:800px; margin:auto;"> <img src="/static/privacy-sandbox/assets/images/blog/fedcm-126-with-disclosure-button.jpg" alt="Disclosure message in button mode." width="920" height="798"> <figcaption>Disclosure message in button mode.</figcaption> </figure> <p>To use Fields API, add parameters to the <code translate="no" dir="ltr">fields</code> property as an array in the <code translate="no" dir="ltr">navigator.credentials.get()</code> call. The fields can contain <code translate="no" dir="ltr">'name'</code>, <code translate="no" dir="ltr">'email'</code> and <code translate="no" dir="ltr">'picture'</code> for now, but can be expanded to include more values in the future.</p> <p>A request with <code translate="no" dir="ltr">fields</code> would look like this:</p> <pre class="prettyprint lang-js" translate="no" dir="ltr"><code translate="no" dir="ltr">let { token } = await navigator.credentials.get({ identity: { providers: [{ fields: ['name', 'email', 'picture'], clientId: '1234', configURL: 'https://idp.example/fedcm.json', params: { scope: 'drive.readonly calendar.readonly', } }, } mediation: 'optional', }); </code></pre> <p>The HTTP request to the <a href="/privacy-sandbox/cookies/fedcm-developer-guide#id-assertion-endpoint">ID assertion endpoint</a> includes the RP-specified <code translate="no" dir="ltr">fields</code> parameter, with the <code translate="no" dir="ltr">disclosure_text_shown</code> parameter set as <code translate="no" dir="ltr">true</code> if this is not a returning user, and the fields that the browser disclosed to the user in a <code translate="no" dir="ltr">disclosure_shown_for</code> parameter:</p> <pre class="prettyprint lang-http" translate="no" dir="ltr"><code translate="no" dir="ltr">POST /id_assertion_endpoint HTTP/1.1 Host: idp.example Origin: https://rp.example/ Content-Type: application/x-www-form-urlencoded Cookie: 0x23223 Sec-Fetch-Dest: webidentity account_id=123&client_id=client1234&nonce=234234&disclosure_text_shown=true&fields=email,name,picture&disclosure_shown_for=email,name,picture </code></pre><aside class="note"><strong>Note:</strong><span> Currently, Chrome throws an exception unless the RP asks for either <code translate="no" dir="ltr">fields: ['name', 'email', 'picture']</code>, or nothing at all with <code translate="no" dir="ltr">fields: []</code>. In future, Chrome will make the UI more capable of asking for different combinations, and will begin to accept subsets of those values.</span></aside> <p>If the RP needs access to any additional data from the IdP, such as access to a calendar, this should be handled with a custom parameter as mentioned above. The IdP returns a <code translate="no" dir="ltr">continue_on</code> URL to request permission.</p> <p>If <code translate="no" dir="ltr">fields</code> is an empty array, the request would look like this:</p> <pre class="prettyprint lang-js" translate="no" dir="ltr"><code translate="no" dir="ltr">let { token } = await navigator.credentials.get({ identity: { providers: [{ fields: [], clientId: '1234', configURL: 'https://idp.example/fedcm.json', params: { scope: 'drive.readonly calendar.readonly', } }, } mediation: 'optional', }); </code></pre> <p>If <code translate="no" dir="ltr">fields</code> is an empty array, the user agent will skip the disclosure UI.</p> <figure style="max-width:800px; margin:auto;"> <img src="/static/privacy-sandbox/assets/images/blog/fedcm-126-without-disclosure-widget.jpg" alt="Disclosure message is not displayed in the widget mode. In the button flow, the disclosure UI is skipped entirely." width="798" height="408"> <figcaption>Disclosure message is not displayed in the widget mode. In the button flow, the disclosure UI is skipped entirely.</figcaption> </figure> <p>This is the case even if the response from the <a href="/privacy-sandbox/cookies/fedcm-developer-guide#accounts-list-endpoint">accounts endpoint</a> does not contain a client ID that matches the RP in <code translate="no" dir="ltr">approved_clients</code>.</p> <p>In this case, the <code translate="no" dir="ltr">disclosure_text_shown</code> sent to the <a href="/privacy-sandbox/cookies/fedcm-developer-guide#id-assertion-endpoint">ID assertion endpoint</a> is false in the HTTP body:</p> <pre class="prettyprint lang-http" translate="no" dir="ltr"><code translate="no" dir="ltr">POST /id_assertion_endpoint HTTP/1.1 Host: idp.example Origin: https://rp.example/ Content-Type: application/x-www-form-urlencoded Cookie: 0x23223 Sec-Fetch-Dest: webidentity account_id=123&client_id=client1234&nonce=234234&disclosure_text_shown=false </code></pre> <h3 id="multiple-configurls" data-text="Multiple configURLs" tabindex="-1">Multiple configURLs</h3> <p><a href="https://github.com/fedidcg/FedCM/issues/552">Multiple configURLs</a> allow IdPs to accommodate multiple config files for an IdP, by specifying <code translate="no" dir="ltr">accounts_endpoint</code> and <code translate="no" dir="ltr">login_url</code> in <a href="/privacy-sandbox/cookies/fedcm-developer-guide#well-known-file">the well-known file</a> the same as the config files.</p> <p>If <code translate="no" dir="ltr">accounts_endpoint</code> and <code translate="no" dir="ltr">login_url</code> are added to the well-known file, the <code translate="no" dir="ltr">provider_urls</code> are ignored so that the IdP can support multiple config files. If they aren't, <code translate="no" dir="ltr">provider_urls</code> continue to take effect so that it is backward compatible.</p> <p>The well-known file that supports multiple configURLs can look like this:</p> <pre class="prettyprint lang-json" translate="no" dir="ltr"><code translate="no" dir="ltr">{ "provider_urls": [ "https://idp.example/fedcm.json" ], "accounts_endpoint": "https://idp.example/accounts", "login_url": "https://idp.example/login" } </code></pre> <p>This allows us to:</p> <ol> <li>Maintain backwards and forwards compatibility with existing well-known files and the earlier version of browsers that are already deployed in the wild.</li> <li>Have an arbitrary number of config files—as long as they all point to the same <code translate="no" dir="ltr">accounts_endpoint</code> and <code translate="no" dir="ltr">login_url</code>.</li> <li>Have no opportunity for entropy to be added to the credentialed fetch request made to the <code translate="no" dir="ltr">accounts_endpoint</code>, since it has to be specified at the ".well-known" level.</li> </ol> <p>Supporting multiple configURLs is optional and the existing FedCM implementations can stay the same.</p> <h3 id="custom-account-labels" data-text="Custom Account Labels" tabindex="-1">Custom Account Labels</h3> <p><a href="https://github.com/fedidcg/FedCM/issues/553">Custom Account Labels</a> allow FedCM IdPs to annotate accounts so that RPs can filter them by specifying the label in a config file. Similar filtering has been possible using the <a href="/privacy-sandbox/cookies/fedcm-developer-guide#domain-hint">Domain Hint API</a> and the <a href="/privacy-sandbox/cookies/fedcm-developer-guide#login-hint">Login Hint API</a> by specifying them in the <code translate="no" dir="ltr">navigator.credentials.get()</code> call, but the Custom Account Labels can filter users by specifying the config file, which is especially useful when <a href="#multiple-configurls">multiple configURLs</a> are used. Custom Account Labels are also different in that they are provided from the IdP server, as opposed to from the RP, like login or domain hints.</p> <h4 id="example" data-text="Example" tabindex="-1">Example</h4> <p>An IdP supports two configURLs for consumer and enterprise respectively. The consumer config file has an <code translate="no" dir="ltr">'consumer'</code> label, and the enterprise config file has a <code translate="no" dir="ltr">'enterprise'</code> label.</p> <p>With such a setup, the well-known file includes <code translate="no" dir="ltr">accounts_endpoint</code> and <code translate="no" dir="ltr">login_url</code> to allow multiple configURLs.</p> <pre class="prettyprint lang-json" translate="no" dir="ltr"><code translate="no" dir="ltr">{ "provider_urls": [ "https://idp.example/fedcm.json" ], "accounts_endpoint": "https://idp.example/accounts", "login_url": "https://idp.example/login" } </code></pre> <p>When the <code translate="no" dir="ltr">accounts_endpoint</code> is provided in the well-known file, the <code translate="no" dir="ltr">provider_urls</code> are ignored. The RP can point directly at respective config files in the <code translate="no" dir="ltr">navigator.credentials.get()</code> call.</p> <p>The consumer config file is at <code translate="no" dir="ltr">https://idp.example/fedcm.json</code> which includes <code translate="no" dir="ltr">accounts</code> property that specifies <code translate="no" dir="ltr">'consumer'</code> using the <code translate="no" dir="ltr">include</code>.</p> <pre class="prettyprint lang-json" translate="no" dir="ltr"><code translate="no" dir="ltr">{ "accounts_endpoint": "https://idp.example/accounts", "client_metadata_endpoint": "/client_metadata", "login_url": "https://idp.example/login", "id_assertion_endpoint": "/assertion", "accounts": { "include": "consumer" } } </code></pre> <p>The enterprise config file is at <code translate="no" dir="ltr">https://idp.example/enterprise/fedcm.json</code>, which includes the <code translate="no" dir="ltr">accounts</code> property that specifies <code translate="no" dir="ltr">'enterprise'</code> using the <code translate="no" dir="ltr">include</code>.</p> <pre class="prettyprint lang-json" translate="no" dir="ltr"><code translate="no" dir="ltr">{ "accounts_endpoint": "https://idp.example/accounts", "client_metadata_endpoint": "/enterprise/client_metadata", "login_url": "https://idp.example/login", "id_assertion_endpoint": "/assertion", "accounts": { "include": "enterprise" } } </code></pre> <p>The common IdP <a href="/privacy-sandbox/cookies/fedcm-developer-guide#accounts-list-endpoint">accounts endpoint</a> (in this example <code translate="no" dir="ltr">https://idp.example/accounts</code>) returns a list of accounts that includes a labels property with assigned <code translate="no" dir="ltr">labels</code> in an array for each account. The following is an example response for a user who has two accounts. One is for consumer and the other is for enterprise:</p> <pre class="prettyprint lang-json" translate="no" dir="ltr"><code translate="no" dir="ltr">{ "accounts": [{ "id": "123", "given_name": "John", "name": "John Doe", "email": "john_doe@idp.example", "picture": "https://idp.example/profile/123", "labels": ["consumer"] }], [{ "id": "4567", "given_name": "Jane", "name": "Jane Doe", "email": "jane_doe@idp.example", "picture": "https://idp.example/profile/4567", "labels": ["enterprise"] }] } </code></pre> <p>When an RP wants to allow <code translate="no" dir="ltr">'enterprise'</code> users to sign in, they can specify the <code translate="no" dir="ltr">'enterprise'</code> configURL <code translate="no" dir="ltr">'https://idp.example/enterprise/fedcm.json'</code> in the <code translate="no" dir="ltr">navigator.credentials.get()</code> call:</p> <pre class="prettyprint lang-js" translate="no" dir="ltr"><code translate="no" dir="ltr">let { token } = await navigator.credentials.get({ identity: { providers: [{ clientId: '1234', nonce: '234234', configURL: 'https://idp.example/enterprise/fedcm.json', }, } }); </code></pre> <p>As a result, only the account ID of <code translate="no" dir="ltr">'4567'</code> is available for the user to sign in. The account ID of <code translate="no" dir="ltr">'123'</code> is silently hidden by the browser so that the user won't be provided with an account that's not supported by the IdP on this site.</p> <aside class="note"><b>Note:</b> <ul> <li>Labels are strings. If the <code translate="no" dir="ltr">labels</code> array or <code translate="no" dir="ltr">include</code> field contains something that is not a string, it is ignored.</li> <li>If no labels are specified in the configURL, all accounts will be displayed in the FedCM account chooser.</li> <li>If no labels are specified for an account, it will only be displayed in the account chooser if the configURL also does not specify a label.</li> <li>If no account matches the requested label in the widget flow (similar to the Domain Hint API) the FedCM dialog shows a login prompt, which allows the user to log in to an IdP account. For the button flow, the login popup window is directly opened.</li> </ul> </aside> <h2 id="storage-access-api" data-text="Origin trial: FedCM as a trust signal for the Storage Access API" tabindex="-1">Origin trial: FedCM as a trust signal for the Storage Access API</h2> <p>Chrome 126 is starting an origin trial of <a href="https://github.com/explainers-by-googlers/storage-access-for-fedcm">FedCM as a trust signal for the Storage Access API</a>. With this change, a prior permission grant via FedCM becomes a valid reason to automatically approve a storage access request by the <a href="/privacy-sandbox/cookies/storage-access-api">Storage Access APIs</a>.</p> <p>This is useful when an embedded iframe wants to access personalized resources: for example, if idp.example is embedded in rp.example and needs to show a personalized resource. If the browser restricts access to third-party cookies, even if the user is signed in to rp.example using idp.example with FedCM, the embedded idp.example iframe won't be able to request personalized resources because requests won't include third-party cookies.</p> <p>To achieve this, idp.example needs to get a storage access permission via its iframe embedded on the website, and this can only be obtained through a permission prompt.</p> <p>With <a href="https://github.com/explainers-by-googlers/storage-access-for-fedcm">FedCM as a trust signal for the Storage Access API</a>, Storage Access API permission checks not only accept the permission grant that is given by a storage access prompt, but also the permission grant given by a FedCM prompt.</p> <pre class="prettyprint lang-js" translate="no" dir="ltr"><code translate="no" dir="ltr">// In top-level rp.example: // Ensure FedCM permission has been granted. const cred = await navigator.credentials.get({ identity: { providers: [{ configURL: 'https://idp.example/fedcm.json', clientId: '123', }], }, mediation: 'optional', }); // In an embedded IdP iframe: // No user gesture is needed to call this, and the call will be auto-granted. await document.requestStorageAccess(); // This returns `true`. const hasAccess = await document.hasStorageAccess(); </code></pre> <p>Once the user is signed in with FedCM, the permission is auto-granted as long as the FedCM authentication is active. This means once the user is disconnected, requesting permission will show a prompt.</p> <aside class="note"><strong>Note:</strong><span> To allow an embedded IdP iframe to get Storage Access auto-grant despite FedCM itself is not invoked within the iframe, the RP must explicitly add the <a href="/privacy-sandbox/cookies/fedcm-developer-guide#call_fedcm_from_within_a_cross-origin_iframe">FedCM <code translate="no" dir="ltr">identity-credentials-get</code> permissions policy</a>.</span></aside> <h2 id="origin-trial" data-text="Participate in the origin trial" tabindex="-1">Participate in the origin trial</h2> <p>You can try the FedCM Continuation API bundle locally by turning on <a href="https://developer.chrome.com/docs/web-platform/chrome-flags">a Chrome flag</a> <code translate="no" dir="ltr">chrome://flags#fedcm-authz</code> on Chrome 126 or later. You can also try the FedCM as a trust signal for the Storage Access API locally by turning on <code translate="no" dir="ltr">#fedcm-with-storage-access-api</code> on Chrome 126 or later.</p> <p>These features are also available as origin trials. Origin trials allow you to try new features and give feedback on their usability, practicality, and effectiveness. For more information, check out the <a href="https://goo.gle/ot">Get started with origin trials</a>.</p> <p>To try <a href="https://developer.chrome.com/origintrials/#/view_trial/1792995601646878721">the FedCM Continuation API bundle origin trial</a>, create two origin trial tokens:</p> <ul> <li>Register for the trial. <a href="https://developer.chrome.com/docs/web-platform/origin-trials/#take_part_in_an_origin_trial">Embed the token to the IdP origin</a>.</li> <li>Register for the origin trial with a third-party matching checkbox checked. Follow the instructions in <a href="#3p-origin-trial">Register a third-party origin trial for the RP</a> to embed the token for the RP.</li> </ul> <p>If you are interested in enabling the Continuation API along with <a href="/privacy-sandbox/blog/fedcm-chrome-125-updates">the button flow</a>, enable <a href="https://developer.chrome.com/origintrials/#/view_trial/2288391560657633281">the Button Mode API origin trial</a> as well:</p> <ul> <li>Register for the origin trial as a third party. Follow the instructions in <a href="#3p-origin-trial">Register a third-party origin trial for the RP</a> to embed the token for the RP.</li> </ul> <p>To try <a href="https://developer.chrome.com/origintrials/#/view_trial/4008766618313162753">the FedCM as a trust signal for the Storage Access API origin trial</a>:</p> <ul> <li>Register for the origin trial. <a href="https://developer.chrome.com/docs/web-platform/origin-trials/#take_part_in_an_origin_trial">Embed the token to the IdP origin</a>.</li> </ul> <p>The Continuation API bundle origin trial and the FedCM as a trust signal for the Storage Access API origin trial are available from Chrome 126.</p> <h3 id="3p-origin-trial" data-text="Register a third-party origin trial for the RP" tabindex="-1">Register a third-party origin trial for the RP</h3> <ol> <li>Go to the origin trial registration page.</li> <li>Click the <strong>Register</strong> button and fill out the form to request a token.</li> <li>Enter the IdP's origin as <strong>Web Origin</strong>.</li> <li>Check Third-party matching to inject the token with JavaScript on other origins.</li> <li>Click <strong>Submit</strong>.</li> <li>Embed the issued token on a third-party website.</li> </ol> <p>To embed the token on a third-party website, add the following code to the IdP's JavaScript library or SDK served from the IdP's origin.</p> <pre class="prettyprint lang-js" translate="no" dir="ltr"><code translate="no" dir="ltr">const tokenElement = document.createElement('meta'); tokenElement.httpEquiv = 'origin-trial'; tokenElement.content = 'TOKEN_GOES_HERE'; document.head.appendChild(tokenElement); </code></pre> <p>Replace <code translate="no" dir="ltr">TOKEN_GOES_HERE</code> with your own token.</p> <aside class="note"><strong>Note:</strong><span> If FedCM API is invoked by the RP, not via script loaded from the IdP, the RP must register their origin themselves and run their first-party origin trial.</span></aside> </div> <devsite-thumb-rating position="footer"> </devsite-thumb-rating> <devsite-feedback position="footer" project-name="Privacy Sandbox" product-id="5335444" bucket="" context="" version="t-devsite-webserver-20241114-r00-rc02.464922260396498922" data-label="Send Feedback Button" track-type="feedback" track-name="sendFeedbackLink" track-metadata-position="footer" class="nocontent" disable-product-feedback project-icon="https://developers.google.com/static/privacy-sandbox/assets/images/privacy-sandbox-logo.png" > <button> Send feedback </button> </devsite-feedback> <div class="devsite-floating-action-buttons"> </div> </article> <devsite-content-footer class="nocontent"> <p>Except as otherwise noted, the content of this page is licensed under the <a href="https://creativecommons.org/licenses/by/4.0/">Creative Commons Attribution 4.0 License</a>, and code samples are licensed under the <a href="https://www.apache.org/licenses/LICENSE-2.0">Apache 2.0 License</a>. For details, see the <a href="https://developers.google.com/site-policies">Google Developers Site Policies</a>. Java is a registered trademark of Oracle and/or its affiliates.</p> <p>Last updated 2024-06-11 UTC.</p> </devsite-content-footer> <devsite-notification > </devsite-notification> <div class="devsite-content-data"> <template class="devsite-thumb-rating-feedback"> <devsite-feedback position="thumb-rating" project-name="Privacy Sandbox" product-id="5335444" bucket="" context="" version="t-devsite-webserver-20241114-r00-rc02.464922260396498922" data-label="Send Feedback Button" track-type="feedback" track-name="sendFeedbackLink" track-metadata-position="thumb-rating" class="nocontent" disable-product-feedback project-icon="https://developers.google.com/static/privacy-sandbox/assets/images/privacy-sandbox-logo.png" > <button> Need to tell us more? </button> </devsite-feedback> </template> <template class="devsite-content-data-template"> [[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Missing the information I need","missingTheInformationINeed","thumb-down"],["Too complicated / too many steps","tooComplicatedTooManySteps","thumb-down"],["Out of date","outOfDate","thumb-down"],["Samples / code issue","samplesCodeIssue","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2024-06-11 UTC."],[],[]] </template> </div> </devsite-content> </main> <devsite-footer-promos class="devsite-footer"> </devsite-footer-promos> <devsite-footer-linkboxes class="devsite-footer"> <nav class="devsite-footer-linkboxes nocontent" aria-label="Footer links"> <ul class="devsite-footer-linkboxes-list"> <li class="devsite-footer-linkbox "> <h3 class="devsite-footer-linkbox-heading no-link">Get support</h3> <ul class="devsite-footer-linkbox-list"> <li class="devsite-footer-linkbox-item"> <a href="https://github.com/privacysandbox/privacy-sandbox-dev-support" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 1)" > Ask a question on our GitHub support repo </a> </li> <li class="devsite-footer-linkbox-item"> <a href="https://goo.gle/privacy-sandbox-feedback" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 2)" > Submit project feedback </a> </li> </ul> </li> <li class="devsite-footer-linkbox "> <h3 class="devsite-footer-linkbox-heading no-link">Get updates</h3> <ul class="devsite-footer-linkbox-list"> <li class="devsite-footer-linkbox-item"> <a href="/privacy-sandbox/blog" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 1)" > Developer blog </a> </li> <li class="devsite-footer-linkbox-item"> <a href="https://privacysandbox.com/news/" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 2)" > Project news </a> </li> </ul> </li> <li class="devsite-footer-linkbox "> <h3 class="devsite-footer-linkbox-heading no-link">Resources</h3> <ul class="devsite-footer-linkbox-list"> <li class="devsite-footer-linkbox-item"> <a href="https://privacysandbox.com/" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 1)" > Project site </a> </li> <li class="devsite-footer-linkbox-item"> <a href="https://privacysandbox.com/open-web/#the-privacy-sandbox-timeline" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 2)" > Privacy Sandbox timeline </a> </li> </ul> </li> <li class="devsite-footer-linkbox "> <h3 class="devsite-footer-linkbox-heading no-link">Tools</h3> <ul class="devsite-footer-linkbox-list"> <li class="devsite-footer-linkbox-item"> <a href="https://goo.gle/psat" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 1)" > Privacy Sandbox Analysis Tool </a> </li> <li class="devsite-footer-linkbox-item"> <a href="https://privacy-sandbox-demos.dev/" class="devsite-footer-linkbox-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Link (index 2)" > Privacy Sandbox demos </a> </li> </ul> </li> </ul> </nav> </devsite-footer-linkboxes> <devsite-footer-utility class="devsite-footer"> <div class="devsite-footer-utility nocontent"> <nav class="devsite-footer-sites" aria-label="Other Google Developers websites"> <a href="https://developers.google.com/" class="devsite-footer-sites-logo-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Google Developers Link"> <picture> <img class="devsite-footer-sites-logo" src="https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/developers/images/lockup-google-for-developers.svg" loading="lazy" alt="Google Developers"> </picture> </a> <ul class="devsite-footer-sites-list"> <li class="devsite-footer-sites-item"> <a href="//developer.android.com" class="devsite-footer-sites-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Android Link" > Android </a> </li> <li class="devsite-footer-sites-item"> <a href="//developer.chrome.com/home" class="devsite-footer-sites-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Chrome Link" > Chrome </a> </li> <li class="devsite-footer-sites-item"> <a href="//firebase.google.com" class="devsite-footer-sites-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Firebase Link" > Firebase </a> </li> <li class="devsite-footer-sites-item"> <a href="//cloud.google.com" class="devsite-footer-sites-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Google Cloud Platform Link" > Google Cloud Platform </a> </li> <li class="devsite-footer-sites-item"> <a href="//ai.google.dev/" class="devsite-footer-sites-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer Google AI Link" > Google AI </a> </li> <li class="devsite-footer-sites-item"> <a href="/products" class="devsite-footer-sites-link gc-analytics-event" data-category="Site-Wide Custom Events" data-label="Footer All products Link" > All products </a> </li> </ul> </nav> <nav class="devsite-footer-utility-links" aria-label="Utility links"> <ul class="devsite-footer-utility-list"> <li class="devsite-footer-utility-item "> <a class="devsite-footer-utility-link gc-analytics-event" href="/terms/site-terms" data-category="Site-Wide Custom Events" data-label="Footer Terms link" > Terms </a> </li> <li class="devsite-footer-utility-item "> <a class="devsite-footer-utility-link gc-analytics-event" href="//policies.google.com/privacy" data-category="Site-Wide Custom Events" data-label="Footer Privacy link" > Privacy </a> </li> <li class="devsite-footer-utility-item glue-cookie-notification-bar-control"> <a class="devsite-footer-utility-link gc-analytics-event" href="#" data-category="Site-Wide Custom Events" data-label="Footer Manage cookies link" aria-hidden="true" > Manage cookies </a> </li> <li class="devsite-footer-utility-item devsite-footer-utility-button"> <span class="devsite-footer-utility-description">Sign up for the Google for Developers newsletter</span> <a class="devsite-footer-utility-link gc-analytics-event" href="/newsletter/subscribe" data-category="Site-Wide Custom Events" data-label="Footer Subscribe link" > Subscribe </a> </li> </ul> <devsite-language-selector> <ul role="presentation"> <li role="presentation"> <a role="menuitem" lang="en" >English</a> </li> <li role="presentation"> <a role="menuitem" lang="de" >Deutsch</a> </li> <li role="presentation"> <a role="menuitem" lang="es" >Español</a> </li> <li role="presentation"> <a role="menuitem" lang="es_419" >Español – América Latina</a> </li> <li role="presentation"> <a role="menuitem" lang="fr" >Français</a> </li> <li role="presentation"> <a role="menuitem" lang="id" >Indonesia</a> </li> <li role="presentation"> <a role="menuitem" lang="it" >Italiano</a> </li> <li role="presentation"> <a role="menuitem" lang="pl" >Polski</a> </li> <li role="presentation"> <a role="menuitem" lang="pt_br" >Português – Brasil</a> </li> <li role="presentation"> <a role="menuitem" lang="vi" >Tiếng Việt</a> </li> <li role="presentation"> <a role="menuitem" lang="tr" >Türkçe</a> </li> <li role="presentation"> <a role="menuitem" lang="ru" >Русский</a> </li> <li role="presentation"> <a role="menuitem" lang="he" >עברית</a> </li> <li role="presentation"> <a role="menuitem" lang="ar" >العربيّة</a> </li> <li role="presentation"> <a role="menuitem" lang="fa" >فارسی</a> </li> <li role="presentation"> <a role="menuitem" lang="hi" >हिंदी</a> </li> <li role="presentation"> <a role="menuitem" lang="bn" >বাংলা</a> </li> <li role="presentation"> <a role="menuitem" lang="th" >ภาษาไทย</a> </li> <li role="presentation"> <a role="menuitem" lang="zh_cn" >中文 – 简体</a> </li> <li role="presentation"> <a role="menuitem" lang="zh_tw" >中文 – 繁體</a> </li> <li role="presentation"> <a role="menuitem" lang="ja" >日本語</a> </li> <li role="presentation"> <a role="menuitem" lang="ko" >한국어</a> </li> </ul> </devsite-language-selector> </nav> </div> </devsite-footer-utility> <devsite-panel></devsite-panel> <devsite-concierge data-info-panel data-ai-panel data-api-explorer-panel > </devsite-concierge> </section></section> <devsite-sitemask></devsite-sitemask> <devsite-snackbar></devsite-snackbar> <devsite-tooltip ></devsite-tooltip> <devsite-heading-link></devsite-heading-link> <devsite-analytics> <script type="application/json" analytics>[{"dimensions": {"dimension5": "en", "dimension1": "Signed out", "dimension11": false, "dimension6": "en", "dimension3": false, "dimension4": "Privacy Sandbox"}, "gaid": "UA-24532603-1", "metrics": {"ratings_count": "metric2", "ratings_value": "metric1"}, "purpose": 1}]</script> <script type="application/json" tag-management>{"at": "True", "ga4": [{"id": "G-272J68FCRF", "purpose": 1}], "ga4p": [{"id": "G-272J68FCRF", "purpose": 1}], "gtm": [{"id": "GTM-WPJH8HP6", "purpose": 0}], "parameters": {"internalUser": "False", "language": {"machineTranslated": "False", "requested": "en", "served": "en"}, "pageType": "blog", "projectName": "Privacy Sandbox", "signedIn": "False", "tenant": "developers", "recommendations": {"sourcePage": "", "sourceType": 0, "sourceRank": 0, "sourceIdenticalDescriptions": 0, "sourceTitleWords": 0, "sourceDescriptionWords": 0, "experiment": ""}, "experiment": {"ids": ""}}}</script> </devsite-analytics> <devsite-badger></devsite-badger> <script nonce="44v2s24OGziokqf7UWN1FLYPNeZKAE"> (function(d,e,v,s,i,t,E){d['GoogleDevelopersObject']=i; t=e.createElement(v);t.async=1;t.src=s;E=e.getElementsByTagName(v)[0]; E.parentNode.insertBefore(t,E);})(window, document, 'script', 'https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/developers/js/app_loader.js', '[1,"en",null,"/js/devsite_app_module.js","https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625","https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/developers","https://developers-dot-devsite-v2-prod.appspot.com",null,null,["/_pwa/developers/manifest.json","https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/images/video-placeholder.svg","https://www.gstatic.com/devrel-devsite/prod/v870e399c64f7c43c99a3043db4b3a74327bb93d0914e84a0c3dba90bbfd67625/developers/images/favicon-new.png","https://fonts.googleapis.com/css?family=Google+Sans:400,500|Roboto:400,400italic,500,500italic,700,700italic|Roboto+Mono:400,500,700&display=swap"],1,null,[1,6,8,12,14,17,21,25,50,52,63,70,75,76,80,87,91,92,93,97,98,100,101,102,103,104,105,107,108,109,110,112,113,117,118,120,122,124,125,126,127,129,130,131,132,133,134,135,136,138,140,141,147,148,149,151,152,156,157,158,159,161,163,164,168,169,170,179,180,182,183,186,191,193,196],"AIzaSyAP-jjEJBzmIyKR4F-3XITp8yM9T1gEEI8","AIzaSyB6xiKGDR5O3Ak2okS4rLkauxGUG7XP0hg","developers.google.com","AIzaSyAQk0fBONSGUqCNznf6Krs82Ap1-NV6J4o","AIzaSyCCxcqdrZ_7QMeLCRY20bh_SXdAYqy70KY",null,null,null,["Profiles__enable_dashboard_curated_recommendations","Cloud__enable_free_trial_server_call","Search__enable_page_map","Cloud__enable_cloudx_experiment_ids","Search__enable_dynamic_content_confidential_banner","Concierge__enable_concierge","MiscFeatureFlags__enable_variable_operator","BookNav__enable_tenant_cache_key","Profiles__require_profile_eligibility_for_signin","MiscFeatureFlags__enable_view_transitions","Search__enable_ai_eligibility_checks","Cloud__enable_cloud_shell_fte_user_flow","MiscFeatureFlags__enable_project_variables","DevPro__enable_cloud_innovators_plus","TpcFeatures__enable_mirror_tenant_redirects","Search__enable_suggestions_from_borg","Profiles__enable_awarding_url","Profiles__enable_completecodelab_endpoint","Cloud__enable_cloud_facet_chat","Concierge__enable_pushui","Profiles__enable_developer_profiles_callout","Analytics__enable_clearcut_logging","TpcFeatures__enable_required_headers","DevPro__enable_developer_subscriptions","EngEduTelemetry__enable_engedu_telemetry","Profiles__enable_release_notes_notifications","CloudShell__cloud_code_overflow_menu","MiscFeatureFlags__emergency_css","Cloud__enable_cloud_shell","Cloud__enable_legacy_calculator_redirect","Profiles__enable_public_developer_profiles","Profiles__enable_recognition_badges","Cloud__enable_cloud_dlp_service","Cloud__enable_llm_concierge_chat","MiscFeatureFlags__enable_explain_this_code","Profiles__enable_complete_playlist_endpoint","MiscFeatureFlags__developers_footer_image","Profiles__enable_profile_collections","Concierge__enable_concierge_restricted","Search__enable_ai_search_summaries_restricted","MiscFeatureFlags__enable_firebase_utm","Significatio__enable_by_tenant","CloudShell__cloud_shell_button","MiscFeatureFlags__developers_footer_dark_image","Experiments__reqs_query_experiments","Profiles__enable_page_saving","Cloud__enable_cloudx_ping","Search__enable_ai_search_summaries"],null,null,"AIzaSyBLEMok-5suZ67qRPzx0qUtbnLmyT_kCVE","https://developerscontentserving-pa.clients6.google.com","AIzaSyCM4QpTRSqP5qI4Dvjt4OAScIN8sOUlO-k","https://developerscontentsearch-pa.clients6.google.com",1,4,null,"https://developerprofiles-pa.clients6.google.com",[1,"developers","Google for Developers","developers.google.com",null,"developers-dot-devsite-v2-prod.appspot.com",null,null,[1,1,[1],null,null,null,null,null,null,null,null,[1],null,null,null,null,null,null,[1],[1,null,null,[1,20],"/recommendations/information"],null,null,null,[1,1,1],[1,1,null,1,1]],null,[null,null,null,null,null,null,"/images/lockup-new.svg","/images/touchicon-180-new.png",null,null,null,null,1,null,null,null,null,null,null,null,null,1,null,null,null,"/images/lockup-dark-theme-new.svg",[]],[],null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[6,1,14,15,20,22,23,29,32,36],null,[[null,null,null,[3,7,10,2,39,17,4,32,24,11,12,13,34,15,25],null,null,[1,[["docType","Choose a content type",[["Tutorial",null,null,null,null,null,null,null,null,"Tutorial"],["Guide",null,null,null,null,null,null,null,null,"Guide"],["Sample",null,null,null,null,null,null,null,null,"Sample"]]],["product","Choose a product",[["Android",null,null,null,null,null,null,null,null,"Android"],["ARCore",null,null,null,null,null,null,null,null,"ARCore"],["ChromeOS",null,null,null,null,null,null,null,null,"ChromeOS"],["Firebase",null,null,null,null,null,null,null,null,"Firebase"],["Flutter",null,null,null,null,null,null,null,null,"Flutter"],["Assistant",null,null,null,null,null,null,null,null,"Google Assistant"],["GoogleCloud",null,null,null,null,null,null,null,null,"Google Cloud"],["GoogleMapsPlatform",null,null,null,null,null,null,null,null,"Google Maps Platform"],["GooglePay",null,null,null,null,null,null,null,null,"Google Pay & Google Wallet"],["GooglePlay",null,null,null,null,null,null,null,null,"Google Play"],["Tensorflow",null,null,null,null,null,null,null,null,"TensorFlow"]]],["category","Choose a topic",[["AiAndMachineLearning",null,null,null,null,null,null,null,null,"AI and Machine Learning"],["Data",null,null,null,null,null,null,null,null,"Data"],["Enterprise",null,null,null,null,null,null,null,null,"Enterprise"],["Gaming",null,null,null,null,null,null,null,null,"Gaming"],["Mobile",null,null,null,null,null,null,null,null,"Mobile"],["Web",null,null,null,null,null,null,null,null,"Web"]]]]]],[1,1],null,1],[[["UA-24532603-1"],["UA-22084204-5"],null,null,["UA-24532603-5"],null,null,[["G-272J68FCRF"],null,null,[["G-272J68FCRF",2]]],[["UA-24532603-1",2]],null,[["UA-24532603-5",2]],null,1],[[15,12],[14,11],[12,9],[1,1],[16,13],[5,4],[4,3],[13,10],[11,8],[6,5],[3,2]],[[2,2],[1,1]]],null,4,null,null,null,null,null,null,null,null,null,null,null,null,null,"developers.devsite.google"],null,"pk_live_5170syrHvgGVmSx9sBrnWtA5luvk9BwnVcvIi7HizpwauFG96WedXsuXh790rtij9AmGllqPtMLfhe2RSwD6Pn38V00uBCydV4m"]') </script> <devsite-a11y-announce></devsite-a11y-announce> </body> </html>