[RUBY] Implémenter l'authentification LTI dans Rails

Qu'est-ce que la certification LTI?

Il existe une norme appelée certification LTI. LTI est un acronyme pour le mot Interopérabilité des outils d'apprentissage, ce qui signifie une norme pour l'échange d'informations d'authentification entre les outils d'aide à l'apprentissage.

C'est une technologie assez niche qui a un domaine spécifique parmi les technologies d'authentification, donc beaucoup de gens peuvent ne pas le savoir. Je ne connaissais même pas le mot LTI avant de me spécialiser en ingénierie pédagogique.

Vous trouverez ci-dessous un schéma explicatif de la certification LTI officiellement délivrée par IMS GLOBAL.

Personnellement, je comprends que c'est une sorte d'OAuth après tout, mais l'application que nous développons est Learning Tools, le principal outil qui est à la base de l'authentification est Learning Platform, et Learning Tools est une extension de Learning Platform. Au lieu de le fournir, vous obtiendrez vos informations d'identification de la plateforme d'apprentissage. Cela présente l'avantage que les utilisateurs peuvent utiliser correctement diverses applications sans changer d'utilisateur. À l'heure actuelle, Learning Tools est également appelé LTI Tool Provider, et Learning Platform est également appelé LTI Consumer.

Mais la question est de savoir comment mettre en œuvre cela. En fait, en raison de sa technologie de niche, il manque de documentation, et même si vous recherchez sur le net, il n'y a pas beaucoup d'exemples d'implémentation publiés. Donc, dans cet article, je voudrais présenter la pratique réelle de l'authentification LTI à l'aide de Ruby on Rails.

Exemple d'implémentation

Installation de la bibliothèque

Tout d'abord, installez les bibliothèques requises.

$ bundle add devise
$ bundle add ims-lti
$ bundle add oauth

L'avantage d'utiliser Rails est qu'il existe une bibliothèque pour l'authentification lti. Cette fois, nous allons l'implémenter en utilisant ʻims-lti`.

Enregistrement de la clé d'authentification

Créez un fichier lti_settings.yml sous config. Veuillez décrire le contenu suivant (utilisez une chaîne de caractères sûre pour la clé du consommateur et le secret LTI le cas échéant).

config/lti_settings.yml


production:
  __consumer_key__: '__lti_secret__'

development:
  __consumer_key__: '__lti_secret__'

Une fois créé, ajoutez les paramètres pour le charger dans config / application.rb.

config/application.rb


config.lti_settings = Rails.application.config_for(:lti_settings)

Créer un contrôleur

Créons ltis_controller et décrivons le contenu suivant


require 'oauth/request_proxy/action_controller_request'

class LtisController < ApplicationController
  skip_before_action :verify_authenticity_token, only: :launch

  def lti_launch
    #La clé de consommateur reçue est config/lti_settings.Vérifiez s'il est en yml
    if not Rails.configuration.lti_settings[params[:oauth_consumer_key]]
      render :launch_error, status: 401
      return
    end 
    shared_secret = Rails.configuration.lti_settings[params[:oauth_consumer_key]]
    authenticator = IMS::LTI::Services::MessageAuthenticator.new(request.url, request.request_parameters, shared_secret)
    
    #Check if the signature is valid
    if not authenticator.valid_signature?
      render :launch_error, status: 401
      return
    end
    #check if the message is too old
    if DateTime.strptime(request.request_parameters['oauth_timestamp'],'%s') < 5.minutes.ago
      render :launch_error, status: 401
      return
    end
    
    #Enregistrer les informations LTI dans la session
    session_data = {
      "fullname" => authenticator&.message&.lis_person_name_full,
      "email" => authenticator&.message&.lis_person_contact_email_primary,
      "user_id" => authenticator&.message&.user_id,
      "context_id" => authenticator&.message&.context_id,
      "context_title" => authenticator&.message&.context_title,
      "tool_consumer_instance_name" => authenticator&.message&.tool_consumer_instance_name
    }
    print(session_data)
    session['lti-authenticator'] = session_data
    sign_in_and_redirect(User.first)
  end
end

Vous pouvez facilement vous authentifier en passant la requête envoyée à MessageAuthenticator et les informations clés conservées ici à l'avance. Si l'authentification réussit, connectez-vous à l'aide de la bibliothèque devise pour implémenter l'authentification côté application.

Enfin, définissons le point de terminaison pour lancer lti_launch.

config/routes.rb


  match 'lti/launch' => 'ltis#lti_launch', via: [:get, :post], as: :lti_launch

Paramètres du côté de la plateforme d'apprentissage

Une fois que cela est fait, la plate-forme d'apprentissage peut écrire les informations d'authentification décrites dans lti_settings.yml à l'avance et la configurer pour la transition vers le point de terminaison spécifié. Cette méthode diffère selon la plate-forme d'apprentissage individuelle, je vais donc l'omettre.

(Supplément) Si une erreur d'origine croisée se produit dans Rails pendant la transition LTI

Ajoutez le contenu suivant à config / application.rb

config/application.rb


    config.lti_settings = Rails.application.config_for(:lti_settings)
    config.action_dispatch.default_headers['Referrer-Policy'] = 'unsafe-url'
    config.action_controller.forgery_protection_origin_check = false
    config.action_controller.allow_forgery_protection = false

Les références

Rails LTI Tool Provider IMS LTI

Recommended Posts

Implémenter l'authentification LTI dans Rails
Markdown implémenté dans Rails
Implémenter la fonction d'application dans Rails
Implémenter l'authentification de base en Java
Implémenter une fonction de connexion simple dans Rails
Implémenter un formulaire de contact dans Rails
Implémenter la fonction de téléchargement CSV dans Rails
Implémenter la pagination des rails
Group_by dans Rails
Comment implémenter la fonctionnalité de classement dans Rails
Implémenter des transitions de boutons à l'aide de link_to dans Rails
Créer une fonction d'authentification dans l'application Rails à l'aide de devise
Mettre en œuvre la fonction de classement par étoiles en utilisant Raty dans Rails 6
Comment implémenter une fonctionnalité similaire dans Rails
Implémenter des itérations dans View en rendant une collection [Rails]
Association de modèles dans Rails
Ajout de colonnes dans les rails
Désactiver les turbolinks dans les rails
Mettre en œuvre le BAN du compte Rails
^, $ dans l'expression régulière Rails
Utiliser des images avec des rails
Implémenter CustomView dans le code
Comprendre la migration dans les rails
Diviser routes.rb dans Rails6
[Rails] Mettre en œuvre la tâche de râteau
Comment implémenter la connexion invité en 5 minutes sur le portefeuille de rails
Implémenter la fonction de recherche de publication dans l'application Rails (méthode where)
Comment implémenter une fonctionnalité intéressante dans Ajax avec Rails
Introduire la conception avec Rails pour implémenter la fonctionnalité de gestion des utilisateurs
[Rails] Obtenir UserAgent sur le contrôleur
[Rails] Implémenter la fonction de recherche d'utilisateurs
Transaction déclarative dans Rails #ginzarb
Authentification SNS à l'aide de Rails google
Implémentation de l'authentification en deux étapes en Java
Japaneseize en utilisant i18n avec Rails
Implémentez la fonction de connexion dans Rails simplement avec le nom et le mot de passe (1)
Implémentez la fonction de connexion dans Rails simplement avec juste un nom et un mot de passe (2)
Gemme souvent utilisée dans les rails
Implémenter une combinaison de mathématiques en Java
2 Implémentez une analyse syntaxique simple en Java
[Android] Mettre en œuvre Adblock dans WebView
Implémenter l'envoi d'e-mails en Java
Afficher le calendrier mensuel dans Rails
Implémenter un tri rapide de type fonction en Java
[Rails] Comment mettre en œuvre le scraping
Utilisez plusieurs cases à cocher dans Rails6!
[Rails] Implémenter la fonction de publication d'images
Implémentez la fonction de connexion simplement avec le nom et le mot de passe dans Rails (3)
Implémenter la fonction d'enregistrement des utilisateurs et la fonction d'enregistrement de l'entreprise séparément dans Rails concevoir