individuelle Registrierungsmöglichkeit gesucht

individuelle Registrierungsmöglichkeit gesucht

von Vivia Heidemann -
Anzahl Antworten: 15

Hallo, 
im Laufe unseres Projektes stoßen wir gerade an unsere Grenzen und ehe wir irgendwie an der Struktur von Moodle rumbasteln, fragen wir hier und hoffen auf eure Experten-Tipps.
Zur Situation: Wir haben eine Vorschaltseite, von der aus der Nutzer zur Moodle-Seite gelangt. Er soll die auf der Vorschaltseite befindliche Registrierung ausfüllen (email, Geschlecht) und diese abschicken. Im Hintergrund müsste Moodle einen neuen User anlegen und die Registrierung mit weiteren (random) Daten füttern, die für die Registrierung notwendig sind. Der neue User soll nun einen Link zugesandt bekommen, um sich zu verifizieren und direkt auf die Kursseite weitergeleitet werden.

In dem Projekt geht es um profilgebundene WissensChecks. Dort benötigen wir nur eine gültige E-Mailadresse, sowie das Geschlecht (um die Testergebnisse zuorden zu können) und wollen somit auch keine weiteren Daten erheben, da diese Tests so anonym wie möglich durchgeführt werden sollen.

Lässt sich das überhaupt so realisieren, wie wir uns das vorstellen? Wie lässt es sich realisieren?

Danke im Voraus!

Mittelwert:  -
Als Antwort auf Vivia Heidemann

Re: individuelle Registrierungsmöglichkeit gesucht

von A. Obeid -

Hallo Vivia,

das lässt sich realisieren. Ein Tipp wie: schaue dir die Oauth2 Varianten an. https://moodle.org/plugins/auth_googleoauth2

Vieles kann da weggelassen werden. Hauptsache diese Klasse wird benutzt class auth_plugin_deineclasse extends auth_plugin_base

Sollen diese Benutzer sich nochmal anmelden können?  Wenn ja brauchen sie Benutzername (könnte die email sein) und Passwort.

Wenn du noch mehr Informationen brauchst, einfach schreiben.


Als Antwort auf A. Obeid

Re: individuelle Registrierungsmöglichkeit gesucht

von Vivia Heidemann -

Hallo A. Obeid,

vielen Dank für die schnelle Antwort. Ich habe mich jetzt ein wenig in Oauth2 eingelesen, So ganz klar, wie wir das in unserem Fall nutzen können, ist es mir aber noch nicht traurig Ein Login mit  zb. Facebookdaten wäre nur als Zusatz angedacht.

Wir benötigen diese Emailauthentifizierung.
An sich reicht es aber aus, wenn sich die Nutzer nur einmal einloggen können, um die Tests zu machen.

Als Antwort auf Vivia Heidemann

Re: individuelle Registrierungsmöglichkeit gesucht

von Andreas Schenkel -

kann man da nicht einfach die "normale" selbstregistrierung freischalten ... dann kann jeder user sich einfach selbst einen account holen, indem er seine email-adresse angibt und anschließend das system nutzen

Als Antwort auf A. Obeid

Re: individuelle Registrierungsmöglichkeit gesucht

von Martin Haferanke -
Hallo A. Obeid,

hallo alle zusammen,


danke für die Antworten.

Ich bin der Projektkoordinator des Projekts, welches Frau Heidemann beschrieben hat.


Zur Thematik:

Via OAuth2 lassen sich meines Erachtens lediglich User mit Microsoft, Twitter, Facebook oder Google Account im Hintergrund anmelden. 

Wir wollen jedoch allen die Möglichkeit geben sich zu registrieren, auch ohne die jeweiligen Konten im Hintergrund. Das Ministerium gibt vor das wir lediglich die Email und das Geschlecht des Users ermitteln. Die OAuth2-Variante wäre für uns also ein Extra.


Ich fasse noch einmal zusammen was uns wichtig ist und wie der Userflow gestaltet sein soll.


Userflow:

1. Eingabe der Nutzerdaten

User kommt auf unsere Homepage und gibt in einem Inputfelder seine Email und in einem Dropdown das Geschlecht ein. Mit einem Submit Button soll diese Form abgeschlossen werden.


2. Nutzerkonto anlegen

Im Hintergrund soll ein Nutzerkonto auf unserem Moodle mit den übertragenen Daten erstellt werden. (wovon der der User nichts mitbekommt) Lediglich eine Nachricht mit "Sie erhalten gleich eine Validierungs-Email".

Mein jetziger Lösungsansatz: ----> Da Moodle weitere Pflichtfelder benötigt, sollen diese von Dummywerten übernommen werden. (z.B.: username: dummyuser01 pw: 1234 usw.) Email und Geschlecht sollen hier via POST übertragen werden.


3. Validieren des Users und Weiterleitung zum Test

das Ministerium stellt ebenfalls die Bedingung, das der User als "natürliche Person" validiert werden soll. Dies wird durch die anschließende Validierungs-Email realisiert. Anschließend soll der User direkt zu unserem Test (Kurs in unserem Moodle) weitergeleitet werden.


Der Sinn hinter dem Ganzen 

ist, dass wir dem User die Einstiegsbarriere so gering wie möglich gestalten wollen. 

Außerdem ist die Benutzung der Moodle Plattform so ausgelegt, dass der User nur ein bis maximal zweimal den Test beanspruchen soll. 

Zusätzlich benötigen wir Email und Geschlecht, damit wir die Testergebnisse und Auswertungsergebnisse von Umfragen, mit den anonymen Accountinformationen des Users verbinden und nachvollziehen können.


Vielen Dank für Ihre Mühen,

vielleicht können Sie uns weiterhelfen.


Viele Grüße,

Martin Haferanke


Als Antwort auf Martin Haferanke

Re: individuelle Registrierungsmöglichkeit gesucht

von Andreas Schenkel -

Das geht mit der normalen Selbstregistrierung. Da kann man noch captcha aktivieren, dass sicher gestellt ist, dass der Account von einer Person beantragt wird.

Aus den Feldern "Vorname" und "Nachname" kann man im Sprachpaket von Moodle ändern, so dass dort irgend etwas anderes angefragt wird, z.B. Lieblingtier und Lieblings-Stadt.

Durch diesen Trick hat man meiner Meinung nach die "scheinbare" Anonymität ....

Dann noch aktivieren, dass man sich mit der eMail-Adresse als Anmeldenamen anmelden kann. So muss sich der Teilnehmer nicht den Anmeldenamen merken, sondern nutzt einfach seine eMail-Adresse plus das selbst gewählte Kennwort.

Als Antwort auf Martin Haferanke

Re: individuelle Registrierungsmöglichkeit gesucht

von A. Obeid -

Hallo Martin,


ja das Oauth2-Plugin soll nur zum Angucken, wie Ihr das selber macht.

Das heißt ihr erstellt euren eigenen Authentifizierung-Methode. Die Seite, die ihr vorher programmiert  "User kommt auf unsere Homepage und gibt in einem Inputfelder seine Email und in einem Dropdown das Geschlecht ein." ruft die Anmeldeseite von Moodle mit der Email und Geschlecht als Übergabeparameter auf.

wwweurenmoodle/login/index.php?email='emial@..'&geschlecht='MannOderFrau'

Jetzt kommt das neu geschriebene Authentifizierung-Methode im Spiel. Diese soll über die Moodle Administrationsseite zuerst aktiviert und vlt. auch hoch geschoben werden.

Die Datei auth.php könnt ihr nachmachen. Die Methode 

function loginpage_hook() {
        global $SESSION, $CFG, $DB;     
        $email= optional_param('email', '', PARAM_TEXT);

      $geschlecht= optional_param('geschlecht', '', PARAM_TEXT);


//Bsp. Hier neuen Benutzer erstellen:

$newuser = new stdClass();
                $newuser->email = $useremail;
                $newuser->firstname = "suchteuchwasaus"
                $newuser->lastname = "zahlenzB";
               
                $newuser->idnumber=$UserID;//auch frei wählbar
               
                $u = create_user_record($username, '', 'derNamevon euerAuth');
                $newuser->id = $u->id;
                $DB->update_record('user', $newuser);   

wenn der Benutzer Erstellt wird, kann er angemeldetwerden: authenticate_user_login($username, null);
jetzt fehlt noch in welchem Kurs und welche Rolle soll der neue Benutzer bekommen.
 // hier muss nicht Shortname sein, geht auch mit courseID, $shortname kann vorher auch fest definiert werden
$course = $DB->get_record('course', array('shortname' => $shortname), '*', MUST_EXIST);


jetzt noch Rolle geben und in dem Kurs einschreiben.
 //Überprüfungen lasse ich hier weg
$enrol = enrol_get_plugin($enrolmethod);
$instances = enrol_get_instances($course->id, true);
 $instanceid = $enrol->add_default_instance($course);
$enrol->enrol_user($instance, $user->id, $roleid); complete_user_login($user);


anschließend redirect zum Kurs:
$urltogo = $CFG->wwwroot.'/course/view.php?id='.$course->id;
redirect($urltogo);
Als Antwort auf A. Obeid

Re: individuelle Registrierungsmöglichkeit gesucht

von Martin Haferanke -

Hallo A. Obeid,


vielen Dank für deine Antwort.

Leider kann ich dein Beispiel nicht ganz implementieren. Ich habe Schwierigkeiten eine neue Authentifizierung-Methode hinzuzufügen. (Habe die Email Variante kopiert aber Moodle gibt mir einen Fehler aus) 

Kann vielleicht auch daran liegen das PHP bei mir schon eine Weile her. 

Daher habe ich noch ein paar Fragen:

1. Werden der von Ihnen beschriebene Ablauf in "loginpage_hook" geschrieben oder in separate Funktionen?

2. Wie kann ich recht sauber eine neue Authentifizierung-Methode hinzufügen?

3. Könnte ich theoretisch die Email-Authentifizierung als Ausgangslage nehmen ? Wir müssen ja eine Authentifizierungs-Email an den User schicken.


Vielen Dankfür Ihre Geduld und Zeit!


Viele Grüße,


Martin Haferanke  

Als Antwort auf Martin Haferanke

Re: individuelle Registrierungsmöglichkeit gesucht

von A. Obeid -

Hi

Das kopieren der Email Variante oder das Abändern von Oauth ist fast das gleichelächelnd.

1- Das von mir beschriebene Ablauf/code kommt in der Funktion "loginpage_hook()".

2- Die erstellten Dateien oder bearbeitet Kopien entweder als Plugin via Administrationsseite installieren (zuerst Zippen) oder direkt in moodle/auth/ rein kopieren (ohne Zippen) und  anschließend die Daten Bank über die Oberfläche aktualisieren.

3- ja das geht. Das ist aber keine sichere Authentifizierungsmethode, das soll klar sein. Ist ähnlich wie ein Gast, der etwas mehr kann und eine Email hinterlässt. Das schicken per Per Mail wird dann so sein, dass die vorgeschaltete Seite den Benutzer die URLvonMoodle/login/index.php?email= &geschlecht=.. schickt. Wenn es eine PHP-Seite ist, das geht dann per mail()-funktion. Den Rest macht das auth-Methode automatisch. (Falls das Anmelden ausschließlich nach dem Erhalt der email klappen soll, würde ich empfehlen Tokensgenerator zu benutzen. dann sind wir wieder beim Oauth)

HIer ein Bsp für eine simple Authentifizierung:https://moodle.org/plugins/auth_basic  am besten umbenenne, anpassen und das oben beschriebene  Ablauf verwenden.

Grüße


Als Antwort auf A. Obeid

Re: individuelle Registrierungsmöglichkeit gesucht

von Martin Haferanke -

So bin etwas voran gekommen und habe die email basierte Authentifizierung um die genannte Funktion erweitert.


function loginpage_hook() {

global $SESSION, $CFG, $DB;
$email = optional_param('email', '', PARAM_TEXT);
$geschlecht = optional_param('geschlecht', '', PARAM_TEXT);

echo $geschlecht;
//Bsp. Hier neuen Benutzer erstellen:

$newuser = new stdClass();
$newuser - > email = $email;
$newuser - > firstname = "pwc";
$newuser - > lastname = "user";
$newuser - > city = "hometown";
$newuser - > geschlecht = $geschlecht;

$newuser - > idnumber = md5(uniqid(rand(), true));
$username = substr($newuser - > idnumber, 0, 7);

$u = create_user_record($username, '123abcABC$', 'email');
$newuser - > id = $u - > id;
$DB - > update_record('user', $newuser);

authenticate_user_login($username, null);

// hier muss nicht Shortname sein, geht auch mit courseID, $shortname kann vorher auch fest definiert werden
$shortname = "dasda";
$course = $DB - > get_record('course', array('shortname' => $shortname), '*', MUST_EXIST);


//Überprüfungen lasse ich hier weg

$instances = enrol_get_instances($course - > id, true);
$manualinstance = null;

$enrolmethod = "self_enrolment";

foreach($instances as $instance) {
if ($instance - > name == $enrolmethod) {
$manualinstance = $instance;
break;
}
}

$roleid = $DB - > get_field('role', 'id', array('shortname' => $shortname));

$this - > check_enrol($shortname, $newuser - > id, $roleid, $enrolmethod);
complete_user_login($newuser);

$urltogo = $CFG - > wwwroot.
'/course/view.php?id='.$course - > id;
redirect($urltogo);

}



Beim aufrufen der login/index.php erhalte ich jedoch folgende Fehlermeldung 


es scheint wohl damit zu tun haben, dass das Geschlecht nicht richtig gesetzt wird. Es wird aber beim Testen via Post an die URL angehangen. 

Anscheinend wird das Geschlecht gar nicht erst in die Datenbank geschrieben.


Der User wird aber schon einmal angelegt und angemeldet. Schon einmal ein kleiner Fortschritt lächelnd


PS: Im Bild ist ein $ in der URL um die Parameter zu verbinden, das ist natürlich ein Schreibfehler. Jedoch mit & funktioniert es ebenso wenig.


Viele Grüße,


Martin




Als Antwort auf Martin Haferanke

Re: individuelle Registrierungsmöglichkeit gesucht

von Martin Haferanke -

Sorry, irgendwie kriegt dieses Moodle im Forum keine Vorformatierung des Codes hin :O

Als Antwort auf Martin Haferanke

Re: individuelle Registrierungsmöglichkeit gesucht

von A. Obeid -

Ja,

in Moodle sind die User Geschlechtsloslächelnd

Das heißt so was "$newuser - > geschlecht = $geschlecht;" gibt es nicht.

Um das zu Lösen hättest du 2 Möglichkeiten.

erstmal schaue diese Liste an:

list of ( 
object {
username string //Username policy is defined in Moodle security config.
password string Optional //Plain text password consisting of any characters
createpassword int Optional //True if password should be created and mailed to user.
firstname string //The first name(s) of the user
lastname string //The family name of the user
email string //A valid and unique email address
auth string Standardmäßig für 'manual' //Auth plugins include manual, ldap, imap, etc
idnumber string Standardmäßig für '' //An arbitrary ID code number perhaps from the institution
lang string Standardmäßig für 'de' //Language code such as "en", must exist on server
calendartype string Standardmäßig für 'gregorian' //Calendar type such as "gregorian", must exist on server
theme string Optional //Theme name such as "standard", must exist on server
timezone string Optional //Timezone code such as Australia/Perth, or 99 for default
mailformat int Optional //Mail format code is 0 for plain text, 1 for HTML etc
description string Optional //User profile description, no HTML
city string Optional //Home city of the user
country string Optional //Home country code of the user, such as AU or CZ
firstnamephonetic string Optional //The first name(s) phonetically of the user
lastnamephonetic string Optional //The family name phonetically of the user
middlename string Optional //The middle name of the user
alternatename string Optional //The alternate name of the user
preferences Optional //User preferences
list of (
object {
type string //The name of the preference
value string //The value of the preference
}
)customfields Optional //User custom fields (also known as user profil fields)
list of (
object {
type string //The name of the custom field
value string //The value of the custom field
}
)}
)
Hier sind die standard-Attribute vom User.
Möglichkeit 1: Einer diese Attribute als Geschlecht-Speicherplatz missbrauchen.

Möglichkeit 2: Als Admin in Moodle einen weiteren Attribut erstellen unter:
Startseite-> Website-Administration-> Nutzer/innen-> Nutzerkonten-> Profilfelder; hier den selbst geschriebenen Namen zb 'geschlecht' könnte auch im Code unter:
$newuser - >customfields['geschlecht']=
benutzt werden.

Tipp: Wenn die Vor und Nachname nicht wichtig sind, dann einfach eins davon als Geschlecht doch nehmen.

und
$roleid = $DB - > get_field('role', 'id', array('shortname' => $shortname)); die Rollen in Moodle haben Kurzbezeichnung, die sind unter "Rollen verwalten" zu sehen, bei Rolle Student steht student, wenn die neuen User diese rolle haben sollten, dann würde ich statt $shotrname student nehmen. Es sei denn eine Rolle mit der Kurzbezeichning "dasda" existiert oder erstellt wurde.

Als Antwort auf A. Obeid

Re: individuelle Registrierungsmöglichkeit gesucht

von Martin Haferanke -

Danke für den Tip. 
Leider hat die Zuweisung via 

$newuser - >customfields['geschlecht'] = $geschlecht;
nicht funktioniert. 

Ich habe jetzt den Tipp angenommen und die Stadt als Geschlecht missbraucht lächelnd

Mein jetziges Problem ist folgende Fehlermeldung: 

Debug info: Column 'lastlogin' cannot be null
UPDATE mdl_user SET firstaccess = ?,lastlogin = ?,currentlogin = ?,lastaccess = ?,lastip = ? WHERE id=?
[array (
0 => 1513763494,
1 => NULL,
2 => 1513763494,
3 => 1513763494,
4 => '0:0:0:0:0:0:0:1',
5 => '187',
)]
Error code: dmlwriteexception

Habe probiert lastlogin danach ebenfalls im Script mit anzugeben:

$timestamp = time();
$newuser -> lastlogin = $timestamp;

vorher hatte ich lastlogin auf 0 gesetzt, da es sich ja um einen neuen Nutzer handelt, aber beide Varianten funktionieren leider nicht. :/

Gruß


Als Antwort auf Martin Haferanke

Re: individuelle Registrierungsmöglichkeit gesucht

von Martin Haferanke -

Ok konnte mein Problem selber lösen. 

Ich glaube ich bin kurz vor dem Ziel. 

Hiermit sende ich dem User eine ConfirmEmail und logge ihn ein wenn alles glatt läuft.

if($this -> user_signup_with_confirmation($newuser))
return complete_user_login($newuser);


Ich erhalte auch eine Email, jedoch scheint die "confirmation data" invalide zu sein. 

Invalid confirmation data
Debug info: 
Error code: invalidconfirmdata
Stack trace:line 503 of /lib/setuplib.php: moodle_exception thrownline 98 of /login/confirm.php: call to print_error()

Die URL die ich erhalten hatte, lautete: 

 http://localhost:8888/moodle33/login/confirm.php?data=/a27801e
Fehlt hier nicht das "$usersecret" im data Parameter? Oder was könnte der Fehler sein?


VIele Grüße,


Martin

Als Antwort auf Martin Haferanke

Re: individuelle Registrierungsmöglichkeit gesucht

von A. Obeid -

Wie ich die Anforderung oben verstanden haben, ist geplant den Benutzer eine Email mit dem Link zu Moodle vor der Anmeldung. Das Heißt die Email wird von der Vorgeschaltete Seite geschickt. Die Enthät dann die url mit login/index.php?email=..&..

Die Vorschalte Seite, wenn sie php-basiert ist, Sammelt die Daten aus dem Formular (input Felter, die Mail und Geschlecht abfragen) bildet die URL und schickt sie per php-mail an dem Benutzer. Der wiederum ruft aus seinem Email-Account die URL auf und ist dann in Moodle angemeldet.  

Oder?