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.
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.
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.)
https://rit-inc.hatenablog.com/entry/2018/04/02/160106 https://note.com/marikooota/n/n7ac0a66e34ea
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