fix(oidc-client): always pass prompt=none on background authorize calls - #748
fix(oidc-client): always pass prompt=none on background authorize calls#748ryanbas21 wants to merge 4 commits into
Conversation
📝 WalkthroughWalkthroughBackground OIDC authorization now preserves caller-provided options and does not add ChangesOIDC background authorization
DaVinci polling effects
E2E session services
OIDC test runner migration
DaVinci API report alignment
Estimated code review effort: 4 (Complex) | ~45 minutes Possibly related PRs
Suggested reviewers: 🚥 Pre-merge checks | ✅ 2 | ❌ 3❌ Failed checks (3 warnings)
✅ Passed checks (2 passed)
✨ Finishing Touches 💡 1📝 Generate docstrings 💡
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
🦋 Changeset detectedLatest commit: bbafd97 The changes in this PR will be included in the next version bump. This PR includes changesets to release 12 packages
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
|
View your CI Pipeline Execution ↗ for commit 08edab1
💡 Dealing with memory or CPU issues? See memory and CPU details with the resource usage add-on ↗. ☁️ Nx Cloud last updated this comment at |
Background authorize flows (both standard and PAR) must include prompt=none so the authorization server does not prompt the user for interaction. The standard flow already enforced this inside createAuthorizeUrlµ; the PAR flow was not injecting it, meaning any background PAR call without an explicit prompt option would silently omit the required parameter.
15f8987 to
6f3c67f
Compare
Codecov Report❌ Patch coverage is Please upload reports for the commit 6f3c67f to get more accurate results. ❌ Your project status has failed because the head coverage (23.64%) is below the target coverage (40.00%). You can increase the head coverage or adjust the target coverage. Additional details and impacted files@@ Coverage Diff @@
## main #748 +/- ##
==========================================
+ Coverage 18.07% 23.64% +5.57%
==========================================
Files 155 162 +7
Lines 24398 25716 +1318
Branches 1203 1660 +457
==========================================
+ Hits 4410 6081 +1671
+ Misses 19988 19635 -353
🚀 New features to boost your workflow:
|
@forgerock/davinci-client
@forgerock/device-client
@forgerock/journey-client
@forgerock/oidc-client
@forgerock/protect
@forgerock/sdk-types
@forgerock/sdk-utilities
@forgerock/iframe-manager
@forgerock/sdk-logger
@forgerock/sdk-oidc
@forgerock/sdk-request-middleware
@forgerock/storage
@forgerock/sdk-wellknown
commit: |
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/oidc-client/src/lib/client.store.ts`:
- Around line 210-213: Update the background authorization flow around
authorizeµ so bgOptions is always an options object containing prompt: 'none',
while preserving any caller-provided options. Add regression coverage for
authorize.background() without arguments in both PAR and standard authorization
flows.
🪄 Autofix
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro Plus
Run ID: 40de47a1-7d61-4cc0-a5d3-e6ac03c6c004
📒 Files selected for processing (3)
.changeset/oidc-prompt-none-background.mdpackages/oidc-client/src/lib/client.store.test.tspackages/oidc-client/src/lib/client.store.ts
| options !== undefined ? { ...options, prompt: 'none' as const } : undefined; | ||
| const result = await Micro.runPromiseExit( | ||
| authorizeµ(wellknown, config, log, store, options, useParFlow), | ||
| authorizeµ(wellknown, config, log, store, bgOptions, useParFlow), |
There was a problem hiding this comment.
Can we simplify the code to authorizeµ(wellknown, config, log, store, { ...options, prompt: 'none'}, useParFlow), instead of creating a new bgOptions variable?
There was a problem hiding this comment.
🧹 Nitpick comments (1)
packages/oidc-client/src/lib/client.store.test.ts (1)
689-773: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick winTest caller-provided
promptprecedence.Add PAR and standard-flow cases that call
background({ prompt: 'login' }). Assert that each outbound request still containsprompt=none. A reversed merge order would pass the current tests because they only omitprompt.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/oidc-client/src/lib/client.store.test.ts` around lines 689 - 773, The authorize.background() enforcement test only covers omitted prompts; extend it with PAR and standard-flow calls that provide prompt: 'login', then assert each outbound request still sends prompt=none. Update the existing test around authorize.background() and its captured PAR and authorize request assertions, preserving the current omission cases.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Nitpick comments:
In `@packages/oidc-client/src/lib/client.store.test.ts`:
- Around line 689-773: The authorize.background() enforcement test only covers
omitted prompts; extend it with PAR and standard-flow calls that provide prompt:
'login', then assert each outbound request still sends prompt=none. Update the
existing test around authorize.background() and its captured PAR and authorize
request assertions, preserving the current omission cases.
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro Plus
Run ID: 02c52d78-d137-410b-b577-493fc4edaa23
📒 Files selected for processing (2)
packages/oidc-client/src/lib/client.store.test.tspackages/oidc-client/src/lib/client.store.ts
🚧 Files skipped from review as they are similar to previous changes (1)
- packages/oidc-client/src/lib/client.store.ts
- bgOptions unconditionally set to spread options with prompt:none - add regression test for background() called with no arguments
b361bfe to
08edab1
Compare
|
Note GitHub couldn't provide a complete incremental comparison for this pull request, so CodeRabbit is performing a full review instead. This review may take a little longer. |
There was a problem hiding this comment.
Nx Cloud has identified a possible root cause for your failed CI:
We classified this failure as an environment issue rather than a code regression. The failing test exercises the interactive PAR redirect login flow, which is unrelated to the background() changes introduced by this PR. The external ForgeBlocks auth server successfully received the PAR request but did not redirect back within the timeout, indicating an external service dependency failure.
No code changes were suggested for this issue.
Trigger a rerun:
🎓 Learn more about Self-Healing CI on nx.dev
| config, | ||
| log, | ||
| store, | ||
| authorizeOptions, |
There was a problem hiding this comment.
I think we need to enforce prompt: 'none' in the authorizeOptions here as well.
… calls - fix(oidc-client): use vitest native it + Micro.runPromise (fixes @effect/vitest v3/v4) - fix(davinci-client): restore Either returns in classifyPollResponse, buildChallengeEndpoint - fix(mock-api-v2): propagate session.service failures; fix validateCapabilitiesResponse body - test(e2e): skip PAR redirect login test pending server-side fix
There was a problem hiding this comment.
Actionable comments posted: 2
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
packages/oidc-client/src/lib/client.store.ts (1)
210-212: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
background()no longer forcesprompt=none.Line 211 passes
optionsstraight toauthorizeµ. The PR objectives state thatbackground()must mergeprompt: 'none'into the options for both the standard and the PAR flow. Withoutprompt=none, the authorization server can return an interactive login page for the hidden background request. The call then hangs or fails instead of returninglogin_required. Reviewers raised this point on earlier commits.🐛 Proposed fix
const result = await Micro.runPromiseExit( - authorizeµ(wellknown, config, log, store, options, useParFlow), + authorizeµ(wellknown, config, log, store, { ...options, prompt: 'none' }, useParFlow), );Run the following script to check the related tests and the
authorizeµoption handling:#!/bin/bash # Find prompt=none expectations in oidc-client tests and the authorizeµ option path. rg -n -C4 "prompt" --glob 'packages/oidc-client/src/**' -g '*.ts'🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/oidc-client/src/lib/client.store.ts` around lines 210 - 212, Update background() at the authorizeµ invocation to merge prompt: 'none' into the options before passing them to Micro.runPromiseExit, preserving all existing options. Ensure this merged option is used for both standard and PAR authorization flows.
🧹 Nitpick comments (3)
e2e/oidc-suites/src/par.spec.ts (1)
90-91: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winTrack the server-side defect before keeping this test skipped.
Add an upstream issue reference and a re-enable condition to this TODO. The skip removes end-to-end coverage for the PAR redirect-login and token flow. The existing unit tests only cover client-side PAR URL construction.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@e2e/oidc-suites/src/par.spec.ts` around lines 90 - 91, Update the skipped test declaration for “redirect login with PAR enabled (ParClient)” to include a reference to the tracked upstream server-side issue and an explicit condition or TODO mechanism for re-enabling it once that defect is fixed, while preserving the test’s existing end-to-end coverage and assertions.packages/oidc-client/src/lib/session.micros.test.ts (1)
206-211: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winFailure assertions can be skipped in both migrated test files. The migration from
it.effectreplaced typed failure assertions with a combined guard that returns early whenMicro.causeIsFailisfalse. A defect (Die) cause still satisfiesMicro.exitIsFailure, so the error-field assertions never run and the test passes.
packages/oidc-client/src/lib/session.micros.test.ts#L206-L211: addexpect(Micro.causeIsFail(exit.cause)).toBe(true)before the early return, and apply the same change to every failure case in the file.packages/oidc-client/src/lib/exchange.utils.test.ts#L97-L104: addexpect(Micro.causeIsFail(result.cause)).toBe(true)before the early return, and apply the same change at lines 126-133 and 147-154.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/oidc-client/src/lib/session.micros.test.ts` around lines 206 - 211, Ensure every failure-case assertion in packages/oidc-client/src/lib/session.micros.test.ts at lines 206-211 and throughout the file, plus packages/oidc-client/src/lib/exchange.utils.test.ts at lines 97-104, 126-133, and 147-154, explicitly expects Micro.causeIsFail(exit.cause/result.cause) to be true before any early return; retain the existing typed error-field assertions so defect causes cannot silently pass.e2e/mock-api-v2/src/services/session.service.ts (1)
16-19: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winAdd regression coverage for the new session contract and failure paths.
Test successful
refreshSessioncalls and assert that the returnedSessionDatacontains the updated expiry. Test missing-sessionupdateSessioncalls and missing or expiredrefreshSessioncalls. Assert the failure messages and removal of expired sessions. The PR coverage report identifies changed lines without coverage.Also applies to: 68-68, 81-87, 89-94
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@e2e/mock-api-v2/src/services/session.service.ts` around lines 16 - 19, Add regression tests for the session service contract around refreshSession and updateSession: verify successful refreshSession returns SessionData with the updated expiry, missing-session updateSession fails with the expected message, and missing or expired refreshSession calls fail with the expected messages while removing expired sessions. Cover the changed branches and declarations associated with refreshSession, updateSession, and expired-session handling.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/davinci-client/src/lib/client.store.effects.ts`:
- Around line 189-191: Update the completed-challenge branch handling
PollDispatchResult.data to validate status at runtime: accept only string values
matching an allowed PollingStatus member, and return {_tag: 'error'} for
non-string or unsupported statuses. Remove the unchecked cast in this path and
add tests covering both a non-string status and an unsupported string status.
In `@packages/oidc-client/src/lib/authorize.request.micros.ts`:
- Line 122: Update background() in authorize.request.micros.ts to merge prompt:
'none' into the options passed to both PAR and standard authorization flows,
including when called without arguments, while preserving caller-provided
options otherwise. Update the related assertions in client.store.test.ts to
expect prompt=none and revise .changeset/oidc-prompt-none-background.md
accordingly.
---
Outside diff comments:
In `@packages/oidc-client/src/lib/client.store.ts`:
- Around line 210-212: Update background() at the authorizeµ invocation to merge
prompt: 'none' into the options before passing them to Micro.runPromiseExit,
preserving all existing options. Ensure this merged option is used for both
standard and PAR authorization flows.
---
Nitpick comments:
In `@e2e/mock-api-v2/src/services/session.service.ts`:
- Around line 16-19: Add regression tests for the session service contract
around refreshSession and updateSession: verify successful refreshSession
returns SessionData with the updated expiry, missing-session updateSession fails
with the expected message, and missing or expired refreshSession calls fail with
the expected messages while removing expired sessions. Cover the changed
branches and declarations associated with refreshSession, updateSession, and
expired-session handling.
In `@e2e/oidc-suites/src/par.spec.ts`:
- Around line 90-91: Update the skipped test declaration for “redirect login
with PAR enabled (ParClient)” to include a reference to the tracked upstream
server-side issue and an explicit condition or TODO mechanism for re-enabling it
once that defect is fixed, while preserving the test’s existing end-to-end
coverage and assertions.
In `@packages/oidc-client/src/lib/session.micros.test.ts`:
- Around line 206-211: Ensure every failure-case assertion in
packages/oidc-client/src/lib/session.micros.test.ts at lines 206-211 and
throughout the file, plus packages/oidc-client/src/lib/exchange.utils.test.ts at
lines 97-104, 126-133, and 147-154, explicitly expects
Micro.causeIsFail(exit.cause/result.cause) to be true before any early return;
retain the existing typed error-field assertions so defect causes cannot
silently pass.
🪄 Autofix
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro Plus
Run ID: 7757ba1c-b2e9-4b5c-b6e0-c6f5ae65bde6
📒 Files selected for processing (13)
.changeset/oidc-prompt-none-background.mde2e/mock-api-v2/src/services/mock-env-helpers/index.tse2e/mock-api-v2/src/services/session.service.tse2e/oidc-suites/src/par.spec.tspackages/davinci-client/src/lib/client.store.effects.test.tspackages/davinci-client/src/lib/client.store.effects.tspackages/oidc-client/src/lib/authorize.request.micros.test.tspackages/oidc-client/src/lib/authorize.request.micros.tspackages/oidc-client/src/lib/authorize.request.utils.test.tspackages/oidc-client/src/lib/client.store.test.tspackages/oidc-client/src/lib/client.store.tspackages/oidc-client/src/lib/exchange.utils.test.tspackages/oidc-client/src/lib/session.micros.test.ts
| if (data['isChallengeComplete'] === true) { | ||
| const pollStatus = data['status']; | ||
| return pollStatus ? (pollStatus as PollingStatus) : 'error'; | ||
| const status = data['status']; | ||
| return status ? { _tag: 'complete', status: status as PollingStatus } : { _tag: 'error' }; |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
Validate the completed challenge status at runtime.
PollDispatchResult.data is unknown. The truthiness check accepts any non-empty value and casts it to PollingStatus. A response with an unsupported status stops polling and returns an invalid terminal status.
Validate the status type and allowed PollingStatus values. Classify invalid values as error. Add tests for a non-string status and an unsupported string status.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@packages/davinci-client/src/lib/client.store.effects.ts` around lines 189 -
191, Update the completed-challenge branch handling PollDispatchResult.data to
validate status at runtime: accept only string values matching an allowed
PollingStatus member, and return {_tag: 'error'} for non-string or unsupported
statuses. Remove the unchecked cast in this path and add tests covering both a
non-string status and an unsupported string status.
| string, | ||
| GetAuthorizationUrlOptions, | ||
| ], | ||
| [await createAuthorizeUrl(path, options), options] as [string, GetAuthorizationUrlOptions], |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
# Locate the background authorization entry point and inspect its option merge.
rg -n -C 8 --type ts '\bbackground\b|authorizeµ\s*\(' \
packages/oidc-client/src/lib/client.store.ts \
packages/oidc-client/src/lib/client.store.test.ts \
packages/oidc-client/src/lib/authorize.request.ts
# Confirm that background tests expect prompt=none in both PAR and standard flows.
rg -n -C 3 --type ts 'background\(\).*prompt|capturedParBody|capturedAuthorizeUrl|prompt' \
packages/oidc-client/src/lib/client.store.test.tsRepository: ForgeRock/ping-javascript-sdk
Length of output: 34642
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "Files:"
git ls-files | rg '(^|/)authorize\.request\.micros\.ts$|authorize\.request\.ts$|client\.store\.ts$|client\.store\.test\.ts$|oidc-prompt-none-background\.md$' || true
echo
echo "authorize.request.micros.ts lines 90-140:"
sed -n '90,140p' packages/oidc-client/src/lib/authorize.request.micros.ts | cat -n -v
echo
echo "client.store.ts background lines 190-220:"
sed -n '190,220p' packages/oidc-client/src/lib/client.store.ts | cat -n -v
echo
echo "authorize.request.ts lines 149-220:"
sed -n '149,220p' packages/oidc-client/src/lib/authorize.request.ts | cat -n -v
echo
echo "changeset:"
cat .changeset/oidc-prompt-none-background.md
echo
echo "tests around background prompt expectations:"
sed -n '640,845p' packages/oidc-client/src/lib/client.store.test.ts | cat -n -vRepository: ForgeRock/ping-javascript-sdk
Length of output: 14694
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "client.store.ts authorize.url implementation:"
sed -n '132,188p' packages/oidc-client/src/lib/client.store.ts | cat -n -v
echo
echo "buildAuthorizeOptions declaration/implementation:"
rg -n -C 8 'function buildAuthorizeOptions|const buildAuthorizeOptions|export .*buildAuthorizeOptions' packages/oidc-client/src/lib packages/davinci-client/src/lib packages/journey-client/src/lib || true
echo
echo "prompt-related parameter handling:"
rg -n -C 5 'buildAuthorizeParams|deriveOptionsFrom|createAuthorizeUrl\(' packages/oidc-client/src/lib/authorize.request.micros.ts packages/oidc-client/src/lib/authorize.request.ts || true
echo
echo "read-only behavioral verifier for source option merge:"
python3 - <<'PY'
from pathlib import Path
import re
for path in [
"packages/oidc-client/src/lib/client.store.ts",
"packages/oidc-client/src/lib/authorize.request.ts",
"packages/oidc-client/src/lib/authorize.request.micros.ts",
]:
text = Path(path).read_text()
print(f"\n--- {path} ---")
if path.endswith("client.store.ts"):
m = re.search(r"background:\s*async\s*\([^)]*\)\s*=>[^{]*\{(?P<body>.*?)\n\s*\},\n\s*\}", text, re.S)
print("background passes options to authorizeµ:", bool(re.search(r"authorizeµ\s*\([^)]*\boptions\b", m.group("body")) if m else ""))
elif path.endswith("authorize.request.ts"):
m = re.search(r"export\s+function\s+authorizeµ\s*\([^)]*\)\s*:\s*Micro\.Micro[^{]*\{(?P<body>.*?)\n\}", text, re.S)
print("authorizeµ spreads options:", bool(re.search(r"\.\.\.options", m.group("body")) if m else ""))
elif path.endswith("authorize.request.micros.ts"):
m = re.search(r"export\s+const\s+createAuthorizeUrlµ", text)
print("createAuthorizeUrlµ returns options unchanged:", bool(m))
PYRepository: ForgeRock/ping-javascript-sdk
Length of output: 9341
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "buildAuthorizeOptions implementation:"
sed -n '29,90p' packages/oidc-client/src/lib/authorize.request.utils.ts | cat -n -v
echo
echo "createParAuthorizeUrlµ call sites prompt arguments:"
rg -n -C 8 'createParAuthorizeUrlµ\s*\(' packages/oidc-client/src/lib packages/oidc-client/src/test || true
echo
echo "exported type definitions for prompt options:"
fd -a '.*\.ts$' packages/oidc-client/src | xargs rg -n 'GetAuthorizationUrlOptions|GetAuthorizeOptions|OptionalAuthorizeOptions|prompt:' || true
echo
echo "read-only verifier for background option path:"
python3 - <<'PY'
from pathlib import Path
client = Path("packages/oidc-client/src/lib/client.store.ts").read_text()
utils = Path("packages/oidc-client/src/lib/authorize.request.utils.ts").read_text()
micros = Path("packages/oidc-client/src/lib/authorize.request.micros.ts").read_text()
request = Path("packages/oidc-client/src/lib/authorize.request.ts").read_text()
checks = {
"background passes raw caller options": "authorizeµ(wellknown, config, log, store, options, useParFlow)" in client,
"authorizeµ passes raw options to PAR body options": "...options" in request and "parDispatchOptions" in request.split("export function authorizeµ",1)[1] if "export function authorizeµ" in request else False,
"buildAuthorizeOptions includes prompt config option": "prompt" in utils,
"createAuthorizeUrlµ returns options unchanged": "options" in micros[micros.find("createAuthorizeUrlµ"):micros.find("export const buildAuthorizeRedirectUrlµ")]
}
for k,v in checks.items():
print(f"{k}: {v}")
PYRepository: ForgeRock/ping-javascript-sdk
Length of output: 22647
Restore prompt=none for background authorization.
background() passes raw caller options into both PAR and standard flows, and the updated tests assert that omitted prompt is sent as-is. Merge prompt: 'none' into the background options for both flows, including no-argument calls, and update the release notes and assertions accordingly.
📍 Affects 3 files
packages/oidc-client/src/lib/authorize.request.micros.ts#L122-L122(this comment).changeset/oidc-prompt-none-background.md#L5-L5packages/oidc-client/src/lib/client.store.test.ts#L683-L839
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@packages/oidc-client/src/lib/authorize.request.micros.ts` at line 122, Update
background() in authorize.request.micros.ts to merge prompt: 'none' into the
options passed to both PAR and standard authorization flows, including when
called without arguments, while preserving caller-provided options otherwise.
Update the related assertions in client.store.test.ts to expect prompt=none and
revise .changeset/oidc-prompt-none-background.md accordingly.
Summary
Background authorize flows (both standard and PAR) must include
prompt=noneso the authorization server does not prompt the user for interaction during silent/background token acquisition.Bug
The standard authorize flow already enforced
prompt=noneinsidecreateAuthorizeUrlµ(hardcoded). The PAR flow did not —createParAuthorizeUrlµpassedpromptfrom the caller's options, which meant any background PAR call without an explicitpromptoption would silently omit the required parameter.Fix
In
background()(client.store.ts), mergeprompt: 'none'into options before delegating toauthorizeµ. This is the correct enforcement point: it covers both flow paths (standard and PAR) and mirrors how the OIDC spec expects silent authentication to work.Tests
prompt=nonein the PAR POST bodybackground() always includes prompt=none even when options omit it(covers both PAR-enabled and standard flow paths)Summary by CodeRabbit
prompt=none; authorization options are now respected as provided.