J'étais vraiment intéressé quand j'ai introduit la connexion Twitter à une application de développement personnel qui est sur le point d'être terminée, je vais donc laisser la solution ici sous forme de mémorandum.
Lors de la liaison avec Twitter, l'erreur suivante s'est produite lors de la mise en œuvre de la mise en œuvre de l'attachement de l'image définie dans le compte Twitter avec ActiveStorage et de sa définition comme image de profil par défaut. (Bien sûr, en même temps, le nom du compte Twitter est également extrait)
ActiveSupport::MessageVerifier::InvalidSignature
Lorsque j'ai commenté le code de l'image, l'erreur a disparu, donc Active Storage semblait faire quelque chose de mal.
Signature illégale lorsque vous essayez de joindre directement l'URL de l'image? Il semble qu'il soit reconnu par Active Storage comme.
Le flux est une image du téléchargement d'une image Twitter en utilisant open-uri et de la connexion de l'instance IO directement à ActiveStorage. (Je vous serais reconnaissant si vous pouviez signaler toute erreur dans l'expression.) Voici un extrait de code partiel.
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] = 'Vous vous êtes connecté avec succès.'
redirect_to user
else
message = 'Votre compte n'a pas été activé.'
message += 'Cliquez sur le lien d'activation du compte de messagerie.'
flash[:warning] = message
redirect_to root_url
end
else
flash.now[:danger] = 'Le mot de passe ou l'adresse e-mail est incorrect.'
render 'new'
end
end
end
user.rb
require 'open-uri'
#authentification Twitter
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
#Obtenir le chemin de l'image de profil de taille d'origine Twitter
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
#Ouvrez les données d'image acquises par l'API Twitter-Téléchargez avec uri et attachez directement l'instance IO
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
Le point est la partie de
profile_image_url = auth.info.image.gsub ("_normal", "") `` `.
L'URL de l'image obtenue à partir du client Twitter contient la chaîne de caractères _normal, et l'image a été réduite. Si vous l'utilisez tel quel, l'image sera grossière, j'ai donc utilisé la méthode gsub pour supprimer la chaîne de caractères _nomal. En faisant cela, vous pouvez obtenir les données de la taille de l'image d'origine.
Ensuite, après le téléchargement en passant
profile_image_url à la méthode `` `` download_and_attach_avatar
comme argument, il est attaché à ActiveStorage en tant qu'instance IO.
En faisant cela, nous avons pu l'implémenter sans aucune erreur.
Je n'ai trouvé aucune information lorsque je l'ai recherchée, j'ai donc réussi à arriver à cette méthode par essais et erreurs. J'espère que vous trouverez cet article utile.
Au fait, dans mon cas, avec une connexion normale, je ne peux pas me connecter à moins que j'active le compte, donc je change de force la colonne activée de faux à vrai avec user.activate! Pour éviter la validation. (Les données factices sont placées dans la colonne avec la méthode
find_or_create_from_auth '' `` pour éviter la validation même avec l'email et le mot de passe.)
https://rit-inc.hatenablog.com/entry/2018/04/02/160106 https://note.com/marikooota/n/n7ac0a66e34ea
Nous sortons ce que nous avons appris chaque jour. Si vous avez des suggestions, je vous serais reconnaissant de bien vouloir commenter! !!
Recommended Posts