[RUBY] Implementieren Sie die LTI-Authentifizierung in Rails

Was ist eine LTI-Zertifizierung?

Es gibt einen Standard namens LTI-Zertifizierung. LTI ist eine Abkürzung für das Wort Learning Tools Interoperability, was einen Standard für den Austausch von Authentifizierungsinformationen zwischen Learning Support Tools bedeutet.

Es ist eine ziemlich Nischentechnologie, die ein bestimmtes Feld unter den Authentifizierungstechnologien hat, so dass viele Leute es möglicherweise nicht wissen. Ich kannte das Wort LTI nicht einmal, bevor ich mich auf Bildungstechnik spezialisierte.

Nachfolgend finden Sie ein erläuterndes Diagramm der von IMS GLOBAL offiziell ausgestellten LTI-Zertifizierung.

Persönlich verstehe ich, dass es sich immerhin um eine Art OAuth handelt, aber die von uns entwickelte Anwendung sind Lernwerkzeuge. Das Hauptwerkzeug für die Authentifizierung ist die Lernplattform, und die Lernwerkzeuge sind eine Erweiterung der Lernplattform. Anstatt es bereitzustellen, erhalten Sie Ihre Anmeldeinformationen von der Lernplattform. Dies hat den Vorteil, dass Benutzer verschiedene Apps ordnungsgemäß verwenden können, ohne den Benutzer zu wechseln. Derzeit wird Learning Tools auch als LTI Tool Provider und Learning Platform auch als LTI Consumer bezeichnet.

Die Frage ist jedoch, wie dies umgesetzt werden kann. Aufgrund seiner Nischentechnologie fehlt ihm die Dokumentation, und selbst wenn Sie im Internet suchen, werden nicht viele Implementierungsbeispiele veröffentlicht. In diesem Artikel möchte ich daher die tatsächliche Praxis der LTI-Authentifizierung mit Ruby on Rails vorstellen.

Implementierungsbeispiel

Bibliotheksinstallation

Installieren Sie zunächst die erforderlichen Bibliotheken.

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

Der Vorteil der Verwendung von Rails besteht darin, dass eine Bibliothek für die lti-Authentifizierung vorhanden ist. Dieses Mal werden wir es mit ims-lti implementieren.

Registrierung des Authentifizierungsschlüssels

Erstellen Sie eine lti_settings.yml Datei unter config. Bitte beschreiben Sie den folgenden Inhalt (verwenden Sie gegebenenfalls eine sichere Zeichenfolge für den Verbraucherschlüssel und das LTI-Geheimnis).

config/lti_settings.yml


production:
  __consumer_key__: '__lti_secret__'

development:
  __consumer_key__: '__lti_secret__'

Fügen Sie nach der Erstellung die Einstellungen hinzu, um sie in config / application.rb zu laden.

config/application.rb


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

Controller erstellen

Lassen Sie uns ltis_controller erstellen und den folgenden Inhalt beschreiben


require 'oauth/request_proxy/action_controller_request'

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

  def lti_launch
    #Der empfangene Consumer-Schlüssel ist config/lti_settings.Überprüfen Sie, ob es in yml ist
    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
    
    #Speichern Sie die LTI-Informationen in der Sitzung
    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

Sie können sich einfach authentifizieren, indem Sie die an "MessageAuthenticator" gesendete Anfrage und die hier gespeicherten Schlüsselinformationen im Voraus übergeben. Wenn die Authentifizierung erfolgreich ist, melden Sie sich mit der Bibliothek "devise" an, um die Authentifizierung auf der Anwendungsseite zu implementieren.

Zuletzt definieren wir den Endpunkt zum Starten von "lti_launch".

config/routes.rb


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

Einstellungen auf der Seite der Lernplattform

Sobald dies erledigt ist, müssen Sie lediglich die in lti_settings.yml beschriebenen Authentifizierungsinformationen vorab auf der Seite der Lernplattform schreiben und auf den Übergang zum angegebenen Endpunkt einstellen. Diese Methode unterscheidet sich je nach Lernplattform, daher werde ich sie weglassen.

(Ergänzung) Wenn in Rails während des LTI-Übergangs ein Cross-Origin-Fehler auftritt

Fügen Sie den folgenden Inhalt zu config / application.rb hinzu

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

Verweise

Rails LTI Tool Provider IMS LTI

Recommended Posts

Implementieren Sie die LTI-Authentifizierung in Rails
Markdown in Rails implementiert
Implementieren Sie die Anwendungsfunktion in Rails
Implementieren Sie die Standardauthentifizierung in Java
Implementieren Sie eine einfache Anmeldefunktion in Rails
Implementieren Sie ein Kontaktformular in Rails
Implementieren Sie die CSV-Download-Funktion in Rails
Implementieren Sie die Rails-Paginierung
Group_by in Rails
So implementieren Sie Ranking-Funktionen in Rails
Implementieren Sie Schaltflächenübergänge mit link_to in Rails
Erstellen Sie die Authentifizierungsfunktion in der Rails-Anwendung mit devise
Implementieren Sie die Sternebewertungsfunktion mit Raty in Rails 6
So implementieren Sie eine ähnliche Funktion in Rails
Implementieren Sie Iterationen in View, indem Sie eine Sammlung rendern [Rails]
Modellassoziation in Rails
Hinzufügen von Spalten in Rails
Deaktivieren Sie Turbolinks in Schienen
Rails-Konto-BAN implementieren
^, $ im regulären Ausdruck von Rails
Verwenden Sie Bilder mit Schienen
Implementieren Sie CustomView im Code
Migration in Schienen verstehen
Teilen Sie route.rb in Rails6
[Schienen] Implementieren Sie die Rechenaufgabe
So implementieren Sie die Gastanmeldung in 5 Minuten im Rails-Portfolio
Implementieren Sie die Nachsuchfunktion in der Rails-Anwendung (where-Methode).
So implementieren Sie eine nette Funktion in Ajax mit Rails
Führen Sie devise with Rails ein, um Benutzerverwaltungsfunktionen zu implementieren
[Rails] Holen Sie sich UserAgent auf den Controller
[Schienen] Implementieren Sie die Benutzersuchfunktion
Deklarative Transaktion in Rails #ginzarb
SNS-Authentifizierung mit Rails Google
Implementierung der zweistufigen Authentifizierung in Java
Japanisieren Sie mit i18n mit Rails
Implementieren Sie die Anmeldefunktion in Rails einfach mit Name und Passwort (1)
Implementieren Sie die Anmeldefunktion in Rails einfach mit nur einem Namen und einem Passwort (2).
Edelstein oft in Schienen verwendet
Implementieren Sie eine Kombination aus Mathematik in Java
2 Implementieren Sie eine einfache Syntaxanalyse in Java
[Android] Implementieren Sie Adblock in WebView
Implementieren Sie das Senden von E-Mails in Java
Monatskalender in Rails anzeigen
Implementieren Sie eine funktionsähnliche schnelle Sortierung in Java
[Rails] So implementieren Sie Scraping
Verwenden Sie mehrere Kontrollkästchen in Rails6!
[Rails] Implementieren Sie die Image-Posting-Funktion
Implementieren Sie die Anmeldefunktion in Rails einfach mit Name und Passwort (3).
Implementieren Sie die Benutzerregistrierungsfunktion und die Unternehmensregistrierungsfunktion separat in Rails devise