Madogiwa Blog

主に技術系の学習メモに使っていきます。

Deviseで内部でセキュアなパスワードを設定してアカウントを作成するMEMO

管理画面のアカウント等、管理者が生成して利用者にアカウントを配布するような運用はあると思うのですが、管理者がアカウントを作成する際にパスワードまで指定するようにしてしまうと、管理者によるなりすましの懸念があります。。。

そのためアカウント作成時には利用者のメールアドレスのみを指定して、パスワードは内部で生成した予測不能な文字列を設定したほうがセキュアです。

やり方は以下のような形で、Devise.friendly_tokenが渡された引数の文字数で予測不能なセキュアな文字列を生成してくれます。  

generated_password = Devise.friendly_token(12)
admin = Admin.create!(:email => email, :password => generated_password)

内部的にはSecureRandom を使ってURLSafeな文字列を生成して、紛らわしい文字列は置換しているようですね👀

  def self.friendly_token(length = 20)
    # To calculate real characters, we must perform this operation.
    # See SecureRandom.urlsafe_base64
    rlength = (length * 3) / 4
    SecureRandom.urlsafe_base64(rlength).tr('lIO0', 'sxyz')
  end

github.com

Deviseは便利なメソッドがありますね✨

参考

How To: Automatically generate password for users (simpler registration) · heartcombo/devise Wiki · GitHub