1

Omniauth と Github のこのソリューションを実装して正常に動作させましたが、ここ数か月で動作しなくなりました。

ログインしようとすると、次のエラーが表示されます: (422) 必要な変更は拒否されました。

具体的には、私が見ている Heroku ログで:

ActiveRecord::RecordInvalid (Validation failed: Password can't be blank):
app/models/user.rb:18:in `create_from_omniauth'
app/models/user.rb:14:in `from_omniauth'
app/controllers/sessions_controller.rb:4:in `create'

ユーザーを作成するときに資格情報を保存する必要がありますか?

私のユーザーモデル:

def self.from_omniauth(auth)
  where(auth.slice("provider", "uid")).first || create_from_omniauth(auth)
end

def self.create_from_omniauth(auth)
  create! do |user|
    user.provider = auth["provider"]
    user.uid = auth["uid"]
    user.name = auth["info"]["nickname"]
    user.email = auth["info"]["email"]
    user.image = auth["info"]["image"]
 end
end

セッションコントローラー:

class SessionsController < ApplicationController

def create
  user = User.from_omniauth(env["omniauth.auth"])
  session[:user_id] = user.id
  redirect_to root_url, notice: "Signed in!"
end

def destroy
  session[:user_id] = nil
  redirect_to root_url, notice: "Signed out!"
 end
end
4

3 に答える 3

1

モデルに設定された検証が原因で、Facebook の omniauth エラー「必要な変更が拒否されました」が表示される場合があります。一意の電子メールを 1 つ持つユーザーの検証をリファクタリングする必要がありましたが、ユーザーが同じ電子メールで facebook にログインしようとすると機能しませんでした。

ログを見てください。heroku logs -t

于 2014-02-27T05:18:27.333 に答える
0

Userモデル内のパスワード フィールドの存在を検証しているか、内部has_secure_passwordでそれを行う を使用しているようです。

その検証を自分で行っている場合は、検証に次のような句を追加するだけ:if => :password_changed?です。

を使用している場合は、使用しhas_secure_passwordている Rails のバージョンによって異なります。これら 2 つの変更を含むすべてのバージョン(Rails 4 のみだと思います) は、validations: falseへのオプションの受け渡しをサポートしていますhas_secure_password。それ以外の場合は、ユーザーを作成するときにランダムなダミー パスワードを設定し、すぐに変更できるようにする以外に、実際には良い解決策はありません。

于 2013-03-24T23:14:30.000 に答える
0

gitlab サーバーの時刻が同期していないときにこの問題が発生しました。ntpd を再起動すると、サーバーの時刻が修正され、問題が解決されました。

于 2015-03-24T21:38:42.063 に答える