3 Stimmen

Wie setzt man den omniauth-google-oauth2 access_token zurück, wenn das Benutzerkonto entfernt wurde

Wir haben diese ROR-Anwendung, die omniauth-google-oauth2 mit devise verwendet, um Benutzer anzumelden. Wir haben ein Problem, bei dem, wenn das Benutzerkonto gelöscht wurde, nachdem der Benutzer bereits Zugriff auf die Anwendung von seinem Google-Konto gewährt hat, die Authentifizierung einfach in einer endlosen Schleife von Authentifizierung stattfindet.

Das Szenario sieht wie folgt aus:

  1. Der Benutzer authentifiziert sich über Google und gewährt Zugriff für die Anwendung.
  2. Im Callback erkennt unsere Anwendung, ob das Benutzerkonto gültig ist - gelöscht oder nicht erstellt (unser System unterstützt keine Selbstregistrierung).
  3. Der Benutzer ist nicht autorisiert (und nicht angemeldet), was korrekt ist.
  4. Wenn der Benutzer erneut versucht, sich über Google anzumelden, um ein anderes Konto auszuprobieren, autorisiert Google transparent und leitet den Benutzer zurück zu unserer Anwendung, ohne dem Benutzer die Möglichkeit zu geben, die Konten zu wechseln.

Der Benutzer kann tatsächlich aus dieser Schleife herauskommen, indem er sich zuerst ausloggt. Aber das ist für den durchschnittlichen Benutzer nicht wirklich offensichtlich, so dass es keine ideale Lösung ist.

Idealerweise würde die Lösung darin bestehen, den access_token ungültig zu machen oder die Anwendungsberechtigung in der Callback-Phase zu widerrufen, so dass der Benutzer bei erneutem Versuch, sich anzumelden, die Konten wechseln kann.

1voto

tardate Punkte 15638

Es ist möglich, die approval_prompt in der sign_in-URL zu überschreiben, sodass Sie diese auf "force" setzen und den Benutzer so aus dem catch-22 herausholen können, auch wenn die google_oauth2-Devise-Konfiguration auf "auto" (Standardwert) gesetzt ist.

Der Trick besteht darin, zu kommunizieren, dass dies von innerhalb des OmniauthCallbacksController benötigt wird. Ein einfacher und unauffälliger Weg besteht darin, einfach einen temporären Cookie zu setzen:

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 
      # Wir unterstützen keine Selbstregistrierung, daher obwohl der Benutzer bei Google authentifiziert ist und der App zugestimmt hat,
      # werden wir den Benutzer nicht zulassen
      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

Dann fügen Sie in der Ansicht, die den Google-Login rendert, bedingt den approval_prompt an:

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

= link_to "Mit Google anmelden", 
  user_omniauth_authorize_path(:google_oauth2,extra_params)

Also, wenn ein Benutzer zunächst versucht, sich mit einem Google-Konto anzumelden, das die Anwendung beschließt nicht zu akzeptieren, wird der Benutzer die Möglichkeit haben, Konten zu wechseln, wenn er erneut versucht sich anzumelden (weil er über den Force-Approval-Workflow geleitet wird).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X