2011-02-20 15 views
5

私はOmniAuthDeviseを使用してユーザーを認証しています。 OmniAuthプロバイダを使用してサインアップしたユーザーに、(API認証に必要な)オプションのパスワードを設定できるようにしたいと思いますが、私は壁に乗っています。私は、パスワードが空白であるためであると考えていOmniAuthとDevise、オプションパスワードの設定方法

BCrypt::Errors::InvalidHash in RegistrationsController#update 

:ユーザーはOmniAuthを経由してアカウントを作成し、彼らは次のエラーを取得するパスワードを設定しようとすると

。これをうまくいく方法は何ですか?私はランダムなパスワードを生成することを考えましたが、その方法の問題は、ユーザーが設定を編集するために現在のパスワードを知る必要があることです。

編集: 私はallowing the user to change settings without requiring a current passwordを見て、それは私が、ユーザが最初にパスワードを持っていなかった場合のみをやりたいものです。

答えて

3

パスワードを設定したい場合は、パスワードをリセットするのが簡単ではないと思いますか?

user.send_reset_password_instructions

+0

はい私は当初それを望んでいませんでしたが、私はそのようにやりました。 – David

5

代替は、プロバイダが外部認証を使用するときに設定されているいくつかのフィールドであることを確認するためにパスワードが存在しない場合は、パスワード認証をバイパスするように、あなたの「ユーザー」モデルクラスに以下を追加することです。

def valid_password?(password) 
    !provider.nil? || super(password) 
end 
0

もう1つの方法です。新しいフィールドを含める必要はありません。発生した例外をキャッチし、falseを返します。ここにコードがあります。

def valid_password?(password) 
    begin 
     super(password) 
    rescue BCrypt::Errors::InvalidHash 
     return false 
    end 
end 

これは仕事をするはずです。

1

これはちょっと遅くなりますが、Andrewの答えでパスワードを作成してデータベースに保存することはできますが、電子メールと新しいパスワードを使用してログインすることはできません。 :

def valid_password 
    !provider.nil? && !encrypted_password.present? || super 
    end 
関連する問題