Railsでユーザのログイン機能を実装する場合、言わずと知れた Devise を使うといろんな機能がすぐに使えて便利ですよね。デフォルトでは、メールアドレスとパスワードで登録・ログインするようになっていますが、今更ながら不正なメールアドレスが登録されてしまうというバグを生み出してしまいました
Deviseにおけるメールアドレスのバリデーションには、
$ bin/rails g devise:install
で生成される config/initializers/devise.rb
に定義されている正規表現が使われるのですが…
/\A[^@\s]+@[^@\s]+\z/
うーん、弱い!
ということで、今回は email_validator というGemを使って、メールアドレスの有効性をある程度きちんと検証できるようにしていきます。
email_validatorをインストール
Gemfileにemail_validatorを追記し、インストールします。
gem 'email_validator'
bundle install
Deviseの設定を書き換える
config/initializers/devise.rb
に定義されている正規表現を、email_validatorが提供している正規表現に書き換えます。
email_validatorも、デフォルト(Loose mode)の正規表現はDeviseと同様に /\A[^\s]+@[^\s]+\z/
となっているので、Strict modeかRFC modeの正規表現を使うようにしましょう。RFCに準拠すると、メールアドレスでよく使われている文字が使えないことがあるので、今回はStrict modeを使うことにします。
- config.email_regexp = /\A[^@\s]+@[^@\s]+\z/
+ config.email_regexp = EmailValidator.regexp(mode: :strict)
これで、メールアドレスの有効性をある程度きちんと検証できるようになりました
最後に
今回は、mode: :strict
と明示的にStrict modeを使うように指定しましたが、Gemfileに
gem 'email_validator', require: 'email_validator/strict'
のように記述することで、デフォルトをStrict modeにすることもできます。
Railsは便利なGemが多く、盲目的に使うと思わぬバグや脆弱性を仕込んでしまう可能性があります。注意して使いたいですね(自分への戒め