diff --git a/projects/packages/jetpack-mu-wpcom/changelog/cm-841-surface-login-requirement b/projects/packages/jetpack-mu-wpcom/changelog/cm-841-surface-login-requirement
new file mode 100644
index 000000000000..02fec7816e12
--- /dev/null
+++ b/projects/packages/jetpack-mu-wpcom/changelog/cm-841-surface-login-requirement
@@ -0,0 +1,4 @@
+Significance: patch
+Type: fixed
+
+Verbum Comments: surface the login requirement up front when registration is required but in-frame social login is unavailable, instead of showing a guest form that is rejected on submit.
diff --git a/projects/packages/jetpack-mu-wpcom/changelog/verbum-iframe-social-login-storage-access b/projects/packages/jetpack-mu-wpcom/changelog/verbum-iframe-social-login-storage-access
new file mode 100644
index 000000000000..11fbad5e0f61
--- /dev/null
+++ b/projects/packages/jetpack-mu-wpcom/changelog/verbum-iframe-social-login-storage-access
@@ -0,0 +1,4 @@
+Significance: minor
+Type: added
+
+Verbum Comments: allow social login (WordPress.com / Facebook) inside the cross-origin comment iframe on Atomic/Jetpack sites by requesting first-party cookie access via the Storage Access API.
diff --git a/projects/packages/jetpack-mu-wpcom/src/features/verbum-comments/class-verbum-comments.php b/projects/packages/jetpack-mu-wpcom/src/features/verbum-comments/class-verbum-comments.php
index 59a7025e7b0a..5451005a6c6c 100644
--- a/projects/packages/jetpack-mu-wpcom/src/features/verbum-comments/class-verbum-comments.php
+++ b/projects/packages/jetpack-mu-wpcom/src/features/verbum-comments/class-verbum-comments.php
@@ -237,6 +237,7 @@ public function enqueue_assets() {
/* translators: %s is the name of the provider (WordPress, Facebook, Twitter) */
'Logged in via %s' => __( 'Logged in via %s', 'jetpack-mu-wpcom' ),
'Log out' => __( 'Log out', 'jetpack-mu-wpcom' ),
+ 'Log in' => __( 'Log in', 'jetpack-mu-wpcom' ),
'Email' => __( 'Email', 'jetpack-mu-wpcom' ),
'(Address never made public)' => __( '(Address never made public)', 'jetpack-mu-wpcom'), // phpcs:ignore PEAR.Functions.FunctionCallSignature.SpaceBeforeCloseBracket
'Instantly' => __( 'Instantly', 'jetpack-mu-wpcom' ),
diff --git a/projects/packages/jetpack-mu-wpcom/src/features/verbum-comments/src/components/logged-out.tsx b/projects/packages/jetpack-mu-wpcom/src/features/verbum-comments/src/components/logged-out.tsx
index 1b96b5824aad..8870ee482076 100644
--- a/projects/packages/jetpack-mu-wpcom/src/features/verbum-comments/src/components/logged-out.tsx
+++ b/projects/packages/jetpack-mu-wpcom/src/features/verbum-comments/src/components/logged-out.tsx
@@ -40,6 +40,31 @@ const getLoginCommentText = ( commentParent: Signal ) => {
return { defaultText };
};
+/**
+ * Build a top-level login URL for the site the comment form belongs to.
+ *
+ * On Atomic/Jetpack the comment form runs inside a cross-origin iframe, so the parent post URL
+ * is passed in via the location hash (`#parent=…`). We log in against that site so the visitor
+ * returns authenticated (via Jetpack SSO) and can comment.
+ *
+ * @return {string} - The site's login URL, or the bare target if it can't be parsed.
+ */
+const getSiteLoginUrl = () => {
+ const parentUrl = decodeURIComponent(
+ window.location.hash.match( /[#&]parent=([^&]*)/ )?.[ 1 ] ?? ''
+ );
+
+ const target = parentUrl || VerbumComments.homeURL || '';
+
+ try {
+ return `${ new URL( target ).origin }/wp-login.php?redirect_to=${ encodeURIComponent(
+ target
+ ) }`;
+ } catch {
+ return target;
+ }
+};
+
export const LoggedOut = ( { login, canWeAccessCookies, loginWindow }: LoggedOutProps ) => {
const [ activeService, setActiveService ] = useState( '' );
const closeLoginPopupService = requireNameEmail && ! mustLogIn ? 'mail' : '';
@@ -84,11 +109,41 @@ export const LoggedOut = ( { login, canWeAccessCookies, loginWindow }: LoggedOut
const { commentParent } = useContext( VerbumSignals );
+ // In the iframe (Atomic/Jetpack) we offer social login and request cookie access on click,
+ // so the buttons render even when the cookie test currently fails.
+ const showSocialButtons = canWeAccessCookies || !! VerbumComments.isJetpackComments;
+
+ // Login is required but cookies are blocked, so an in-frame login may not stick. Keep the
+ // top-level login link on offer — without it, a denied cookie prompt is a dead end again.
+ const showSiteLogin = mustLogIn && ! canWeAccessCookies;
+
+ if ( showSiteLogin && ! showSocialButtons ) {
+ return (
+