簡體   English   中英

Omniauth返回401未授權

[英]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

這意味着如果還沒有一個新用戶,它將創建一個新用戶。 另外,我的Userdevise :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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM