mirror of
https://gh.wpcy.net/https://github.com/discourse/discourse.git
synced 2026-06-18 23:39:11 +08:00
Previously, the only passwordless way to log in by email was a one-click magic link, enabled with `enable_local_logins_via_email`. This change adds `enable_local_logins_via_code`, which switches that flow to send a short one-time code instead of a link: when enabled, the login page offers "Email me a one-time login code" in place of the link option, and entering the emailed code logs the user in (including through any configured second factor). A code only ever logs an *existing* user in, and the request endpoint responds identically whether or not the email matches an account, so it can't be used to probe for accounts. Signing up with a one-time code builds on this and is in #40909. <details> <summary>Screenshots</summary> **Desktop** | Step | Foundation · Light | Foundation · Dark | Horizon · Light | Horizon · Dark | |---|---|---|---|---| | Password form (default) | <img width="1400" height="1200" alt="desktop-foundation-light-code-login-password-form" src="https://github.com/user-attachments/assets/aa6758f0-9402-4229-8ad8-962d9773b7bd" /> | <img width="1400" height="1200" alt="desktop-foundation-dark-code-login-password-form" src="https://github.com/user-attachments/assets/e4283e80-5973-48ba-8b24-e4a154fd04ea" /> | <img width="1400" height="1200" alt="desktop-horizon-light-code-login-password-form" src="https://github.com/user-attachments/assets/8b58915c-f040-40cf-aa28-50e763032ba1" /> | <img width="1400" height="1200" alt="desktop-horizon-dark-code-login-password-form" src="https://github.com/user-attachments/assets/4de1c283-1021-4ac1-b4e1-9e5e14a1a883" /> | | Email entry | <img width="1400" height="1200" alt="desktop-foundation-light-code-login-email-step" src="https://github.com/user-attachments/assets/9ecd42cd-b7a4-4eaa-b7a4-f3de2418d7df" /> | <img width="1400" height="1200" alt="desktop-foundation-dark-code-login-email-step" src="https://github.com/user-attachments/assets/6e2d106c-6fdd-498b-a470-85b5dafab2c7" /> | <img width="1400" height="1200" alt="desktop-horizon-light-code-login-email-step" src="https://github.com/user-attachments/assets/adfc7f9b-2651-43e1-a2ab-b37d1ff3e34f" /> | <img width="1400" height="1200" alt="desktop-horizon-dark-code-login-email-step" src="https://github.com/user-attachments/assets/4e6872e1-ce77-462d-a04f-2c81fa5e61ed" /> | | Code entry | <img width="1400" height="1200" alt="desktop-foundation-light-code-login-code-step" src="https://github.com/user-attachments/assets/b9b53768-e095-489a-bb62-d23e8b018d28" /> | <img width="1400" height="1200" alt="desktop-foundation-dark-code-login-code-step" src="https://github.com/user-attachments/assets/933e41fb-ea1b-434e-87b7-ffca6d651628" /> | <img width="1400" height="1200" alt="desktop-horizon-light-code-login-code-step" src="https://github.com/user-attachments/assets/936967cf-b657-4d9f-80e2-c44226b681c3" /> | <img width="1400" height="1200" alt="desktop-horizon-dark-code-login-code-step" src="https://github.com/user-attachments/assets/2bf4530c-e6ba-4561-963e-36a494288c3c" /> | | Invalid code | <img width="1400" height="1200" alt="desktop-foundation-light-code-login-wrong-code" src="https://github.com/user-attachments/assets/ddaf1ae4-66ec-499b-859c-c169ce544f3d" /> | <img width="1400" height="1200" alt="desktop-foundation-dark-code-login-wrong-code" src="https://github.com/user-attachments/assets/f6a57236-f498-4a98-ac80-aee3f7a1e1a5" /> | <img width="1400" height="1200" alt="desktop-horizon-light-code-login-wrong-code" src="https://github.com/user-attachments/assets/e8622433-d693-4faf-b2aa-f71c910c3b52" /> | <img width="1400" height="1200" alt="desktop-horizon-dark-code-login-wrong-code" src="https://github.com/user-attachments/assets/0221c9ba-5003-4160-9ef9-281045f2f318" /> | **Mobile** | Step | Foundation · Light | Foundation · Dark | Horizon · Light | Horizon · Dark | |---|---|---|---|---| | Password form (default) | <img width="1170" height="3600" alt="mobile-foundation-light-code-login-password-form" src="https://github.com/user-attachments/assets/6e25f7b4-915f-4f55-8b27-9f51ec4ec1ea" /> | <img width="1170" height="3600" alt="mobile-foundation-dark-code-login-password-form" src="https://github.com/user-attachments/assets/0e1b0009-8b70-454f-8167-01c7a8ce0664" /> | <img width="1170" height="3600" alt="mobile-horizon-light-code-login-password-form" src="https://github.com/user-attachments/assets/79949635-a8f5-4fc5-aa2f-22edb77f7b2d" /> | <img width="1170" height="3600" alt="mobile-horizon-dark-code-login-password-form" src="https://github.com/user-attachments/assets/1f7e962d-5e0b-4e22-bb54-0b27b870696f" /> | | Email entry | <img width="1170" height="3600" alt="mobile-foundation-light-code-login-email-step" src="https://github.com/user-attachments/assets/5577aad2-dd30-4424-af7a-af5f33458c8c" /> | <img width="1170" height="3600" alt="mobile-foundation-dark-code-login-email-step" src="https://github.com/user-attachments/assets/571b5bf2-0b07-46ec-ba3a-b80bc1078643" /> | <img width="1170" height="3600" alt="mobile-horizon-light-code-login-email-step" src="https://github.com/user-attachments/assets/3beb6702-e7df-434b-98d6-23203c6bee98" /> | <img width="1170" height="3600" alt="mobile-horizon-dark-code-login-email-step" src="https://github.com/user-attachments/assets/17b33dc8-c133-4f07-8817-1f1f7c6cf8ff" /> | | Code entry | <img width="1170" height="3600" alt="mobile-foundation-light-code-login-code-step" src="https://github.com/user-attachments/assets/91beeec5-87eb-4169-a53d-53164dd7dd2a" /> | <img width="1170" height="3600" alt="mobile-foundation-dark-code-login-code-step" src="https://github.com/user-attachments/assets/8d8de095-7050-4006-bc72-6a82f7c17513" /> | <img width="1170" height="3600" alt="mobile-horizon-light-code-login-code-step" src="https://github.com/user-attachments/assets/f874a1c6-2e9f-4c0c-b500-850c44067489" /> | <img width="1170" height="3600" alt="mobile-horizon-dark-code-login-code-step" src="https://github.com/user-attachments/assets/4957797c-00e9-45b8-8504-8baba15cde06" /> | | Invalid code | <img width="1170" height="3600" alt="mobile-foundation-light-code-login-wrong-code" src="https://github.com/user-attachments/assets/76124aa6-fd77-467a-b1bb-60e85e354612" /> | <img width="1170" height="3600" alt="mobile-foundation-dark-code-login-wrong-code" src="https://github.com/user-attachments/assets/c0f8d7db-9a7e-4803-928c-91a504bf8391" /> | <img width="1170" height="3600" alt="mobile-horizon-light-code-login-wrong-code" src="https://github.com/user-attachments/assets/77b97702-8ee7-4244-906e-6fddb5e22cae" /> | <img width="1170" height="3600" alt="mobile-horizon-dark-code-login-wrong-code" src="https://github.com/user-attachments/assets/e034b400-6430-4441-9b2a-c0f1b0bb49c6" /> | </details> |
||
|---|---|---|
| .. | ||
| regular | ||
| scheduled | ||
| about_stats_spec.rb | ||
| activation_reminder_emails_spec.rb | ||
| auto_queue_handler_spec.rb | ||
| automatic_group_membership_spec.rb | ||
| backfill_sidebar_site_settings_spec.rb | ||
| bookmark_reminder_notifications_spec.rb | ||
| bulk_grant_trust_level_spec.rb | ||
| bulk_invite_spec.rb | ||
| bump_topic_spec.rb | ||
| call_discourse_hub_spec.rb | ||
| change_display_name_spec.rb | ||
| check_new_features_spec.rb | ||
| check_translation_overrides_spec.rb | ||
| clean_dismissed_topic_users_spec.rb | ||
| clean_up_associated_accounts_spec.rb | ||
| clean_up_browser_pageview_events_spec.rb | ||
| clean_up_crawler_stats_spec.rb | ||
| clean_up_email_change_requests_spec.rb | ||
| clean_up_email_logs_spec.rb | ||
| clean_up_inactive_users_spec.rb | ||
| clean_up_post_reply_keys_spec.rb | ||
| clean_up_tags_spec.rb | ||
| clean_up_unused_staged_users_spec.rb | ||
| clean_up_unused_user_api_key_clients_spec.rb | ||
| clean_up_unused_user_api_keys_spec.rb | ||
| clean_up_uploads_spec.rb | ||
| clean_up_user_api_keys_max_life_spec.rb | ||
| clean_up_user_export_topics_spec.rb | ||
| cleanup_problem_check_trackers_spec.rb | ||
| cleanup_redelivering_web_hook_events_spec.rb | ||
| close_topic_spec.rb | ||
| correct_missing_dualstack_urls_spec.rb | ||
| crawl_topic_link_spec.rb | ||
| create_linked_topic_spec.rb | ||
| create_missing_avatars_spec.rb | ||
| create_recent_post_search_indexes_spec.rb | ||
| create_user_reviewable_spec.rb | ||
| delete_replies_spec.rb | ||
| delete_topic_spec.rb | ||
| delete_user_posts_spec.rb | ||
| deliver_push_notification_spec.rb | ||
| detect_crawler_pageviews_spec.rb | ||
| download_avatar_from_url_spec.rb | ||
| download_backup_email_spec.rb | ||
| download_profile_background_from_url_spec.rb | ||
| emit_web_hook_event_spec.rb | ||
| enqueue_digest_emails_spec.rb | ||
| enqueue_suspect_users_spec.rb | ||
| ensure_db_consistency_spec.rb | ||
| ensure_s3_uploads_existence_multisite_spec.rb | ||
| ensure_s3_uploads_existence_spec.rb | ||
| export_csv_file_spec.rb | ||
| export_user_archive_spec.rb | ||
| feature_topic_users_spec.rb | ||
| fix_out_of_sync_user_uploaded_avatar_spec.rb | ||
| fix_primary_emails_for_staged_users_spec.rb | ||
| fix_s3_etags_spec.rb | ||
| fix_user_usernames_and_groups_names_clash_spec.rb | ||
| grant_anniversary_badges_spec.rb | ||
| grant_new_user_of_the_month_badges_spec.rb | ||
| ignored_users_summary_spec.rb | ||
| index_user_fields_for_search_spec.rb | ||
| invalidate_inactive_admins_spec.rb | ||
| invite_email_spec.rb | ||
| jobs_base_spec.rb | ||
| jobs_scheduled_spec.rb | ||
| jobs_spec.rb | ||
| maintain_browser_pageview_rollups_spec.rb | ||
| mass_award_badge_spec.rb | ||
| notify_category_change_spec.rb | ||
| notify_mailing_list_subscribers_spec.rb | ||
| notify_moved_posts_spec.rb | ||
| notify_reviewable_spec.rb | ||
| notify_tag_change_spec.rb | ||
| old_keys_reminder_spec.rb | ||
| open_topic_spec.rb | ||
| pending_queued_posts_reminder_spec.rb | ||
| pending_reviewables_reminder_spec.rb | ||
| pending_users_reminder_spec.rb | ||
| periodical_updates_spec.rb | ||
| poll_mailbox_spec.rb | ||
| post_update_topic_tracking_state_spec.rb | ||
| post_uploads_recovery_spec.rb | ||
| process_bulk_invite_emails_spec.rb | ||
| process_email_spec.rb | ||
| process_localized_cooked_spec.rb | ||
| process_post_spec.rb | ||
| process_shelved_notifications_spec.rb | ||
| publish_topic_to_category_spec.rb | ||
| pull_hotlinked_images_spec.rb | ||
| pull_user_profile_hotlinked_images_spec.rb | ||
| purge_expired_ignored_users_spec.rb | ||
| push_notification_spec.rb | ||
| rebake_custom_emoji_posts_spec.rb | ||
| redeliver_web_hook_events_spec.rb | ||
| refresh_users_reviewable_counts_spec.rb | ||
| reindex_search_spec.rb | ||
| remove_banner_spec.rb | ||
| reviewable_priorities_spec.rb | ||
| run_problem_check_spec.rb | ||
| run_problem_checks_spec.rb | ||
| send_push_notification_spec.rb | ||
| send_system_message_spec.rb | ||
| suspicious_login_spec.rb | ||
| sync_access_control_for_uploads_spec.rb | ||
| sync_topic_user_bookmarked_spec.rb | ||
| tl3_promotions_spec.rb | ||
| toggle_topic_closed_spec.rb | ||
| topic_timer_enqueuer_spec.rb | ||
| truncate_user_flag_stats_spec.rb | ||
| unsilence_users_spec.rb | ||
| update_animated_uploads_spec.rb | ||
| update_gravatar_spec.rb | ||
| update_topic_hot_scores_spec.rb | ||
| update_username_spec.rb | ||
| user_email_spec.rb | ||