[英]Omniauth returns a 401 unauthorized
我想在我的网站上实现登录并使用Twitter omniauth注册。 我遵循了这个Railscast ,但是当我单击“使用Twitter登录”链接时,我收到401 Unauthorized
。 当我在日志中看到以下内容:
GET "/users/auth/twitter/callback?oauth_token=xxx&oauth_verifier=xxx
omniauth: (twitter) Callback phase initiated.
Processing by OmniauthCallbacksController#twitter as HTML
Parameters: {"oauth_token"=>"xxx", "oauth_verifier"=>"xxx"}
User Load (1.3ms) SELECT "users".* FROM "users" WHERE "users"."provider" = 'twitter' AND "users"."uid" = '9999' ORDER BY "users"."id" ASC LIMIT 1
(0.3ms) BEGIN
(0.2ms) COMMIT
Completed 401 Unauthorized in 13ms
当我查看omniauth控制器时,它找到了一个用户,但似乎在sign_in_and_redirect user
行上失败。
class OmniauthCallbacksController < Devise::OmniauthCallbacksController
def all
user = User.from_omniauth(request.env["omniauth.auth"])
if user.persisted?
# it reaches this
flash.notice = I18n.t('.devise.omniauth_callbacks.success')
sign_in_and_redirect user
else
session["devise.user_attributes"] = user.attributes
redirect_to new_user_registration_url, notice: I18n.t('.devise.omniauth_callbacks.failure')
end
end
alias_method :twitter, :all
end
在config/devise.rb
我添加了如下的密钥和秘密:
config.omniauth :twitter, ENV.fetch("TWITTER_CONSUMER_KEY"), ENV.fetch("TWITTER_CONSUMER_SECRET")
然后将实际值存储在.rvmrc
如下所示:
export TWITTER_CONSUMER_KEY=xxx
export TWITTER_CONSUMER_SECRET=xxx
这可能意味着它尝试登录找到的用户,但由于某些验证而失败了吗? 但是我删除了用户模型中的所有验证,以检查发生了什么,仍然出现此错误。 任何人都知道这里可能有什么问题吗?
我遇到了同样的问题(“ Omniauth返回了未经授权的401”),但原因不同。
在我的User#from_omniauth
我这样做
where(provider: auth.provider, uid: auth.uid).first_or_create
这意味着如果还没有一个新用户,它将创建一个新用户。 另外,我的User
是devise :confirmable
,未经确认的用户无法登录。这就是验证失败的原因。
会有一条错误消息说明这一点,但是鉴于我被重定向到了那里,所以没有:
<p class="notice"><%= notice %></p>
<p class="alert"><%= alert %></p>
因此,解决方案是将其添加到CallbacksController中的方法中:
def github
@user = User.from_omniauth(request.env['omniauth.auth'])
if @user.persisted?
@user.skip_confirmation!
@user.save
#...
skip_confirmation是一个devise方法,它在User上执行此操作:
self.confirmed_at = Time.now.utc
因此,也可以在User.from_omniauth
完成
这个问题应该是strong parameters
。 我建议您将所有来自request.env["omniauth.auth"]
放入一些变量中,而不要直接使用in进行创建或查找。
def self.from_omniauth(auth)
uid = auth[:uid]
provider = auth[:provider]
User.where(provider: provider, uid: uid).first
end
这应该修复未授权的错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.