Opening RTL causes CLN Application CSRF failure and misleading password prompt
Nobody has claimed this yet.
Assessment
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Newbie friendliness
- 48/100
- Issue type
- Bug
- Clarity
- Mostly clear
- Activity status
- Active
- Tech stack
- typescript
- Domain
- authentication, security
Research direction
Start at the Axios CSRF configuration and the RootService.getAuthStatus() entry point, then reproduce the shared-hostname, different-port browser flow with RTL. Trace how the XSRF-TOKEN cookie reaches /v1/auth/isauthenticated/ and how its error is converted into the password state. Done means RTL no longer invalidates CLN Application authentication and CSRF or network errors are not shown as password failures.
Written by the indexing model from the issue text.
Description
Summary
When CLN Application and Ride The Lightning (RTL) are served from the same hostname on different ports, opening RTL can cause CLN Application to fail its next authentication-status request with 403 Invalid CSRF token. Form tempered. CLN Application then displays its password dialog even when APP_SINGLE_SIGN_ON=true and the Umbrel session remains valid.
Browser cookies are scoped by hostname and path, not port. RTL writes a generic XSRF-TOKEN cookie at Path=/ on the shared hostname. Axios in CLN Application can consume that cookie for its XSRF header instead of the token CLN Application fetched from /v1/shared/csrf/.
Environment
- Umbrel / umbrelOS
- CLN Application image:
ghcr.io/elementsproject/cln-application:26.04 - CLN Application URL:
http://<host>:2103/cln APP_SINGLE_SIGN_ON=true- RTL URL:
http://<host>:3100/rtl - Reproduced with RTL v0.15.8
- Reviewed RTL v0.15.12 source: it still uses the generic
XSRF-TOKENcookie atPath=/ - Both apps use the same hostname and different ports
Steps to reproduce
- Log in to Umbrel normally.
- Open CLN Application and confirm it authenticates through SSO and displays node data without a password prompt.
- Open RTL on the same hostname in the same browser profile.
- Return to or reload CLN Application.
Actual behavior
CLN Application sends POST /v1/auth/isauthenticated/, receives HTTP 403, zeroes the displayed node data, and opens the password dialog.
Browser console:
Failed to load resource: the server responded with a status of 403 (Forbidden)
HTTP Request failed for post /auth/isauthenticated ... Invalid CSRF token. Form tempered.
Auth Status failed: Invalid CSRF token. Form tempered.
CLN Application server log at the same timestamps:
Invalid CSRF token. Form tempered.
This is misleading because the password is not wrong and SSO is still valid. lightningd remains healthy.
Confirmed recovery
Expiring only the XSRF-TOKEN cookie for the shared hostname at Path=/, then reloading CLN Application, immediately removes the password dialog and restores authenticated node data. Neither CLN Application nor lightningd needs to be restarted.
A direct HTTP test that shared only the _csrf cookie did not reproduce the failure. The real browser flow did reproduce it, which points specifically to Axios automatically reading RTL's visible XSRF-TOKEN cookie.
Relevant CLN Application behavior
CLN Application explicitly fetches a CSRF token from /v1/shared/csrf/ and assigns it to Axios's X-XSRF-TOKEN default header. However, Axios also has conventional XSRF-TOKEN cookie handling.
Separately, RootService.getAuthStatus() catches any request error and returns a state equivalent to unauthenticated with a valid password. Startup then opens the password modal, masking the underlying CSRF error.
Expected behavior
- Cookies created by another same-host application must not invalidate CLN Application requests.
- A CSRF/network error from
/auth/isauthenticatedmust not be presented as a password failure. - With
APP_SINGLE_SIGN_ON=true, this failure should provide a recoverable error state rather than a password prompt.
Suggested fixes
- Give CLN Application unique XSRF cookie/header names, or disable Axios automatic
XSRF-TOKENcookie consumption because CLN Application already fetches and sets its CSRF token explicitly. - Consider scoping the CLN CSRF cookie to an application-specific path where deployment routing permits it.
- Preserve the actual authentication-status error in
getAuthStatus()and do not convert every exception into the password-login state.
I can provide additional sanitized network traces if needed.
- Dominant language
- TypeScript
- Stars
- 52
- Forks
- 15
- PR merge metrics
- No merged PRs in 30d
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from ElementsProject/cln-application
-
Add a SECURITY.md Open
Difficulty 1/5 Under an hour Newbie friendliness 90/100
ElementsProject/cln-application#167 · 1 comment · 1 reaction ·
-
Difficulty 4/5 3-5 days Newbie friendliness 35/100
-
ElementsProject/cln-application#158 · 1 comment · 1 reaction · 1 assignee ·
-
Difficulty 5/5 Over a week Newbie friendliness 25/100
-
ElementsProject/cln-application#110 · 4 comments · 1 assignee ·
All issues in ElementsProject/cln-application
Similar issues
-
Difficulty 2/5 1-3 hours Newbie friendliness 84/100
bcgov/bc-wallet-mobile#4761 · 1 comment ·
-
external-issue to-triage
Difficulty 2/5 1-3 hours Newbie friendliness 88/100
-
area-deployment area-integrations triage:bot-seen
Difficulty 2/5 Half a day Newbie friendliness 86/100
-
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
-
refactor
Difficulty 2/5 1-3 hours Newbie friendliness 84/100