[RUBY] [Rails] So lösen Sie ActiveSupport :: MessageVerifier :: InvalidSignature, von dem ich bei der Einführung des Twitter-Logins abhängig war [ActiveStorage]

Ich war wirklich begeistert, als ich das Twitter-Login für eine App zur persönlichen Entwicklung einführte, die kurz vor dem Abschluss steht. Daher werde ich die Lösung hier als Memorandum belassen.

Fehlerinhalt

Beim Verknüpfen mit Twitter ist der folgende Fehler aufgetreten, als die Implementierung implementiert wurde, bei der das im Twitter-Konto festgelegte Image mit ActiveStorage angehängt und als Standardprofil-Image festgelegt wurde. (Gleichzeitig wird natürlich auch der Name des Twitter-Kontos gezogen)

ActiveSupport::MessageVerifier::InvalidSignature

Als ich den Code für das Bild auskommentierte, verschwand der Fehler, sodass Active Storage anscheinend etwas falsch machte.

Unzulässige Signatur beim Versuch, direkt mit der Bild-URL zu verbinden? Es scheint, dass es von Active Storage als erkannt wird.

Lösung

Der Ablauf ist ein Bild zum Herunterladen eines Twitter-Bildes mit open-uri und zum direkten Anhängen der E / A-Instanz an ActiveStorage. (Ich würde es begrüßen, wenn Sie auf Fehler im Ausdruck hinweisen könnten.) Unten finden Sie einen Teilcode-Auszug.

sessions_controller.rb



class SessionsController < ApplicationController
  before_action :forbid_login_user, only: %i[new]

  def new; end

  def create
    auth = request.env['omniauth.auth']
    if auth.present?
      user = User.find_or_create_from_auth(request.env['omniauth.auth'])
      session[:user_id] = user.id
      user.activate!
      redirect_to user
    else
      user = User.find_by(email: params[:session][:email].downcase)
      if user&.authenticate(params[:session][:password])
        if user.activated?
          log_in user
          params[:session][:remember_me] == '1' ? remember(user) : forget(user)
          flash[:success] = 'Sie haben sich erfolgreich angemeldet.'
          redirect_to user
        else
          message  = 'Dein Account wurde nicht aktiviert.'
          message += 'Klicken Sie auf den Link zur Aktivierung des E-Mail-Kontos.'
          flash[:warning] = message
          redirect_to root_url
        end
      else
        flash.now[:danger] = 'Das Passwort oder die E-Mail-Adresse ist falsch.'
        render 'new'
      end
    end
  end

user.rb


require 'open-uri'
#Twitter-Authentifizierung
  def self.find_or_create_from_auth(auth)
    provider = auth[:provider]
    uid = auth[:uid]
    nickname = auth[:info][:nickname]
    email = User.dummy_email(auth)
    password = SecureRandom.urlsafe_base64
    #Holen Sie sich Twitter Originalgröße Profilbildpfad
    profile_image_url = auth.info.image.gsub("_normal","")

    self.find_or_create_by(provider: provider, uid: uid) do |user|
      user.nickname = nickname
      user.email = email
      user.password = password
      user.download_and_attach_avatar(profile_image_url)
    end
  end

  private

  #Öffnen Sie die von der Twitter-API erfassten Bilddaten-Mit uri herunterladen und IO-Instanz direkt anhängen
  def download_and_attach_avatar(profile_image_url)
    return unless profile_image_url

    file = open(profile_image_url)
    avatar.attach(io: file,
                  filename: "profile_image.#{file.content_type_parse.first.split("/").last}",
                  content_type: file.content_type_parse.first)  
  end

  def self.dummy_email(auth)
    "#{auth.uid}-#{auth.provider}@example.com"
  end

Der Punkt ist der Teil von `profile_image_url = auth.info.image.gsub (" _normal "," ")`. Die vom Twitter-Client erhaltene Bild-URL enthält die Zeichenfolge _normal, und das Bild wurde verkleinert. Wenn Sie es so verwenden, wie es ist, ist das Bild rau, daher habe ich die gsub-Methode verwendet, um die Zeichenfolge _nomal zu löschen. Auf diese Weise können Sie die Daten der Originalbildgröße abrufen.

Nach dem Herunterladen, indem `profile_image_url``` als Argument an die` download_and_attach_avatar``` Methode übergeben wird, wird es als IO-Instanz an ActiveStorage angehängt.

Auf diese Weise konnten wir es fehlerfrei implementieren.

Selbst wenn ich danach suchte, konnte ich keine Informationen finden, so dass ich durch Ausprobieren zu dieser Methode gelangte. Ich hoffe, Sie finden diesen Artikel hilfreich.

Übrigens kann ich mich in meinem Fall bei normaler Anmeldung nur anmelden, wenn ich das Konto aktiviere. Daher ändere ich die aktivierte Spalte mit user.activate zwangsweise von false auf true! Um eine Validierung zu vermeiden. (Dummy-Daten werden mit der Methode `` `find_or_create_from_auth``` in die Spalte eingefügt, um eine Validierung auch mit E-Mail und Passwort zu vermeiden.)

Artikel, auf die verwiesen wird

https://rit-inc.hatenablog.com/entry/2018/04/02/160106 https://note.com/marikooota/n/n7ac0a66e34ea

Vielen Dank für das Lesen bis zum Ende!

Wir geben das aus, was wir jeden Tag gelernt haben. Wenn Sie Vorschläge haben, würde ich mich freuen, wenn Sie einen Kommentar abgeben könnten! !!

Recommended Posts

[Rails] So lösen Sie ActiveSupport :: MessageVerifier :: InvalidSignature, von dem ich bei der Einführung des Twitter-Logins abhängig war [ActiveStorage]
Wovon ich süchtig war, als ich die Google-Authentifizierung mit Rails implementierte
Über die Sache, dass ich süchtig danach war, wie man Hashmap benutzt
Ich war süchtig danach, MySQL 8.0 mit einem 5.7-Gefühl zu berühren. My.cnf-Konfigurationsproblem
Beachten Sie, dass ich süchtig nach Stapelverarbeitung mit Spring Boot war
Eine Geschichte, nach der ich süchtig war, als ich einen Schlüssel bekam, der automatisch auf MyBatis ausprobiert wurde
Wie man Arrays mit Java stapelweise initialisiert, wusste ich als Anfänger nicht
Was ich beim Update auf Spring Boot 1.5.12 behoben habe ・ Wovon ich süchtig war
Wovon ich süchtig war, als ich rspec auf Schienen benutzte
Ich war süchtig danach, default_url_options mit der Einführung von Rails zu setzen
Die Geschichte, nach der ich beim Einrichten von STS süchtig war
Ein Hinweis, als ich süchtig danach war, Ubuntu auf WSL1 in WSL2 zu konvertieren
Ich war süchtig danach, sbt zu starten
[Rails] So lösen Sie das Problem, dass das Standardbild beim Bearbeiten überschrieben wird, ohne das Bild hochzuladen [Active Storage]
Memorandum: Wovon ich süchtig war, als ich auf die Accounting Freee API traf
Eine Geschichte, der ich beim Testen der API mit MockMVC verfallen war
[Circle CI] Ich war süchtig nach dem automatischen Test von Circle CI (Rails + MySQL) [Memo]
Ich war süchtig danach, in @ SpringApplicationConfiguration-> @SpringBootTest umzuschreiben
So beheben Sie Fehler, die während der Installation von Rails 5.1.3 auftreten
Ich war süchtig nach der Rollmethode
Ich war süchtig nach dem Spring-Batch-Test