in classes/loginflow/base.php [528:579]
protected function createtoken($oidcuniqid, $username, $authparams, $tokenparams, \auth_oidc\jwt $idtoken, $userid = 0,
$originalupn = null) {
global $DB;
if (!is_null($originalupn)) {
$oidcusername = $originalupn;
} else {
// Determine remote username. Use 'upn' if available (Azure-specific), or fall back to standard 'sub'.
$oidcusername = $idtoken->claim('upn');
if (empty($oidcusername)) {
$oidcusername = $idtoken->claim('sub');
}
}
// We should not fail here (idtoken was verified earlier to at least contain 'sub', but just in case...).
if (empty($oidcusername)) {
throw new \moodle_exception('errorauthinvalididtoken', 'auth_oidc');
}
// Cleanup old invalid token with the same oidcusername.
$DB->delete_records('auth_oidc_token', ['oidcusername' => $oidcusername]);
// Handle "The existing token for this user does not contain a valid user ID" error.
if ($userid == 0) {
$userrec = $DB->get_record('user', ['username' => $username]);
if ($userrec) {
$userid = $userrec->id;
}
}
$tokenrec = new \stdClass;
$tokenrec->oidcuniqid = $oidcuniqid;
$tokenrec->username = $username;
$tokenrec->userid = $userid;
$tokenrec->oidcusername = $oidcusername;
$tokenrec->scope = !empty($tokenparams['scope']) ? $tokenparams['scope'] : 'openid profile email';
$tokenrec->tokenresource = !empty($tokenparams['resource']) ? $tokenparams['resource'] : $this->config->oidcresource;
$tokenrec->scope = !empty($tokenparams['scope']) ? $tokenparams['scope'] : $this->config->oidcscope;
$tokenrec->authcode = $authparams['code'];
$tokenrec->token = $tokenparams['access_token'];
if (!empty($tokenparams['expires_on'])) {
$tokenrec->expiry = $tokenparams['expires_on'];
} else if (isset($tokenparams['expires_in'])) {
$tokenrec->expiry = time() + $tokenparams['expires_in'];
} else {
$tokenrec->expiry = time() + DAYSECS;
}
$tokenrec->refreshtoken = !empty($tokenparams['refresh_token']) ? $tokenparams['refresh_token'] : ''; // TBD?
$tokenrec->idtoken = $tokenparams['id_token'];
$tokenrec->id = $DB->insert_record('auth_oidc_token', $tokenrec);
return $tokenrec;
}