The Elearning Community • Login da altra pagina web (con password)
Page 1 of 1

Login da altra pagina web (con password)

Posted: Thu Oct 22, 2020 12:32 pm
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

Re: Login da altra pagina web (con password)

Posted: Thu Oct 22, 2020 12:57 pm
by alfa24
Non puoi usare SSO.
Devi implementare un form di login con il token di autenticazione (si chiama authentic_request) di Forma.

Re: Login da altra pagina web (con password)

Posted: Thu Oct 22, 2020 1:18 pm
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?

Re: Login da altra pagina web (con password)

Posted: Thu Oct 22, 2020 1:36 pm
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";
}

Re: Login da altra pagina web (con password)

Posted: Fri Oct 23, 2020 12:22 pm
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>

Re: Login da altra pagina web (con password)

Posted: Fri Oct 23, 2020 12:55 pm
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;
}

This site uses cookies.

Some of the cookies we use are essential for parts of the site to operate and have already been set. We also use Google Analytics scripts, which all use cookies.
You may delete or block all cookies from this site in your browser options.