Login da altra pagina web (con password)

Installazione, configurazione generale, notifiche, API, lingue, problemi server
Post Reply
marco987
FormaLms User
Posts: 25
Joined: Wed Oct 07, 2020 11:34 am
Version: forma.lms 2.3

Login da altra pagina web (con password)

Post by marco987 »

Salve. Ho provato con successo la generazione del link che permette il SSO. Ottimo. Ma c'è un passaggio ulteriore che vorrei compiere. La generazione del link SSO non tiene conto della password dell'utente ma solo del nome utente. Invece io vorrei poter verificare anche la password prima. Vorrei fare una cosa del genere:
Dalla pagina web "sito.it/login_forma" l'utente compila i due campi nome utente e password (naturalmente sto parlando di un utente già registrato e che già conosce nome utente e password). In backend voglio prima verificare che la password inserita corrisponda a quella in database e poi generare il link per il SSO.
È possibile? È una buona soluzione? Me ne sfugge una più semplice? L'esigenza nasce dalla necessità di avere una pagina di login del tutto personalizzata con implementazione di altre funzioni, cosa che non posso fare nella pagina di login di FormaLMS.
Grazie
Marco
Web Developer

alfa24
Senior Boarder
Posts: 1005
Joined: Fri Nov 24, 2017 8:45 am
Version: forma.lms 1.4.2

Re: Login da altra pagina web (con password)

Post by alfa24 »

Non puoi usare SSO.
Devi implementare un form di login con il token di autenticazione (si chiama authentic_request) di Forma.
I'm Jasmines, the One. If you need, you can contact me.

marco987
FormaLms User
Posts: 25
Joined: Wed Oct 07, 2020 11:34 am
Version: forma.lms 2.3

Re: Login da altra pagina web (con password)

Post by marco987 »

Grazie. Scaturiscono due domande (la prima già era implicita nel post originale):
1) È possibile verificare la corrispondenza fra password inserita e password in database?
2) Cos'è il "token di autenticazione di Forma"? Come lo genero? È lo stesso che si genera per le SSO? E come si usa?
Marco
Web Developer

marco987
FormaLms User
Posts: 25
Joined: Wed Oct 07, 2020 11:34 am
Version: forma.lms 2.3

Re: Login da altra pagina web (con password)

Post by marco987 »

Risposta alla domanda 1: Sì.
$userPassword è la password inserita dall'utente nel login
$hashedPassowrd è la password memorizzata in database

Code: Select all

if (password_verify($userPassword, $hashedPassword)) {
    echo "Accesso effettuato con successo";
}
Marco
Web Developer

marco987
FormaLms User
Posts: 25
Joined: Wed Oct 07, 2020 11:34 am
Version: forma.lms 2.3

Re: Login da altra pagina web (con password)

Post by marco987 »

A beneficio dei posteri, ecco il codice per verificare che esista l'utente e che la password sia corretta. Verificate queste due cose avviene un redirect nella piattaforma già loggato, sfruttando il link SSO.
Nota 1: Sono uno sviluppatore alla prime armi, abbiate bontà col mio codice; accetto volentieri suggerimenti.
Nota 2: Il codice è tutto in una pagina. È preferibile comunque separare la logica dall'HTML.

Code: Select all

<?php

// Connessione al database collegato a FormaLMS
$servername = 'servername';
$username = 'username';
$db_password = 'password';
$db_name = 'dbname';

$conn = new mysqli($servername, $username, $db_password, $db_name);

if ($conn -> connect_error) {
    var_dump($conn);
    exit;
}

// core_user è la tabella dove sono memorizzati nome utente (userid) e password (pass)
$query = "SELECT userid, pass FROM core_user";

$res = $conn -> query($query);

$utenti = [];

if ($res && $res -> num_rows > 0) {
    while($row = $res -> fetch_assoc()) {
        // Ogni username contiene davanti una sbarra che va eliminata (es. /marco)
        $nomeutente = substr($row['userid'], 1);
        $utenti[$nomeutente] = $row['pass'];
    }
}

$conn->close();

?>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Login</title>
</head>
<body>

<form method="post">
    <p>Nome utente</p>
    <input type="text" name="username" required>
    <p>Password</p>
    <input type="password" name="password" required>
    <br><br>
    <button type="submit">Login</button>
</form>
<br>

<?php

    session_start();

    $username_inserito = "";
    $password_inserita = "";

    if (isset($_POST['username']) && isset($_POST['password'])) {

        $username_inserito = $_POST['username'];
        $password_inserita = $_POST['password'];

        $n = 0;
        foreach ($utenti as $utente => $password) {
            if ($username_inserito == $utente) {
                $n++;
                if (password_verify($password_inserita, $password)) {
                    $time = time();
                    $key = "key_impostata_su_forma";
                    $token = md5(strtolower($utente . ',' . $time . ',' . $key));
                    $link = "http://sitoFormaLMS.it/index.php?r=adm/homepage/sso&login_user=".$username."&time=".$time."&token=".$token;
                    // Redirect attraverso il link SSO
                    header("Location: " . $link);
                    exit;
                } else {
                    $_SESSION['msg'] = "La password inserita non è corretta";
                    header("Location: /file_attuale.php");
                    exit;
                }
            }
        }
        if ($n == 0) {
            $_SESSION['msg'] = "Utente non trovato";
            header("Location: /file_attuale.php");
            exit;
        }
    }

    if (isset($_SESSION['msg'])) {
        echo $_SESSION['msg'];
        unset($_SESSION['msg']);
    }
?>
    
</body>
</html>
Marco
Web Developer

alfa24
Senior Boarder
Posts: 1005
Joined: Fri Nov 24, 2017 8:45 am
Version: forma.lms 1.4.2

Re: Login da altra pagina web (con password)

Post by alfa24 »

Al caricamento della pagina ti tiri giù l'intera tabella degli utenti e al submit li verifichi TUTTI...
Non avevo capito cosa volevi fare, ma a questo punto ti converrebbe implementare una API ad hoc.

Qualcosa del tipo:

Code: Select all

public function checkUserPwd($user, $passwd)
    {
		$result = false;

$query = "SELECT * FROM %adm_user WHERE userid = '".$this->aclManager->absoluteId($user)."'";
		$res = $this->db->query($query);

		if($this->db->num_rows($res) > 0) {
            $row = $this->db->fetch_obj($res);
			if ($this->aclManager->password_verify_update($passwd,$row->pass,$row->idst)){
        $result = true;}
    }
return $result;
}
I'm Jasmines, the One. If you need, you can contact me.

Post Reply