You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
A logged-in user has no way to change their own password through the running JSS. The only password-management interface today is the jss passwd <user> CLI (#232), which requires shell access on the server. End users in a multi-user pod or anyone running JSS without local shell access (containers, managed hosts, etc.) is stuck.
200 + new bcrypt hash written, all other sessions invalidated, current session re-issued.
401 if current password is wrong.
401 if not authenticated.
403 if the authenticated WebID doesn't match the target account.
(Path bikeshed: PUT /idp/credentials matches the existing POST /idp/credentials shape; alternatives are POST /idp/account/password or PATCH /idp/credentials. Not load-bearing — pick whatever lands cleanly with the existing IDP routes.)
Out of scope
Password recovery / forgot-password flow (no current password). That's a separate feature that needs an email channel + token store. File as a follow-up if/when there's a recovery story.
Summary
A logged-in user has no way to change their own password through the running JSS. The only password-management interface today is the
jss passwd <user>CLI (#232), which requires shell access on the server. End users in a multi-user pod or anyone running JSS without local shell access (containers, managed hosts, etc.) is stuck.Current state
jss passwd <user>— operator-only, shell required.POST /idp/credentials— login only (issues token).passwordHash(bcrypt) so the data layer already supports a rotation, just no API.Proposed shape
A single authenticated endpoint, owner-only (the caller's WebID must match the account's WebID), gated by re-supplying the current password as proof:
(Path bikeshed:
PUT /idp/credentialsmatches the existingPOST /idp/credentialsshape; alternatives arePOST /idp/account/passwordorPATCH /idp/credentials. Not load-bearing — pick whatever lands cleanly with the existing IDP routes.)Out of scope
Acceptance
{currentPassword, newPassword}from the authenticated owner and rotates the hash.currentPassword→ 401, hash unchanged.jss passwd <user>CLI continues to work unchanged.