Summary
/customer_authentication/login?login_hint=<email>&return_to=<path> always sends prompt=login to the configured external OIDC Identity Provider (Clerk), even though Shopify's documentation implies it should attempt prompt=none (silent authentication) first and fall back to interactive on IdP error.
Environment
- Store: Shopify Plus,
customerAccountsVersion: NEW_CUSTOMER_ACCOUNTS
- External IdP: Clerk (OIDC, confidential client, consent screen disabled)
- Storefront: Hydrogen (headless) on Vercel
- Customer account domain:
account.avnzor.com
- Checkout domain:
shop.avnzor.com
Steps to reproduce
- Configure an external OIDC IdP (Clerk) for new customer accounts
- Ensure the user has an active session on the IdP (verified via the IdP's Account Portal)
- Navigate to:
https://shop.avnzor.com/customer_authentication/login?login_hint=user@example.com&return_to=/
- Observe the redirect chain
Expected behavior
Per documentation, the endpoint should first attempt prompt=none against the IdP. If the IdP returns error=login_required, fall back to prompt=login (interactive).
Actual behavior
The endpoint always sends prompt=login to the IdP — no prompt=none attempt is made. This was verified by:
- Capturing the redirect URL in the browser's tab context (the Clerk authorize URL clearly contains
prompt=login)
- Testing 3 times with a confirmed-active IdP session —
prompt=login every time
- Independently confirming that the IdP does honor
prompt=none when called directly (issues an auth code silently with no UI)
Impact
This forces a double sign-in for headless storefronts using an external IdP:
- User signs in on the headless storefront (via the IdP's embedded components)
- At checkout / "My Orders", Shopify redirects to the IdP with
prompt=login
- IdP shows a full sign-in form despite the user having an active session
- User must authenticate again
With prompt=none, step 3 would complete silently (the IdP already has the session), and the user would never see a second sign-in form.
Workaround attempted (failed)
We built a server-side proxy that follows the redirect chain, finds the IdP's authorize URL, and rewrites prompt=login → prompt=none. The silent auth code issuance worked, but Shopify's token exchange failed ("Access token request error") because the server-side fetch didn't forward Shopify's session cookies to the browser.
Request
Either:
- Fix the endpoint to try
prompt=none first (as documented), or
- Add a configuration option (e.g.,
prompt=auto query parameter, or a shop-level setting) that controls the prompt behavior for external IdPs
Summary
/customer_authentication/login?login_hint=<email>&return_to=<path>always sendsprompt=loginto the configured external OIDC Identity Provider (Clerk), even though Shopify's documentation implies it should attemptprompt=none(silent authentication) first and fall back to interactive on IdP error.Environment
customerAccountsVersion: NEW_CUSTOMER_ACCOUNTSaccount.avnzor.comshop.avnzor.comSteps to reproduce
https://shop.avnzor.com/customer_authentication/login?login_hint=user@example.com&return_to=/Expected behavior
Per documentation, the endpoint should first attempt
prompt=noneagainst the IdP. If the IdP returnserror=login_required, fall back toprompt=login(interactive).Actual behavior
The endpoint always sends
prompt=loginto the IdP — noprompt=noneattempt is made. This was verified by:prompt=login)prompt=loginevery timeprompt=nonewhen called directly (issues an auth code silently with no UI)Impact
This forces a double sign-in for headless storefronts using an external IdP:
prompt=loginWith
prompt=none, step 3 would complete silently (the IdP already has the session), and the user would never see a second sign-in form.Workaround attempted (failed)
We built a server-side proxy that follows the redirect chain, finds the IdP's authorize URL, and rewrites
prompt=login→prompt=none. The silent auth code issuance worked, but Shopify's token exchange failed ("Access token request error") because the server-side fetch didn't forward Shopify's session cookies to the browser.Request
Either:
prompt=nonefirst (as documented), orprompt=autoquery parameter, or a shop-level setting) that controls the prompt behavior for external IdPs