Make the signin - request access pipeline easier #116
Labels
No labels
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
Grandiras/Ponente#116
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
People will try to sign in, then fail because of no access, instead of going directly to the request site (users can be dumb :D). So why not enhance the no access site to directly include the request form with prefilled data, so only the missing pieces need to be filled in and can be filled in with no extra steps. Should make this experience more seamless.
🤖 On it — follow along in the action run; the reply will link the full session transcript.
📜 Live transcript — updating every ~5 minutes while the task runs.
Pushed
claude/issue-116.What changed
/access-deniedno longer points at/request— it is the request form. By the time anyone reads that page OAuth has just proven who they are, so there is no handle field at all, the name comes prefilled off their Bluesky profile, and asking is one button with email and message left optional.Three things follow from the requester being identified rather than anonymous, and each is part of making the flow seamless rather than a side effect:
AccessRequest.Didis normally filled in at approval, when an admin's click resolves a typed handle; posted from here it is set at creation from the cookie, never from a form field. On a pending request a DID can therefore only have come from OAuth — the admin card marks itSIGNED IN, which is the difference between approving an account and approving a claim about one. Approval also stopped depending on handle resolution:RequestsPanelnow looks the profile up byrequest.Did ?? request.Handle, so a handle that has since moved (or whose domain is down) no longer stands between an admin and the decision./request/{token}.It is the same
POST /requestendpoint, not a second one — the honeypot, rate limit, name gate and address gate stay in one place. It branches only on where errors render (/access-denied?error=…) and where the handle comes from; the form still posts the handle in a hidden field, so a session that expires between render and submit degrades into an ordinary anonymous request rather than a rejection. The invite variant deliberately takes no DID: someone asking for an invite code is asking for a second account. The anonymous/requestpage is untouched and still the path from/login.New copy is in both locales,
Changelog.Unreleasedhas a line in both, anddocs/access-requests.md,docs/auth.mdanddocs/testing.mdcarry the reasoning.Verification
dotnet build Ponente.slnclean (one pre-existing warning inCalendar.razor),dotnet test Ponente.sln295/295 — including the en/de key parity check andDocumentationTests.requests.spec.jswith Playwright: 10 passed, including the new test. The one failure isfull circle: request → approve → invite code → signup → board, which mints an invite on the PDS — there is no PDS container in this improvised stack ("The account server is currently unreachable"), and it is untouched by this change.The new e2e test needed a visitor who is signed in and not a member, which the
Memberstable cannot produce because it is the allowlist. So/dev/login/{did}gained a?handle=form that signs in a DID with no member row — still Development-only, still the one backdoor, and explicit rather than the default for a missing row so a typo'd DID keeps 404ing instead of quietly signing a test in as a stranger.No follow-up issues to file.
⏱ 19m 37s · 110 turns · tokens: 176.4k in / 59.4k out (+13330.4k cache-read)
📜 Full session transcript
→ Opened PR: #121