5

OmniAuthDeviseを使用してユーザーを認証しています。OmniAuth プロバイダーを使用してサインアップしたユーザーがオプションのパスワード (API 認証に必要) を設定できるようにしたいのですが、壁にぶつかっています。

ユーザーが OmniAuth 経由でアカウントを作成し、パスワードを設定しようとすると、次のエラーが発生します。

BCrypt::Errors::InvalidHash in RegistrationsController#update

これは、パスワードが空白であるためだと思います。これを回避する良い方法は何ですか? ランダムなパスワードを生成することを考えましたが、そのアプローチの問題は、ユーザーが設定を編集するために現在のパスワードを知る必要があることです。

編集現在のパスワードを必要とせずにユーザーが設定を変更できるようにすることを検討しました。これは、ユーザーが最初にパスワードを持っていなかった場合にのみ行いたいことです。

4

4 に答える 4

5

別の方法として、「ユーザー」モデル クラスに以下を追加して、検証するパスワードがない場合にパスワード検証をバイパスすることもできます。プロバイダーは、外部認証を使用するときに設定されるフィールドです。

def valid_password?(password)  
  !provider.nil? || super(password)  
end
于 2011-03-10T22:01:48.023 に答える
3

パスワードを設定したい場合にパスワードをリセットするという簡単な方法は望まないと思いますか?

user.send_reset_password_instructions

于 2011-02-28T00:24:32.100 に答える
1

これは少し遅れますが、他の誰かを助けるかもしれません.Andrewの答えでは、パスワードを作成してデータベースに保存できますが、電子メールと新しいパスワードを使用してログインすることはできません。設定することでこれを解決しました:

  def valid_password
    !provider.nil? && !encrypted_password.present? || super
  end
于 2013-01-16T02:53:00.240 に答える
0

別の選択肢。新しいフィールドを含める必要はありません。発生した例外をキャッチして false を返すだけです。これがコードです。

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

これでうまくいくはずです。

于 2011-05-19T13:28:17.783 に答える