0

YouTube経由でログインするために、omniauth youtubeとgoogle oauth2 gemを使用しています。これはすべて正常に機能しますが、ユーザーがログインしようとしているアカウントで既に 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

    def destroy
      session[:user_id] = nil
      redirect_to root_path, notice: "Signed out"
    end

    def failure
    end

ログインフォーム

<% if current_user %>
        Logged in as <b><%= current_user.name %></b>
            <%=  image_tag current_user.picture %><br>
            <%= link_to "Sign out", signout_path %>
        <% else %>
            Sign in with <%= link_to image_tag('youtube.png'), "/auth/youtube" %>
        <% end %>

ルート

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

更新 私は、リンク先のアドレスである小さなブログの助けを借りて、これを機能させました。このソリューションは、認証/失敗ルートの URL に失敗メッセージを追加し、指示のある YouTube リンク ページに正しくリダイレ​​クトします。

omn​​iauth.rb に以下を追加しました

OmniAuth.config.on_failure do |env|
  exception = env['omniauth.error']
  error_type = env['omniauth.error.type']
  strategy = env['omniauth.error.strategy']

  Rails.logger.error("OmniAuth Error (#{error_type}): #{exception.inspect}")
    #ErrorNotifier.exception(exception, :strategy => strategy.inspect, :error_type => error_type)

  new_path = "#{env['SCRIPT_NAME']}#{OmniAuth.config.path_prefix}/failure?message=#{error_type}"

  [301, {'Location' => new_path, 'Content-Type'=> 'text/html'}, []]
end

認証/失敗URLに認証エラーを表示し、これをroutes.rbに追加しました

match 'auth/failure', to: 'static_pages#youtube'
4

1 に答える 1

1

うーん...モデル関数thtに条件を設定できます

if user = User.find_by_id(id)
  user
else 
  //procceed with your code to link the account to utube
于 2013-01-08T01:24:04.547 に答える