# retoor from .._shared import endpoint, field GROUP = { "slug": "auth", "title": "Authentication", "intro": """ # Authentication Create an account, sign in, recover your password, and log out. These are the only endpoints that set or clear the `session` cookie; every other request authenticates with the methods described in [Authentication](/docs/authentication.html). The shared rules (content negotiation, pagination, status codes) live in [Conventions and Errors](/docs/conventions.html). ## Page vs. action The GET endpoints render HTML sign-up, login, and password-reset forms; they also return the page data as JSON when requested with `Accept: application/json` (including `page` to distinguish the form type). The POST endpoints are **actions**: they accept form fields, set or clear the `session` cookie, and return a `302` redirect (or the JSON envelope for JSON callers). **Sign-up requires a unique `username` and `email`** plus a `confirm_password` that matches the password; **you log in with your `email` and password**. JSON callers receive validation errors as a `422` with the shape `{ "fields": {...}, "messages": [...] }`. """, "endpoints": [ endpoint( id="auth-signup", method="GET", path="/auth/signup", title="Sign up page", summary="Render the registration form. Returns an HTML page.", auth="public", interactive=True, ), endpoint( id="auth-signup-post", method="POST", path="/auth/signup", title="Sign up", summary="Create a new account. Sets the session cookie on success.", auth="public", encoding="form", destructive=False, params=[ field("username", "form", "string", True, "alice", "Username, 3-32 characters (letters, numbers, hyphens, underscores)."), field("email", "form", "string", True, "alice@example.com", "Email address; must be unique and contain an @."), field("password", "form", "string", True, "mysecret", "Password, 6+ characters."), field("confirm_password", "form", "string", True, "mysecret", "Must match password."), ], ), endpoint( id="auth-login", method="GET", path="/auth/login", title="Log in page", summary="Render the login form. Returns an HTML page.", auth="public", interactive=True, params=[ field("next", "query", "string", False, "", "Redirect target after login."), ], ), endpoint( id="auth-login-post", method="POST", path="/auth/login", title="Log in", summary="Authenticate with email and password. Sets the session cookie.", auth="public", encoding="form", params=[ field("email", "form", "string", True, "alice@example.com", "Your registered email."), field("password", "form", "string", True, "mysecret", "Your password."), field("remember_me", "form", "string", False, "on", "Send 'on' to extend the session to the remember-me lifetime."), field("next", "form", "string", False, "", "Redirect target after login."), ], ), endpoint( id="auth-forgot-password", method="GET", path="/auth/forgot-password", title="Forgot password page", summary="Render the forgot-password form. Returns an HTML page.", auth="public", interactive=True, ), endpoint( id="auth-forgot-password-post", method="POST", path="/auth/forgot-password", title="Request password reset", summary="Send a password-reset email with a one-time link.", auth="public", encoding="form", params=[ field("email", "form", "string", True, "alice@example.com", "Your registered email."), ], ), endpoint( id="auth-reset-password", method="GET", path="/auth/reset-password/{token}", title="Reset password page", summary="Render the password-reset form (only valid with a one-time token). Returns an HTML page.", auth="public", interactive=True, params=[ field("token", "path", "string", True, "RESET_TOKEN", "The one-time reset token from the email."), ], ), endpoint( id="auth-reset-password-post", method="POST", path="/auth/reset-password/{token}", title="Reset password", summary="Set a new password using a one-time reset token.", auth="public", encoding="form", params=[ field("token", "path", "string", True, "RESET_TOKEN", "The one-time reset token from the email."), field("password", "form", "string", True, "newpass", "New password, 6+ characters."), field("confirm_password", "form", "string", True, "newpass", "Must match password."), ], ), endpoint( id="auth-logout", method="GET", path="/auth/logout", title="Log out", summary="Clear the session cookie and redirect to the landing page.", auth="public", interactive=False, ), ], }