

現在railsのバージョン4.2.5にて、deviseを用いて簡単なアプリケーションの開発をしているのですが、メールを使わずにパスワードをリセットをする必要が出てきました。  
そこで、usersテーブルに秘密の質問とその答えのカラムを用意し、以下のような手順でパスワードリセットを作ろうと考えました。

①deviseのログイン画面にあるパスワードリセットのリンクを書き換えて、ここをクリックすると、全ユーザから自分の名前を選択する画面に移動。  
②名前を選択すると、秘密の質問を選択するフォームと答えを入力するフォームの画面へ移動。  
③質問と答えを送信し、それがあらかじめ登録しておいたものと同じ場合、パスワード変更の入力フォームとパスワード確認用のフォームを表示(無ければその旨を伝える文を表示)  
④新しいパスワードを入力し送信すると、パスワードが変更されたことを伝え、ログイン画面に移動

今この中で③の条件分岐までは作れたのですが、パスワードを変更するフォームの作り方が分からない状況です。  
そこで質問なのですが、まずそもそもdeviseにおいてメールを使わずにパスワードリセットを実装することは可能でしょうか？  
またもし可能であれば、どのようにすればパスワードを変更する事が出来るでしょうか？  
まだ初めて一か月程度で全然知識がない状況なので、難しいことだと分からないかもしれないですが、ご回答のほどよろしくお願いいたします。


CC BY-SA 3.0
2017-06-26T06:02:39.223
35891
2017-09-08T23:16:42.987
2017-06-26T06:34:19.017
76
24030
question
ruby-on-rails devise
railsのdeviseでメールを使わずパスワードリセットを行う方法


可能です。  
「秘密の質問を選択するフォームと答えを入力するフォームの画面」をすでに作られているようなので、似たような書き方で「user（特に記載がないので、deviseを使用しているモデルがuserだと仮定します）のpasswordを書き換えるフォーム」を実装すればよいです。


CC BY-SA 3.0
2017-06-26T08:24:31.627
35893
2017-06-26T08:24:31.627
24034
35891
answer

[code]

    user.update(password: 'hogehoge', password_confirmation: 'hogehoge')
    
[/code]

パスワードの変更そのものは、これでできますので、単純にはこの情報を入力させるフォームを作れば良いことになります。[Deviseのパスワード編集フォーム](https://github.com/plataformatec/devise/blob/master/app/views/devise/passwords/edit.html.erb)を参考にすれば良いでしょう。

その前に、質問のような手順が本当に必要なセキュリティレベルを満たしているのか、それに応じた実装が可能か、十分検討された方が良いと思います。例えば「秘密の質問と答え」方式のパスワードリセットはセキュリティ的にはあまり良いものとはされていませんが、リスクは検討されていますか？

また、認証機構は正常系の処理は単純なので手探りでもできてしまいますが、異常系含めて完全なものを実装するのは非常に大変です。「ユーザーが自分のパスワードリセットができる」機能を作ったつもりが、実際の実装は「誰でも任意のユーザーのパスワードリセットができる」ものかもしれません。


CC BY-SA 3.0
2017-06-28T06:58:16.887
35935
2017-06-28T08:13:44.400
2017-06-28T08:13:44.400
5793
5793
35891
answer