Login OAuth com Casdoor via DingTalk, WeCom, Lark, Infoflow e WeChat
O Casdoor possui provedores OAuth integrados para DingTalk, WeCom (WeChat Work), Lark (Feishu), Baidu Infoflow e WeChat. Você cria um aplicativo no console de desenvolvedor de cada fornecedor, cola suas credenciais em um provedor do Casdoor e adiciona o provedor à sua aplicação. O Casdoor executa o fluxo do fornecedor (escaneamento de QR code no desktop ou login dentro do próprio cliente do fornecedor), obtém o token de acesso corporativo onde o fornecedor exige um, e mapeia o ID de usuário do fornecedor para um usuário do Casdoor. Sua aplicação apenas conversa via OIDC com o Casdoor e nunca vê um cabeçalho do DingTalk, um user_ticket do WeCom ou um unionid do WeChat. Para DingTalk, WeCom e Lark, um sincronizador também pode importar todo o diretório da organização antes do primeiro login.
Visão geral
| Provedor | Aplicativo que você cria | Onde os usuários fazem login | ID que vincula o usuário do Casdoor | E-mail e telefone | Sincronizador de diretório |
|---|---|---|---|---|---|
| DingTalk | Aplicativo interno (AppKey, AppSecret) | Página de login do DingTalk, login.dingtalk.com | openId; unionid torna-se o nome de usuário | Do perfil, substituído pelo diretório corporativo; tratado como verificado | Sim |
| WeCom | Aplicativo autoconstruído (CorpID, Secret, AgentId) ou de terceiros | Login na web (QR code ou login rápido do desktop WeCom) ou login silencioso dentro do WeCom | userid (interno), open_userid (terceiros) | E-mail apenas com snsapi_privateinfo; telefone não lido | Sim |
| Lark / Feishu | Aplicativo personalizado (App ID, App Secret) | Página de login do Lark, Feishu ou Lark global | open_id; o nome de usuário é user_id, senão union_id, senão open_id | Sim, se o aplicativo tiver as permissões de contato | Sim |
| Baidu Infoflow | Aplicativo interno (CorpID, Secret, AgentID) | Página de autorização do Infoflow | userid, também o nome de usuário | Não | |
| Aplicativo de site na Open Platform, além de uma Official Account | Escaneamento de QR code no PC; dentro do navegador WeChat através da Official Account | unionid, senão openid | Nenhum | Não |
As etapas de configuração para cada um estão na documentação: DingTalk, WeCom, Lark, Infoflow e WeChat. Este post explica o que acontece por trás de cada um.
O que sua aplicação vê
Todos os provedores na tabela terminam da mesma forma. O Casdoor troca o código do fornecedor, encontra ou cria o usuário na organização e então emite seu próprio código de autorização para sua aplicação. Sua aplicação resgata esse código no endpoint de token do Casdoor e recebe um token de ID do Casdoor e um token de acesso, assinados com o certificado da aplicação. As claims vêm do registro do usuário do Casdoor: nome, nome de exibição, e-mail, telefone, avatar, grupos.
Seu código backend é o mesmo para todos os cinco. Qualquer biblioteca OIDC funciona; veja a referência de OAuth 2.0 e OIDC e, para um passo a passo completo, SSO Spring Boot com OIDC. Se você precisar da API própria do fornecedor mais tarde, o Casdoor armazena o token de acesso do provedor no usuário, conforme descrito em Provedores OAuth.
DingTalk
Crie um aplicativo interno na DingTalk Open Platform e copie seu AppKey e AppSecret para o Client ID e Client secret do provedor. A página de login envia o usuário para https://login.dingtalk.com/oauth2/auth com scope=openid e prompt=login consent. Depois que o usuário confirma, o Casdoor faz quatro chamadas:
POST https://api.dingtalk.com/v1.0/oauth2/userAccessTokentransforma o código em um token de acesso de usuário.GET https://api.dingtalk.com/v1.0/contact/users/meretorna oopenId,unionId, apelido, avatar, e-mail e celular do usuário. Isso requer a permissão Contact.User.Read no aplicativo.POST https://api.dingtalk.com/v1.0/oauth2/accessTokencomappKeyeappSecretretorna o token de acesso corporativo (do app).- Com esse token,
topapi/user/getbyunionidmapeia ounionidpara ouseridcorporativo, etopapi/v2/user/getlê o registro do diretório.
Se o usuário não for membro da organização que possui o aplicativo, a etapa 4 falha com o erro 60121 do DingTalk e o login é interrompido. Se a busca no diretório for bem-sucedida, o e-mail e o celular do diretório substituem os pessoais, o unionid torna-se o nome de usuário e o cargo é mantido como uma claim extra.
O token de acesso corporativo e seu cabeçalho
O DingTalk tem duas gerações de API que aceitam o mesmo token em lugares diferentes:
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>"}
A nova API em api.dingtalk.com lê o token apenas do cabeçalho x-acs-dingtalk-access-token. Chame-a sem esse cabeçalho (ou com Authorization: Bearer) e ela responderá AuthenticationFailed.MissingParameter, nomeando o cabeçalho. Os endpoints mais antigos de oapi.dingtalk.com ainda aceitam um parâmetro de consulta access_token. O Casdoor usa ambos: o cabeçalho para users/me, o parâmetro de consulta para as duas chamadas topapi, com o token corporativo de v1.0/oauth2/accessToken nos dois lugares. O DingTalk documenta que esse token é válido por 7.200 segundos e pede que os chamadores o armazenem em cache por aplicativo. O DingTalk também marca o endpoint antigo gettoken como legado para novos aplicativos.
O Casdoor conta o e-mail e o telefone retornados pelo DingTalk como verificados, então a regra padrão de vínculo (e-mail, depois telefone) pode anexar um login do DingTalk a um usuário existente. Veja como o Casdoor vincula contas.
WeCom (WeChat Work)
Um provedor WeCom tem um Sub type e um Method:
- Internal com Normal envia o usuário para o login web da WeCom,
login.work.weixin.qq.com/wwlogin/sso/logincomlogin_type=CorpApp. A WeCom exibe um código QR ou um login rápido com um clique quando o aplicativo desktop da WeCom está em execução e conectado. - Internal com Silent usa
open.weixin.qq.com/connect/oauth2/authorizecom oagentiddo aplicativo. Esta é a opção a ser usada para páginas abertas dentro do cliente WeCom. - Third-party usa
login_type=ServiceAppe o segredo do provedor de serviços (get_provider_token), depoisget_login_info, e vincula o usuário peloopen_userid.
Para aplicativos internos, o Casdoor obtém o token corporativo de cgi-bin/gettoken com o CorpID e o Secret do aplicativo, depois troca o código pelo userid do membro. Um visitante que não é membro retorna com um openid em vez disso, e o Casdoor rejeita o login. O token é um parâmetro de consulta em cada chamada à WeCom; a WeCom diz que ele normalmente dura 7.200 segundos e que gettoken tem limite de taxa.
O endereço de e-mail é a parte a ser planejada. A WeCom deixou de retornar avatar, gênero, celular e e-mail da API de leitura de membros (user/get) para aplicativos autoconstruídos criados após as 20:00 do dia 20-06-2022. Para obter o e-mail, defina o escopo do provedor como snsapi_privateinfo. A WeCom então retorna um user_ticket, que o Casdoor resgata em getuserdetail. A WeCom exige que o administrador selecione os campos sensíveis nas configurações do aplicativo e que o membro consinta, e nunca fornece esses campos para aplicativos de terceiros. O Casdoor não lê o número de telefone da WeCom.
Lark e Feishu
Crie um aplicativo personalizado na Feishu Open Platform ou na plataforma global Lark e copie o App ID e o App Secret. Ative Use global endpoint no provedor para Lark (open.larksuite.com); deixe desativado para Feishu (open.feishu.cn).
O Casdoor primeiro obtém um tenant_access_token de auth/v3/tenant_access_token/internal, depois envia o código para authen/v1/access_token com esse token em um cabeçalho Authorization: Bearer. A resposta contém open_id, union_id, user_id, e-mail, e-mail corporativo e celular. A Feishu retorna os dados sensíveis apenas quando o aplicativo possui a permissão correspondente:
| Campo | Permissão da Feishu |
|---|---|
user_id | contact:user.employee_id:readonly |
email | contact:user.email:readonly |
enterprise_email | contact:user.employee:readonly |
mobile | contact:user.phone:readonly |
Sem elas, o login ainda funciona: o nome de usuário recua de user_id para union_id para open_id. O Casdoor usa enterprise_email quando email está vazio e trata tanto o e-mail quanto o telefone como verificados. A Feishu agora lista o endpoint access_token da v1 como uma versão histórica, mas ele ainda é servido.
Baidu Infoflow
Infoflow (如流) é o aplicativo corporativo da Baidu. Registre um aplicativo no admin do Infoflow, conceda-lhe permissões de diretório de endereços e copie o CorpID, Secret e AgentID para o provedor com o subtipo Internal. A página de login vai para https://xpc.im.baidu.com/oauth2/authorize. O Casdoor então chama qy.im.baidu.com/api/gettoken com o CorpID e Secret, troca o código e o AgentID pelo userid do membro em api/user/getuserinfo, e lê nome, avatar e e-mail de api/user/get. O userid se torna tanto o ID vinculado quanto o nome de usuário, e o e-mail conta como verificado. Não há sincronizador do Infoflow, então os usuários são criados no primeiro login.
Início de sessão WeChat
O login do WeChat tem duas partes, e você geralmente precisa de ambas:
- Subtipo Web: um aplicativo de site na WeChat Open Platform. A página de login para PC mostra um código QR de
open.weixin.qq.com/connect/qrconnectcomscope=snsapi_login; o usuário o escaneia com o aplicativo WeChat. - Subtipo Mobile, ou o segundo par de credenciais do mesmo provedor: uma Official Account. Dentro do navegador do WeChat, um código QR é inútil, então o Casdoor muda para
connect/oauth2/authorizecomsnsapi_userinfoe o AppID da Official Account. Se nenhuma Official Account estiver configurada, o Casdoor informa ao usuário para abrir a página em um navegador externo.
O WeChat não retorna e-mail ou telefone, apenas openid, unionid, apelido e avatar. O Casdoor vincula o usuário pelo unionid quando o WeChat envia um, recuando para openid, e também armazena o openid específico do aplicativo. O WeChat fornece ao usuário o mesmo unionid em todos os aplicativos e Official Accounts sob uma única conta da Open Platform, então vincule seu aplicativo de site e sua Official Account à mesma conta da Open Platform. Caso contrário, um usuário que escaneia no PC e depois faz login no celular se torna dois usuários do Casdoor.
Importando o diretório primeiro
Para DingTalk, WeCom e Lark, um syncer pode puxar usuários e departamentos em um cronograma, para que as contas existam antes que alguém faça login e os departamentos se tornem grupos do Casdoor. Cada um usa um token corporativo da API de diretório do fornecedor: o DingTalk syncer percorre os departamentos recursivamente, o WeCom syncer recua para user/list_id e user/get para aplicativos criados após 15-08-2022, e o Lark syncer tem uma configuração Lark platform para escolher Feishu ou Lark global.
O syncer da WeCom escreve o userid pelo qual o provedor da WeCom vincula, então os usuários sincronizados fazem login diretamente. Os syncers do DingTalk e da Lark armazenam o userid / user_id do diretório, enquanto o login vincula por openId / open_id. Seu primeiro login corresponde através da regra de vinculação por e-mail ou telefone, o que funciona porque ambos os provedores relatam esses como verificados.
Login via QR code e recuperação de conta
O login por QR transfere o problema da senha para o celular: se um usuário perder sua conta WeChat ou DingTalk, ele não poderá escanear. Como cada uma dessas identidades está vinculada a um usuário Casdoor, em vez de ser o próprio usuário, ele ainda pode fazer login com um código de verificação ou redefinir a senha através do fluxo de esquecimento de senha, desde que a aplicação tenha um provedor de e-mail ou SMS e o usuário tenha um endereço cadastrado. O DingTalk e o Lark preenchem isso automaticamente pelo diretório; para o WeChat, solicite um número de telefone no cadastro. Para exibir mais de uma dessas opções na página, consulte métodos de login.
Referências
- DingTalk: obter um token de usuário (
userAccessToken,expireIn7200): https://open.dingtalk.com/document/isvapp-server/obtain-user-token - DingTalk: obter o token de acesso de um aplicativo interno: https://open.dingtalk.com/document/development/obtain-orgapp-token
- DingTalk: obter informações pessoais do usuário: https://open.dingtalk.com/document/orgapp-server/tutorial-obtaining-user-personal-information
- WeCom: obter access_token: https://developer.work.weixin.qq.com/document/path/91039
- WeCom: componente de login web (
wwlogin/sso/login): https://developer.work.weixin.qq.com/document/path/98152 - WeCom: construir o link OAuth e os scopes: https://developer.work.weixin.qq.com/document/path/91022
- WeCom: obter informações sensíveis do membro (
getuserdetail): https://developer.work.weixin.qq.com/document/path/95833 - WeCom: ler membro (mudança de campo de 2022-06-20): https://developer.work.weixin.qq.com/document/path/90196
- Feishu: obter user_access_token (v1) e permissões de campo: https://open.feishu.cn/document/server-docs/authentication-management/access-token/create-2
- WeChat: login de app de site: 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
- Provedores Casdoor: https://github.com/casdoor/casdoor/tree/master/idp