[RUBY] [Rails] Comment résoudre ActiveSupport :: MessageVerifier :: InvalidSignature auquel j'étais accro lors de l'introduction de la connexion Twitter [ActiveStorage]

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.

contenu de l'erreur

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.

Solution

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.)

Articles référencés

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

Merci d'avoir lu jusqu'au bout!

Nous sortons ce que nous avons appris chaque jour. Si vous avez des suggestions, je vous serais reconnaissant de bien vouloir commenter! !!

Recommended Posts

[Rails] Comment résoudre ActiveSupport :: MessageVerifier :: InvalidSignature auquel j'étais accro lors de l'introduction de la connexion Twitter [ActiveStorage]
Ce à quoi j'étais accro lors de la mise en œuvre de l'authentification Google avec des rails
À propos de la question pour laquelle j'étais accro à l'utilisation de hashmap
J'étais accro à l'idée de toucher MySQL 8.0 avec un sentiment de 5.7. Problème de configuration My.cnf
Notez que j'étais accro au traitement par lots avec Spring Boot
Une histoire à laquelle j'étais accro lors de l'obtention d'une clé qui a été automatiquement essayée sur MyBatis
Comment initialiser par lots des tableaux avec Java que je ne savais pas quand j'étais débutant
Ce que j'ai corrigé lors de la mise à jour vers Spring Boot 1.5.12 ・ Ce à quoi j'étais accro
Ce à quoi j'étais accro en utilisant rspec sur des rails
J'étais accro à la configuration de default_url_options avec l'introduction de la conception de Rails
L'histoire à laquelle j'étais accro lors de la création de STS
Une note quand j'étais accro à la conversion d'Ubuntu sur WSL1 en WSL2
J'étais accro au démarrage de sbt
[Rails] Comment résoudre le problème d'écrasement de l'image par défaut lors de l'édition sans télécharger l'image [Active Storage]
Mémorandum: Ce à quoi j'étais accro quand j'ai frappé l'API de comptabilité freee
Une histoire à laquelle j'étais accro lors du test de l'API à l'aide de MockMVC
[Circle CI] J'étais accro au test automatique de Circle CI (rails + mysql) [Memo]
J'étais accro à la réécriture sur @ SpringApplicationConfiguration-> @SpringBootTest
Comment résoudre les erreurs qui se produisent lors de l'installation de Rails 5.1.3
J'étais accro à la méthode du rouleau
J'étais accro au test Spring-Batch