Mastodon のメールアドレス確認を無効にする方法 (インスタンス管理者向け)

2018-01-13 追記: devise.rb の修正だけでは不足だったことが判明しました。記事末尾の追記箇所を参照してください。

2018-01-14 追記: メールアドレス確認無効化のメリットとデメリット という記事もご覧ください。

こんにちは! theboss.tech というインスタンスを運営している @the_boss です。

この記事では、アカウント登録時のメールアドレス確認を無効にしたいという Mastodon インスタンス管理者の方に向けて、設定ファイルの修正箇所をご紹介します。

devise.rb というファイルを修正します。

/config/initializers/devise.rb より抜粋:

   # able to access the website for two days without confirming their account,
   # access will be blocked just in the third day. Default is 0.days, meaning
   # the user cannot access the website without confirming their account.
-  # config.allow_unconfirmed_access_for = 2.days
+  config.allow_unconfirmed_access_for = 99.years
 
   # A period that the user is allowed to confirm their account before their
   # token becomes invalid. For example, if set to 3.days, the user can confirm
   # their account within 3 days after the mail was sent, but on the fourth day
   # their account can't be confirmed with the token any more.
   # Default is nil, meaning there is no restriction on how long a user can take
   # before confirming their account.
-  config.confirm_within = 2.days
+  config.confirm_within = 99.years
 
   # If true, requires any email changes to be confirmed (exactly the same way as
   # initial account confirmation) to be applied. Requires additional unconfirmed_email

allow_unconfirmed_access_for という設定項目が、「メールの確認リンクをクリックしなくてもログインできる期間」の設定です。これをとても長い期間に指定します。 confirm_within は確認リンクが有効な期間の設定で、設定は必須ではありませんが、「ログインできるのにメールの確認はできない」というのも気持ちが悪いので、同じ期間を設定します。

通常の用途ですと、「xx 日間は確認リンクをクリックしなくてもログイン可能。その間に確認リンクが押されなければログイン不可にする」というような設定に使うものと思われますが、ここでは確認不要にするため、とても長い期間を指定することにしました。

参考: https://github.com/theboss/mastodon/commit/36d484d168653e25d857cb5b2507d3fdb4b4f9d8

2018-01-13 追記:

上記の設定変更だけだと、登録から 2 日経過後にユーザが削除されてしまうことがわかりました。

theboss.tech にてアカウントが消失してしまった方にはこの場を借りてお詫び申し上げます。また、この記事を参考に設定変更を行われたインスタンス管理者の方は、以下の対応を行うことをお勧めいたします。

「確認メール送信から 2 日経過後になっても確認が取れていないユーザは削除する」という処理を行う Sidekiq スケジュールジョブが存在がしています。

/app/workers/scheduler/user_cleanup_scheduler.rb

# frozen_string_literal: true
require 'sidekiq-scheduler'

class Scheduler::UserCleanupScheduler
  include Sidekiq::Worker

  def perform
    User.where('confirmed_at is NULL AND confirmation_sent_at <= ?', 2.days.ago).find_in_batches do |batch|
      Account.where(id: batch.map(&:account_id)).delete_all
      User.where(id: batch.map(&:id)).delete_all
    end
  end
end

対処方法は 2 通りあり、どちらか片方の対応でユーザの消失を回避可能です。 theboss.tech では両方の対応を入れました。

方法 1: ユーザ削除までの期間を延長する

上記の 2.days を、設定変更を行った devise.rb から取得した期間に変更します。

   def perform
-    User.where('confirmed_at is NULL AND confirmation_sent_at <= ?', 2.days.ago).find_in_batches do |batch|
+    User.where('confirmed_at is NULL AND confirmation_sent_at <= ?', User.confirm_within.ago).find_in_batches do |batch|
       Account.where(id: batch.map(&:account_id)).delete_all

参考: https://github.com/theboss/mastodon/commit/002eefbf5f0e05697c879e9ca9926af8db20e0b1

方法 2: メールアドレスを確認済みとして UPDATE するスケジュールジョブを追加する

上記の user_cleanup_scheduler.rb よりも先に、別のスケジュールジョブにて、ユーザを確認済み状態に更新します。以下のジョブを新たに作ります。 (この方法は、 シフィ さんが実装してくださいました。ありがとうございます!)

/app/workers/scheduler/confirm_user_email_address_scheduler.rb

# frozen_string_literal: true
require 'sidekiq-scheduler'

class Scheduler::ConfirmUserEmailAddressScheduler
  include Sidekiq::Worker

  def perform
    User.where('confirmed_at is NULL').update_all(:confirmed_at => Time.now)
  end
end

これが前述のジョブよりも先に実行されるよう、 Sidekiq 設定に追加します。

/config/sidekiq.yml

   doorkeeper_cleanup_scheduler:
      cron: '<%= Random.rand(0..59) %> <%= Random.rand(0..2) %> * * 0'
      class: Scheduler::DoorkeeperCleanupScheduler
+  confirm_user_email_address_scheduler:
+    cron: '<%= Random.rand(0..59) %> <%= Random.rand(1..4) %> * * *'
+    class: Scheduler::ConfirmUserEmailAddressScheduler
    user_cleanup_scheduler:
      cron: '<%= Random.rand(0..59) %> <%= Random.rand(4..6) %> * * *'
      class: Scheduler::UserCleanupScheduler

参考: https://github.com/theboss/mastodon/commit/3a113b5d99210a90a0e23ed80c1a1f6140c25a14

2018-01-13 追記 ここまで

ところで、メールアドレス確認を無効化しているインスタンスは以前から存在しており、 2.distsn.org (通称「匿名鯖」) というインスタンスが知られています。

参考: メールアドレス不要のマストドンインスタンスを作った – 墓場人夜

匿名鯖は他にも 誰でもカスタム絵文字を登録できる 機能をいち早く取り入れたインスタンスでもあり、 theboss.tech は匿名鯖の機能を部分的に拝借しています。


See also