Connexion OAuth avec Casdoor via DingTalk, WeCom, Lark, Infoflow et WeChat
Casdoor intègre des fournisseurs OAuth pour DingTalk, WeCom (WeChat Work), Lark (Feishu), Baidu Infoflow et WeChat. Vous créez une application dans la console développeur de chaque éditeur, collez ses identifiants dans un fournisseur Casdoor, puis ajoutez ce fournisseur à votre application. Casdoor exécute le flux de l'éditeur (scan de QR code sur ordinateur, ou connexion au sein du client même de l'éditeur), récupère le jeton d'accès d'entreprise lorsque l'éditeur l'exige, et associe l'identifiant utilisateur de l'éditeur à un utilisateur Casdoor. Votre application ne communique qu'en OIDC avec Casdoor et ne voit jamais un en-tête DingTalk, un user_ticket WeCom ni un unionid WeChat. Pour DingTalk, WeCom et Lark, un synchroniseur peut également importer tout l'annuaire de l'organisation avant la première connexion.
En un coup d'œil
| Fournisseur | Application créée | Où les utilisateurs se connectent | Identifiant reliant l'utilisateur Casdoor | E-mail et téléphone | Synchroniseur d'annuaire |
|---|---|---|---|---|---|
| DingTalk | Application interne (AppKey, AppSecret) | Page de connexion DingTalk, login.dingtalk.com | openId ; unionid devient le nom d'utilisateur | Issus du profil, remplacés par ceux de l'annuaire d'entreprise ; considérés comme vérifiés | Oui |
| WeCom | Application auto-hébergée (CorpID, Secret, AgentId), ou tierce | Connexion web (QR, ou connexion rapide depuis le bureau WeCom) ou connexion silencieuse dans WeCom | userid (interne), open_userid (tierce) | E-mail uniquement avec snsapi_privateinfo ; téléphone non lu | Oui |
| Lark / Feishu | Application personnalisée (App ID, App Secret) | Page de connexion Lark, Feishu ou Lark global | open_id ; le nom d'utilisateur est user_id, sinon union_id, sinon open_id | Oui, si l'application dispose des permissions de contact | Oui |
| Baidu Infoflow | Application interne (CorpID, Secret, AgentID) | Page d'autorisation Infoflow | userid, qui sert aussi de nom d'utilisateur | Non | |
| Application site web sur la plateforme ouverte, plus un compte officiel | Scan de QR code sur PC ; dans le navigateur WeChat via le compte officiel | unionid, sinon openid | Ni l'un ni l'autre | Non |
Les étapes de configuration sont détaillées dans la documentation : DingTalk, WeCom, Lark, Infoflow et WeChat. Cet article explique ce qui se passe en coulisses pour chacun.
Ce que voit votre application
Chaque fournisseur du tableau se termine de la même manière. Casdoor échange le code de l'éditeur, trouve ou crée l'utilisateur dans l'organisation, puis émet son propre code d'autorisation vers votre application. Votre application l'échange sur le point d'accès aux jetons de Casdoor et obtient un jeton d'identité et un jeton d'accès Casdoor, signés avec le certificat de l'application. Les claims proviennent de l'enregistrement utilisateur Casdoor : nom, affichage du nom, e-mail, téléphone, avatar, groupes.
Le code de votre backend est le même pour les cinq fournisseurs. Toute bibliothèque OIDC fonctionne ; consultez la référence OAuth 2.0 et OIDC et, pour un guide complet, SSO Spring Boot avec OIDC. Si vous avez besoin ultérieurement de l'API propre à l'éditeur, Casdoor stocke le jeton d'accès du fournisseur sur l'utilisateur, comme décrit dans Fournisseurs OAuth.
DingTalk
Créez une application interne sur la plateforme ouverte DingTalk et copiez son AppKey et son AppSecret dans les champs Client ID et Client secret du fournisseur. La page de connexion redirige l'utilisateur vers https://login.dingtalk.com/oauth2/auth avec scope=openid et prompt=login consent. Après confirmation par l'utilisateur, Casdoor effectue quatre appels :
POST https://api.dingtalk.com/v1.0/oauth2/userAccessTokenconvertit le code en jeton d'accès utilisateur.GET https://api.dingtalk.com/v1.0/contact/users/merenvoie l'openId, l'unionId, le pseudo, l'avatar, l'e-mail et le numéro de mobile de l'utilisateur. Cela nécessite la permission Contact.User.Read sur l'application.POST https://api.dingtalk.com/v1.0/oauth2/accessTokenavecappKeyetappSecretrenvoie le jeton d'accès d'entreprise (application).- Avec ce jeton,
topapi/user/getbyunionidassocie l'unionidà l'useridd'entreprise, ettopapi/v2/user/getlit l'enregistrement dans l'annuaire.
Si l'utilisateur n'est pas membre de l'organisation propriétaire de l'application, l'étape 4 échoue avec l'erreur DingTalk 60121 et la connexion s'arrête. Si la recherche dans l'annuaire réussit, l'e-mail et le numéro de mobile de l'annuaire remplacent les informations personnelles, l'unionid devient le nom d'utilisateur, et le poste est conservé comme claim supplémentaire.
Le jeton d'accès d'entreprise et son en-tête
DingTalk propose deux générations d'API qui acceptent le même jeton mais à des endroits différents :
GET https://api.dingtalk.com/v1.0/contact/users/me
x-acs-dingtalk-access-token: <token>
POST https://oapi.dingtalk.com/topapi/v2/user/get?access_token=<token>
Content-Type: application/json
{"userid": "<userid>"}
La nouvelle API sur api.dingtalk.com lit le jeton uniquement depuis l'en-tête x-acs-dingtalk-access-token. Appelez-la sans cet en-tête (ou avec Authorization: Bearer) et elle répond AuthenticationFailed.MissingParameter, en nommant l'en-tête requis. Les points d'accès plus anciens sur oapi.dingtalk.com acceptent encore un paramètre de requête access_token. Casdoor utilise les deux : l'en-tête pour users/me, le paramètre de requête pour les deux appels topapi, avec le jeton d'entreprise issu de v1.0/oauth2/accessToken dans les deux cas. DingTalk documente ce jeton comme valide pendant 7 200 secondes et demande aux appelants de le mettre en cache par application. DingTalk marque également l'ancien point d'accès gettoken comme obsolète pour les nouvelles applications.
Casdoor considère comme vérifiés l'e-mail et le téléphone renvoyés par DingTalk, afin que la règle de liaison par défaut (e-mail, puis téléphone) puisse associer une connexion DingTalk à un utilisateur existant. Voir comment Casdoor lie les comptes.
WeCom (WeChat Work)
Un fournisseur WeCom possède un champ Sub type et un champ Method :
- Internal avec Normal renvoie l'utilisateur vers la connexion web de WeCom,
login.work.weixin.qq.com/wwlogin/sso/loginaveclogin_type=CorpApp. WeCom affiche un code QR, ou une connexion rapide en un clic lorsque le bureau WeCom est ouvert et connecté. - Internal avec Silent utilise
open.weixin.qq.com/connect/oauth2/authorizeavec l'agentidde l'application. C'est l'option à utiliser pour les pages ouvertes dans le client WeCom. - Third-party utilise
login_type=ServiceAppet le secret du fournisseur de services (get_provider_token), puisget_login_info, et lie l'utilisateur viaopen_userid.
Pour les applications internes, Casdoor obtient le jeton d'entreprise depuis cgi-bin/gettoken avec le CorpID et le Secret de l'application, puis échange le code contre le userid du membre. Un visiteur qui n'est pas membre revient avec un openid à la place, et Casdoor rejette la connexion. Le jeton est un paramètre de requête sur chaque appel WeCom ; WeCom indique qu'il dure normalement 7 200 secondes et que gettoken est limité par débit.
L'adresse e-mail est l'élément à prévoir. WeCom a cessé de renvoyer l'avatar, le genre, le mobile et l'e-mail depuis l'API de lecture des membres (user/get) pour les applications auto-construites créées après 20:00 le 2022-06-20. Pour obtenir l'e-mail, définissez la portée du fournisseur sur snsapi_privateinfo. WeCom renvoie alors un user_ticket, que Casdoor échange auprès de getuserdetail. WeCom exige que l'administrateur sélectionne les champs sensibles dans les paramètres de l'application et que le membre donne son consentement, et ne fournit jamais ces champs aux applications tierces. Casdoor ne lit pas le numéro de téléphone depuis WeCom.
Lark et Feishu
Créez une application personnalisée sur la Feishu Open Platform ou la plateforme globale Lark et copiez l'App ID et l'App Secret. Activez Use global endpoint dans le fournisseur pour Lark (open.larksuite.com) ; laissez-le désactivé pour Feishu (open.feishu.cn).
Casdoor obtient d'abord un tenant_access_token depuis auth/v3/tenant_access_token/internal, puis poste le code sur authen/v1/access_token avec ce jeton dans un en-tête Authorization: Bearer. La réponse contient open_id, union_id, user_id, l'e-mail, l'e-mail professionnel et le mobile. Feishu ne renvoie les données sensibles que si l'application possède la permission correspondante :
| Champ | Permission Feishu |
|---|---|
user_id | contact:user.employee_id:readonly |
email | contact:user.email:readonly |
enterprise_email | contact:user.employee:readonly |
mobile | contact:user.phone:readonly |
Sans eux, la connexion fonctionne toujours : le nom d'utilisateur se replie de user_id vers union_id puis open_id. Casdoor utilise enterprise_email lorsque email est vide et considère l'e-mail et le téléphone comme vérifiés. Feishu liste désormais l'endpoint access_token v1 comme version historique, mais il est toujours servi.
Baidu Infoflow
Infoflow (如流) est l'application professionnelle de Baidu. Enregistrez une application dans l'administration Infoflow, donnez-lui des permissions d'annuaire, et copiez le CorpID, le Secret et l'AgentID dans le fournisseur avec le sous-type Internal. La page de connexion pointe vers https://xpc.im.baidu.com/oauth2/authorize. Casdoor appelle ensuite qy.im.baidu.com/api/gettoken avec le CorpID et le Secret, échange le code et l'AgentID contre le userid du membre sur api/user/getuserinfo, et lit le nom, l'avatar et l'e-mail depuis api/user/get. Le userid devient à la fois l'ID lié et le nom d'utilisateur, et l'e-mail est considéré comme vérifié. Il n'y a pas de synchroniseur Infoflow, donc les utilisateurs sont créés lors de la première connexion.
WeChat
La connexion WeChat comporte deux volets, et vous avez généralement besoin des deux :
- Sous-type Web : une application de site web sur la WeChat Open Platform. La page de connexion PC affiche un code QR depuis
open.weixin.qq.com/connect/qrconnectavecscope=snsapi_login; l'utilisateur le scanne avec l'application WeChat. - Sous-type Mobile, ou la deuxième paire d'identifiants du même fournisseur : un Compte Officiel. Dans le navigateur WeChat, un code QR est inutile, donc Casdoor bascule sur
connect/oauth2/authorizeavecsnsapi_userinfoet l'AppID du Compte Officiel. Si aucun Compte Officiel n'est configuré, Casdoor demande à l'utilisateur d'ouvrir la page dans un navigateur externe.
WeChat ne renvoie ni e-mail ni téléphone, seulement openid, unionid, surnom et avatar. Casdoor lie l'utilisateur via unionid lorsque WeChat en envoie un, se repliant sur openid, et stocke également l'openid spécifique à l'application. WeChat donne à un utilisateur le même unionid pour toutes les applications et Comptes Officiels sous un seul compte Open Platform, donc liez votre application de site web et votre Compte Officiel au même compte Open Platform. Sinon, un utilisateur qui scanne sur un PC puis se connecte sur un téléphone deviendra deux utilisateurs Casdoor.
Importer l'annuaire d'abord
Pour DingTalk, WeCom et Lark, un synchroniseur peut importer les utilisateurs et les départements selon un calendrier, afin que les comptes existent avant que quiconque se connecte et que les départements deviennent des groupes Casdoor. Chacun utilise un jeton d'entreprise provenant de l'API d'annuaire du fournisseur : le synchroniseur DingTalk parcourt les départements récursivement, le synchroniseur WeCom se replie sur user/list_id et user/get pour les applications créées après le 2022-08-15, et le synchroniseur Lark dispose d'un paramètre Lark platform pour choisir entre Feishu ou Lark global.
Le synchroniseur WeCom écrit le userid par lequel le fournisseur WeCom effectue la liaison, afin que les utilisateurs synchronisés se connectent directement. Les synchroniseurs DingTalk et Lark stockent le userid / user_id de l'annuaire, tandis que la connexion lie via openId / open_id. Leur première connexion correspond via la règle de liaison sur l'e-mail ou le téléphone à la place, ce qui fonctionne parce que les deux fournisseurs signalent ceux-ci comme vérifiés.
Connexion QR et récupération de compte
La connexion par QR code déplace le problème du mot de passe vers le téléphone : si un utilisateur perd son compte WeChat ou DingTalk, il ne peut pas scanner. Comme chacune de ces identités est liée à un utilisateur Casdoor plutôt que d'être l'utilisateur lui-même, ce dernier peut toujours se connecter avec un code de vérification ou réinitialiser son mot de passe via le flux de récupération de mot de passe, tant que l'application dispose d'un fournisseur d'e-mails ou de SMS et que l'utilisateur a une adresse enregistrée. DingTalk et Lark remplissent cette information depuis l'annuaire ; pour WeChat, demandez un numéro de téléphone lors de l'inscription. Pour afficher plusieurs de ces options sur la page, consultez les méthodes de connexion.
Références
- DingTalk : obtenir un jeton utilisateur (
userAccessToken,expireIn7200) : https://open.dingtalk.com/document/isvapp-server/obtain-user-token - DingTalk : obtenir le jeton d'accès d'une application interne : https://open.dingtalk.com/document/development/obtain-orgapp-token
- DingTalk : obtenir les informations personnelles d'un utilisateur : https://open.dingtalk.com/document/orgapp-server/tutorial-obtaining-user-personal-information
- WeCom : obtenir access_token : https://developer.work.weixin.qq.com/document/path/91039
- WeCom : composant de connexion web (
wwlogin/sso/login) : https://developer.work.weixin.qq.com/document/path/98152 - WeCom : construire le lien OAuth et les scopes : https://developer.work.weixin.qq.com/document/path/91022
- WeCom : obtenir les informations sensibles des membres (
getuserdetail) : https://developer.work.weixin.qq.com/document/path/95833 - WeCom : lire les données d'un membre (changement de champ du 20-06-2022) : https://developer.work.weixin.qq.com/document/path/90196
- Feishu : obtenir user_access_token (v1) et permissions de champs : https://open.feishu.cn/document/server-docs/authentication-management/access-token/create-2
- WeChat : connexion d'application web : https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login.html
- WeChat : UnionID : https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Authorized_Interface_Calling_UnionID.html
- Fournisseurs Casdoor : https://github.com/casdoor/casdoor/tree/master/idp