0

我使用omniauth youtube和谷歌oauth2寶石通過youtube登錄。這一切都有效,只要用戶已經使用他們嘗試登錄的帳戶創建了YouTube頻道。處理youtube Ominauth 401錯誤

當用戶嘗試沒有YouTube頻道是錯誤登錄了以下消息:

OAuth2::Error 

    <HTML> 
    <HEAD> 
    <TITLE>NoLinkedYouTubeAccount</TITLE> 
    </HEAD> 
    <BODY BGCOLOR="#FFFFFF" TEXT="#000000"> 
    <H1>NoLinkedYouTubeAccount</H1> 
    <H2>Error 401</H2> 
    </BODY> 
    </HTML> 

我怎麼能處理此錯誤,使用戶無論在那裏他們可以發送到他們的YouTube帳戶創建他們的YouTube頻道,然後使用有效的登錄憑據重定向回該網站,或者發送回頁面,該頁面提供有關如何創建YouTube頻道並重試的說明?

我的代碼如下:

user.rb

def self.from_omniauth(auth) 
    where(auth.slice(:provider, :uid)).first_or_initialize.tap do |user| 
     user.provider = auth.provider 
     user.uid = auth.uid 
     user.name = auth.info.name 
     user.email = auth.info.email 
     user.oauth_token = auth.credentials.token 
     user.oauth_expires_at = Time.at(auth.credentials.expires_at) 
     user.picture = auth.info.image 
     user.save! 
     end 
    end 

session_controller:

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

路線

match 'auth/youtube/callback', to: 'sessions#create' 
    match 'auth/failure', to: redirect('/') 
    match 'signout', to: 'sessions#destroy', as: 'signout' 

omniauth.rb

OmniAuth.config.on_failure = SessionsController.action(:oauth_failure) 

Rails.application.config.middleware.use OmniAuth::Builder do 
    provider :youtube, YOUTUBE_KEY, YOUTUBE_SECRET, { access_type: 'online', approval_prompt: ''} 
end 

回答

1

你可以使用rescue_from的東西,如:

rescue_from OAuth2::Error do |exception| 
    redirect_to *your page you want to show with instructions*, :notice => "You must link a Youtube Channel" 
end 

由於加入了YouTube頻道是不是OAuth的週期,我不認爲你可以重定向到YouTube,創建一個的一部分,然後反彈到您的網站,如正常oauth身份驗證,所以我會建議給頁面提供一個鏈接到YouTube的鏈接說明方便。

http://api.rubyonrails.org/classes/ActiveSupport/Rescuable/ClassMethods.html

+0

是的我認爲你是對的傑森重定向到一些指示。這似乎沒有捕捉到異常,或者如果是,重定向沒有被執行。我已經嘗試了應用程序控制器和會話控制器中的代碼,但無濟於事,這是它的目的? – dodgerogers747