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 错误“您想要的更改被拒绝” 。我不得不为拥有一封唯一电子邮件的用户重构我的验证,当用户尝试使用相同的电子邮件登录 facebook 时,该验证不起作用。

看看你的日志。heroku logs -t

于 2014-02-27T05:18:27.333 回答
0

看起来您要么正在验证User模型中是否存在密码字段,要么正在使用has_secure_password,这在幕后进行。

如果您自己进行验证,则只需:if => :password_changed?在验证中添加一个子句。

如果您使用的是has_secure_password,这取决于您使用的是哪个版本的 Rails。任何具有 两个更改的版本(我相信只有 Rails 4)都支持将validations: false选项传递给has_secure_password. 否则,除了在创建用户时设置一个随机的虚拟密码然后让他们立即更改之外,没有真正好的解决方案。

于 2013-03-24T23:14:30.000 回答
0

当我的 gitlab 服务器上的时间不同步时,我遇到了这个问题,我重新启动了 ntpd,它更正了服务器上的时间并解决了问题

于 2015-03-24T21:38:42.063 回答