OAuth 2.0, les grands principes pour briller en société :
OAuth définition simple :
C'est un protocole permettant à un client
(une application tierce comme Pong) d'obtenir des autorisations d'accès à des ressources (comme des données utilisateur) sur un serveur, au nom d'un utilisateur, sans que cet utilisateur partage ses identifiants (nom d'utilisateur, mot de passe) avec l'application tierce.
Le client
(pong) demande au end-user
(les joueurs de pongs) de s'authentifier sur un Authorization Server
(Github, intra42 ou autre) pour pouvoir accéder à des resources
Étapes d'Authentification OAuth 2.0 pour "Pong" avec "Intra 42"
-
Enregistrement de l'Application "Pong" sur "Intra 42" (Client ID et Client Secret):
- "Pong" s'enregistre en tant qu'application OAuth sur le site "Intra 42" pour obtenir un
Client ID
et un Client Secret
.
-
Définition des Scopes (Portées):
- "Pong" spécifie les scopes (portées) d'accès nécessaires lorsqu'il fait la demande d'autorisation.
-
Affichage du Bouton de Connexion "Intra 42" sur l'Interface Utilisateur de "Pong":
- Sur l'interface utilisateur de "Pong", un bouton "Se connecter avec Intra 42" est affiché.
-
Redirection vers le Serveur d'Autorisation "Intra 42":
- L'utilisateur est redirigé vers la page d'authentification "Intra 42" où il doit se connecter avec ses identifiants Intra 42.
-
Demande d'Autorisation:
- Une fois connecté, "Intra 42" demande à l'utilisateur d'autoriser l'application "Pong" à accéder aux informations spécifiées.
-
Redirection avec le Code d'Autorisation:
- Si l'utilisateur donne son consentement, "Intra 42" redirige l'utilisateur vers l'URI de redirection spécifiée par "Pong", avec un code d'autorisation.
-
Échange du Code d'Autorisation contre un Jeton d'Accès:
- "Pong" utilise le code d'autorisation reçu pour faire une demande au serveur d'autorisation "Intra 42" en échange d'un jeton d'accès.
-
Réception du Jeton d'Accès et éventuellement du Jeton de Rafraîchissement:
- Si la demande est valide, le serveur d'autorisation renvoie un jeton d'accès à "Pong". Un jeton de rafraîchissement pourrait également être retourné.
-
Stockage du Jeton d'Accès et Gestion de la Session:
- "Pong" stocke le jeton d'accès de manière sécurisée. La gestion de session est assurée pour maintenir l'état d'authentification.
-
Accès aux Ressources Protégées:
- Avec le jeton d'accès, "Pong" peut maintenant faire des requêtes à l'API "Intra 42" pour obtenir les informations du profil de l'utilisateur en fonction des scopes accordés.
-
Rafraîchissement du Jeton d'Accès (si nécessaire):
- Si le jeton d'accès expire, "Pong" peut utiliser le jeton de rafraîchissement pour obtenir un nouveau jeton d'accès sans demander à l'utilisateur de se reconnecter.
Github
tout est dit ici :
https://docs.github.com/fr/apps/oauth-apps/building-oauth-apps/authorizing-oauth-apps
Pour s'identifier en utilisant OAuth2.0,
il faut rediriger les users sur : GET https://github.com/login/oauth/authorize
en précisant le client_id
de Pong,
sur quelle redirect_uri
renvoyer l'utilisateur,
quelle est lescope
de donnée auquel Pong veut accéder (photo de profil par exemple),
et state
la Chaîne aléatoire non modifiable. Elle est utilisée pour protéger contre les attaques de falsification de requête intersite.
Une fois que l'utilisateur autorise Pong à acceder à ses infos Github, Github renvoi l'utilisateur sur le redirect_uri,
et donne un code à fournir sur : POST https://github.com/login/oauth/access_token
pour avoir un access token
Accept: application/json { "access_token":"gho_16C7e42F292c6912E7710c838347Ae178B4a", "scope":"repo,gist", "token_type":"bearer" }
Ensuite, Pong utilise cet access token pour accéder aux infos du user :
Authorization: Bearer OAUTH-TOKEN GET https://api.github.com/user
Intra 42
https://api.intra.42.fr/apidoc
My API UID and my API SECRETfor 42 OAuth :
https://profile.intra.42.fr/oauth/applications/18653
Once the APP UI and APP SECRET are store securely on the app server,
the app needs to get a token to OAuth42 service :
➜ ~ curl -X POST --data "grant_type=client_credentials&client_id=MY_AWESOME_UID&client_secret=MY_AWESOME_SECRET" https://api.intra.42.fr/oauth/token
Response :
{
"access_token":"...",
"token_type":"bearer",
"expires_in":7200,
"scope":"public",
"created_at":1703442552,
"secret_valid_until":1705860153
}
https://api.intra.42.fr/apidoc/2.0/users/show.html
curl -H "Authorization: Bearer YOUR_ACCESS_TOKEN" "https://api.intra.42.fr/v2/users/USER_ID"
The USER_ID can be the login (alevra) or number linked to this specific user (in my case 115866)
The JSON response of 42 :
[...]
"image": {
"link": "https://cdn.intra.42.fr/users/1234567890/andre.jpg",
"versions": {
"large": "https://cdn.intra.42.fr/users/1234567890/large_andre.jpg",
"medium": "https://cdn.intra.42.fr/users/1234567890/medium_andre.jpg",
"small": "https://cdn.intra.42.fr/users/1234567890/small_andre.jpg",
"micro": "https://cdn.intra.42.fr/users/1234567890/micro_andre.jpgg"
}
},
[...]