Utiliser la connexion à Github pour s'identifier sur son site
Posté le 14/03/2022 - dev - Lien permanent
Et pourquoi pas s'éviter de coder une page de login complète, les tables relationnelles qui vont avec et bien sûr la page de création de compte avec tous les champs d'utilisateurs habituels ? Et par là même éviter les contrôles formels même si ça s'est arrangé avec les champs formatés ?
OAuth Authorizations, c'est justement se reposer sur le signup/sign in des autres. On peut se connecter aux serveurs des GAFAM, je préfère Github, bien qu'il ait été racheté par Microsoft. L'idée, c'est donc moins de code, mais aussi aucun stockage des données sensibles à commencer par le mot de passe de l'utilisateur. En temps normal on le stocke en base, en clair (pas bien) ou en chiffré (md5, sha256, salt, etc).
Voici en PHP un script complet avec les 3 étapes attendues :
//get request , either code from github, or login request
if($_SERVER['REQUEST_METHOD'] == 'GET')
{
//authorised at github
if(isset($_GET['code']))
{
//2. Users are redirected back to your site by GitHub
$ch = curl_init();
//exemple de user_agent : User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1521.3 Safari/537.36'
curl_setopt($ch, CURLOPT_URL, 'https://github.com/login/oauth/access_token');
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept: application/json', 'User-Agent: PHP'));
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, array('client_id' => GITHUB_client_id, 'client_secret' => GITHUB_your_client_secret, 'code' => $_GET['code']));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
if (curl_errno($ch)) die('erreur github : ' . curl_error($ch));
$token_data = json_decode($response , true);
//3. Use the access token to access the API
curl_setopt($ch, CURLOPT_URL, 'https://api.github.com/user');
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: token ' . $token_data['access_token'], 'User-Agent: PHP'));
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
if (curl_errno($ch)) die('erreur github : ' . curl_error($ch));
curl_close($ch);
$user_data = json_decode($response , true);
//FAIRE ici les enregistrements (session, cookie) ou redirections car on est autorisés
//Utilisez $user_data['login'], $user_data['email'], etc
exit();
}
else
{
//1. Request a user's GitHub identity
//demande des données du user en lecture seule
header('Location: https://github.com/login/oauth/authorize?client_id=' . GITHUB_client_id . '&redirect_uri=' . GITHUB_redirect_url . '&scope=read:user');
}
}
Quelques liens intéressants :
- la doc Github pour se connecter avec Oauth app
- des explications en français sur Curl
- le manuel Curl en PHP
- La dépréciation de certaines connexion chez Github