我通过youtube使用omniauth youtube和google oauth2 gems登录。这一切都有效,前提是用户已经使用他们尝试登录的帐户创建了一个YouTube频道。
当用户尝试在没有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
答案 0 :(得分: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