3

ユーザーのサインインにomniauth-google-oauth2withを使用するこの ROR アプリケーションがあります。deviseユーザーが自分の Google アカウントからアプリケーションへのアクセスを既に許可した後でユーザーのアカウントがシステムから削除された場合、認証が無限ループの認証になるという問題が発生しています。

シナリオは次のようになります。

  1. ユーザーは Google 経由で認証し、アプリケーションへのアクセスを許可します
  2. コールバックで、アプリケーションはユーザー アカウントが有効かどうか (削除されているか、作成されていないか) を判断します (システムはセルフ サービス登録をサポートしていません)。
  3. ユーザーが認証されていない (サインインしていない) のは正しい)
  4. ユーザーが別のアカウントを試すために Google 経由で再度サインインしようとすると、Google は透過的にユーザーを承認し、ユーザーにアカウントを変更する機会を与えずにアプリケーションにリダイレクトします。

ユーザーは、最初にログアウトすることで、実際にこのループから抜け出すことができます。しかし、それは平均的なユーザーには明らかではないため、理想的なソリューションではありません。

理想的には、解決策は、ユーザーが再度サインインしようとしたときにアカウントを切り替えられるように、コールバック フェーズで access_token を無効にするか、アプリケーションの承認を取り消すことです。

4

1 に答える 1

1

sign_in URLのapproval_promptをオーバーライドできるため、google_oauth2デバイス構成で「auto」(デフォルト)に設定されている場合でも、「force」に設定して、ユーザーをcatch-22から外すことができます。

秘訣は、これがOmniauthCallbacksController内から必要なものであることを伝えることです。シンプルで目立たない方法の1つは、一時的なCookieを設定することです。

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
  def google_oauth2
    if user = User.find_for_google_oauth2(request.env["omniauth.auth"])
      cookies.delete :google_oauth2_approval_prompt
      flash[:notice] = I18n.t( "devise.omniauth_callbacks.success", kind: "Google")
      sign_in_and_redirect user, event: :authentication
    else 
      # we are not supporting self-service registration, so although
      # user has authenticated at Google and given consent to the app,
      # we are not going to allow the user in
      cookies[:google_oauth2_approval_prompt] = "force"
      flash[:error] = I18n.t( "devise.omniauth_callbacks.failure", kind: "Google", reason: "account not provisioned")
      redirect_to root_url
    end
  end
end

次に、Googleログインをレンダリングするビューで、条件付きでapproval_promptを追加します。

:ruby
  extra_params = if approval_prompt = cookies[:google_oauth2_approval_prompt]
    {approval_prompt: approval_prompt}
  else
    {}
  end

= link_to "Sign-in with Google", 
  user_omniauth_authorize_path(:google_oauth2,extra_params)

したがって、これらすべてが整った状態で、ユーザーが最初にGoogleアカウントを使用して、アプリケーションが受け入れないと判断した場合、ユーザーは再度ログインしようとしたときにアカウントを切り替えることができます(アカウントは経由で送信されるため)強制承認ワークフロー)。

于 2013-02-01T16:22:29.203 に答える