Teaching Moodle to Laravel
I had to integrate a Laravel application with a Moodle instance: certain users, under given circumstances, may generate a new course in Moodle, be enroled as teacher, and add other platform's users as students.
The first step has been to setup a unified authentication, implementing a OAuth2 server in Laravel (with Passport) and enabling custom OAuth2 authentication in Moodle. That was (mostly) easy.
Then I enabled Moodle's Web Services, and created a new Service including the functions
enrol_manual_unenrol_users. This also was almost easy, given the understanding of the essential Moodle's mechanics about external APIs.
MoodleRest provides a no-brainer PHP package to implement the Moodle API, so there were no problems in implementing the desired flow on the Laravel side.
The only problem - the actual reason for which I'm writing this blog post - was about the creation and first login of new users: even specifying
oauth2 as authentication method (the parameter
auth in the data submitted through
core_user_create_users), Moodle insists in validating the user sending him a verification email. Not exactly the expected behaviour, as the user can only be logged by my own application (which already verified him).
After a bit investigation, I found the Moodle's database table which connects an OAuth2 login with an actual user. And, brutally, when I create a new Moodle user from Laravel I also insert an entry there:
$arr = $moodle->request( 'core_user_create_users', $users, MoodleRest::METHOD_GET ); $moodle_id = $arr->id; // here, "moodle" is the database name // and "mdl_auth_oauth2_linked_login" is the target table DB::table('moodle.mdl_auth_oauth2_linked_login')->insert([ 'timecreated' => time(), 'timemodified' => time(), 'usermodified' => 0, 'userid' => $moodle_id, 'issuerid' => 1, 'username' => $email, 'email' => $email, 'confirmtoken' => '', 'confirmtokenexpires' => 0, ]);
This, of course, implies that the user database used for Laravel has a grant also on the Moodle's database.
Dumping data directly into the Moodle's database may not be the most elegant solution but, as always, it works.