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