🔐 Autenticazione SSO LinkedIn – Flusso Personalizzato Masticationpedia
Questa guida documenta l’intero flusso di login con LinkedIn su Masticationpedia, realizzato senza estensioni MediaWiki instabili. Il sistema è basato su tre file PHP custom nella cartella `/oauth/`, e consente il login diretto dopo autenticazione LinkedIn, usando come chiave primaria l'`ID LinkedIn (sub)`.
📁 Struttura directory
Inserire i seguenti file nella cartella del server:
/var/www/html/masticationpedia-staging/oauth/
Contenuti da inserire:
linkedin-login.php
linkedin-callback.php
create_mw_user_direct.php
🔁 Redirect URL nella App Developer di LinkedIn
Nel pannello sviluppatori LinkedIn (https://www.linkedin.com/developers/):
- Vai su → Products → "Sign in with LinkedIn"
- Inserisci come redirect ufficiale:
https://staging.masticationpedia.org/oauth/linkedin-callback.php
🧠 Flusso in sintesi
1. L’utente clicca "Login con LinkedIn" e apre `linkedin-login.php` 2. LinkedIn autentica l’utente → ritorna su `linkedin-callback.php` con `code` 3. Il server ottiene l’access token e i dati utente (nome, email, ID) 4. I dati vengono salvati in `$_SESSION` 5. Il file `create_mw_user_direct.php` crea e logga l’utente direttamente in MediaWiki
---
📜 Codice: linkedin-login.php
```php <?php session_start(); $client_id = 'TUO_CLIENT_ID'; $redirect_uri = 'https://staging.masticationpedia.org/oauth/linkedin-callback.php';
$linkedin_auth_url = 'https://www.linkedin.com/oauth/v2/authorization?' . http_build_query([
'response_type' => 'code', 'client_id' => $client_id, 'redirect_uri' => $redirect_uri, 'scope' => 'r_liteprofile r_emailaddress'
]);
header('Location: ' . $linkedin_auth_url); exit;
<?php session_start();
$client_id = 'TUO_CLIENT_ID'; $client_secret = 'TUO_CLIENT_SECRET'; $redirect_uri = 'https://staging.masticationpedia.org/oauth/linkedin-callback.php';
if (!isset($_GET['code'])) exit('Missing code.'); $code = $_GET['code'];
$token_url = 'https://www.linkedin.com/oauth/v2/accessToken'; $response = file_get_contents($token_url . '?' . http_build_query([
'grant_type' => 'authorization_code', 'code' => $code, 'redirect_uri' => $redirect_uri, 'client_id' => $client_id, 'client_secret' => $client_secret
])); $token_data = json_decode($response, true); $access_token = $token_data['access_token'] ?? null; if (!$access_token) exit('No access token.');
function getLinkedInData($url, $token) {
$opts = [ 'http' => [ 'method' => 'GET', 'header' => "Authorization: Bearer $token\r\n" ] ]; return json_decode(file_get_contents($url, false, stream_context_create($opts)), true);
}
$profile = getLinkedInData('https://api.linkedin.com/v2/me', $access_token); $emailData = getLinkedInData('https://api.linkedin.com/v2/emailAddress?q=members&projection=(elements*(handle~))', $access_token);
$sub = $profile['id'] ?? ; $name = $profile['localizedFirstName'] . ' ' . $profile['localizedLastName']; $email = $emailData['elements'][0]['handle~']['emailAddress'] ?? ;
$_SESSION['linkedin_user'] = [
'sub' => $sub, 'name' => $name, 'email' => $email
];
header('Location: /oauth/create_mw_user_direct.php'); exit;
<?php session_start(); if (!isset($_SESSION['linkedin_user'])) {
exit('No LinkedIn user in session.');
}
$userData = $_SESSION['linkedin_user']; $sub = $userData['sub']; $name = $userData['name']; $email = $userData['email'];
require_once __DIR__ . '/../includes/WebStart.php'; use MediaWiki\MediaWikiServices;
$user = User::newFromName($sub); if ($user && $user->getId()) {
$user->setCookies(); header('Location: /wiki/Main_Page'); exit;
}
$user = User::newFromName($sub); $user->addToDatabase(); $user->setEmail($email); $user->setRealName($name); $user->setToken(); $user->saveSettings();
$user->setCookies(); User::setCurrent($user);
header('Location: /wiki/Main_Page'); exit;
Roadmap funzionale del flusso SSO LinkedIn
Passaggio | File coinvolto | Azione eseguita |
---|---|---|
1 | linkedin-login.php |
Reindirizza l’utente verso la pagina di login di LinkedIn |
2 | linkedin-callback.php |
Riceve il parametro "code", lo scambia per un access_token e recupera dati profilo/email |
3 | create_mw_user_direct.php |
Crea il nuovo utente su MediaWiki (usando sub come username) o lo riconosce se già presente |
4 | MediaWiki | Mostra la pagina Main_Page con utente autenticato tramite cookie
|
🔐 Sicurezza e best practice
L’ID LinkedIn (sub) viene usato come nome utente per evitare abusi
L’email viene salvata ma non viene usata per login
Il sistema può essere potenziato in futuro con usergroups personalizzati
Per limitare accessi, si può creare una whitelist di sub ammessi (opzionale)
📌 Note finali
Il sistema è pensato per essere semplice, autonomo, stabile
Funziona anche se MediaWiki è aggiornato o spostato su un nuovo dominio
Può essere integrato con dashboard o pannelli membri approvati
🧱 Progetto curato da
Gianni Frisardi – Fondatore Masticationpedia in collaborazione con ChatGPT
---
- ✅ PROSSIMI PASSI (subito):
1. Vai su `https://staging.masticationpedia.org/wiki/SSO_LinkedIn_Personalizzato` 2. **Crea la pagina** e incolla tutto il contenuto sopra 3. Salva e usala come **documentazione interna ufficiale**
---
🎯 **Hai ora una guida completa**, documentata, funzionante, replicabile.
Se vuoi possiamo: - Aggiungere un **link rapido alla dashboard** - Inserire un **pulsante “Richiedi Accesso”** direttamente da lì - Oppure generare un PDF per conservarlo anche offline
Dimmi tu!