0
0
Fork 0
mirror of https://github.com/discourse/discourse.git synced 2026-08-09 21:45:25 +08:00
discourse/app/views
Sam 5458a5f150
FEATURE: User API key device authorization flow (#40189)
Adds an OAuth-style device authorization flow for user API keys so
applications that can't open a browser (CLIs, headless tools, IoT
clients) can request a key by displaying a short user-facing code.

The client POSTs to `/user-api-key/device` to obtain a device code,
a user code, and a verification URL. The user visits the URL,
authenticates, confirms the application and scopes, and either
approves or denies the request. Meanwhile the client polls
`/user-api-key/device/poll` until it receives the encrypted key
payload, a denial, or expiry.

The flow is implemented as a `UserApiKey::DeviceAuth` namespace of
service objects (`CreateRequest`, `Authorize`, `Deny`, `Poll`,
`Store`, `Crypto`, `ApprovalTokenStore`, `GrantPresenter`). Pending
grants live in Redis with a short TTL and are rate limited per IP
and per user code. Encrypted payload generation is shared with the
existing redirect-based flow.

Also adds first-class expiration for user API keys:

- New `expires_at` column on `user_api_keys`.
- New `max_user_api_key_expiry_days` site setting (default 365).
- Clients can request a key lifetime via `expires_in_seconds`, which
  is surfaced to the user on the authorization screen and serialized
  back to the client.
- A `user_api_key` rake task for listing, inspecting, expiring, and
  revoking keys from the console.

---------

Co-authored-by: Penar Musaraj <pmusaraj@gmail.com>
2026-06-10 16:09:44 -04:00
..
about DEV: Add a nofollow to /u so user profiles don't get added as a target for crawling (#30693) 2025-01-13 13:50:00 +08:00
admin/backups
application FIX: Respect forced color mode for logo on server-rendered pages (#37032) 2026-01-09 11:33:06 +01:00
badges
categories
common DEV: Replace JS build system with Rolldown (#35963) 2026-05-29 11:11:55 +01:00
default DEV: Replace JS build system with Rolldown (#35963) 2026-05-29 11:11:55 +01:00
dev_mode DEV: Add /dev-mode endpoint for MiniProfiler auth cookie (#37027) 2026-01-12 10:01:20 +08:00
email UX: add preview to email templates (#36657) 2026-01-08 11:33:53 +04:00
embed DEV: Extract embed post date title into i18n-aware helper (#38594) 2026-03-17 09:12:21 -05:00
exceptions DEV: Replace JS build system with Rolldown (#35963) 2026-05-29 11:11:55 +01:00
finish_installation DEV: escape emails in finish installation (#37665) 2026-02-10 11:53:18 +01:00
groups
home_page DEV: Show login-required splash in root route (take 2) (#32629) 2025-05-14 11:25:43 -04:00
invites
layouts DEV: Replace JS build system with Rolldown (#35963) 2026-05-29 11:11:55 +01:00
list FIX: Regression with numeric tags in RSS feed URL generation (#39113) 2026-04-07 09:11:38 -04:00
metadata
offline
posts
published_pages DEV: properly import color-scheme-stylesheets (#36325) 2025-11-28 13:57:22 -06:00
qunit DEV: Update qunit site setting loading (#40650) 2026-06-08 17:43:34 +01:00
robots_txt removed broken link and comments from no_index.erb (#25648) 2024-02-14 12:09:24 +08:00
safe_mode FIX: Prevent admin sidebar errors in safe mode (#25832) 2024-02-23 17:04:42 +10:00
search
session
sitemap
static FEATURE: Restore web push quick reply for chat messages (#39614) 2026-04-29 12:36:03 -03:00
tags
topics DEV: Replace JS build system with Rolldown (#35963) 2026-05-29 11:11:55 +01:00
user_notifications DEV: Strip unsubscribe links when sending digest previews to arbitrary addresses (#38298) 2026-03-05 13:58:51 -06:00
users UX: Redesign OmniAuth confirmation page with branded styling (#39290) 2026-04-15 14:46:31 -07:00