Olá,
hoje tentei estender a autenticação em nosso fórum para o AzureAD / O365. (Já tenho o SAML configurado para nosso AD interno, mas cada vez mais usuários estão migrando para o AzureAD).
Então, testei os 3 provedores que podem fazer isso:
e
Infelizmente, o discourse-azure-ad não fez nada — nem mesmo exibiu um botão na tela de login/registro.
O openid-connect funcionou, mas devido à natureza do endpoint do Azure para “todos os locatários” ( https://login.microsoftonline.com/organizations/v2.0/.well-known/openid-configuration ), que retorna um …/{tenantid}/… na URI para “issuer”, ele só funciona para usuários do nosso próprio locatário AzureAD/Office365 (e não para usuários de outros locatários).
Assim, o plugin Office365-Auth foi o último restante.
Ele funcionou (também para usuários de outros locatários do AzureAD), mas tinha um bug: quando o e-mail do login do AzureAD não era o e-mail principal do usuário do Discourse (já existente), o login falhava:
Ou seja:
Precisei adicionar o segundo endereço para que o login fosse associado ao usuário durante o registro, mas enquanto o endereço era “secundário”, o login falhava com um erro (“você não tem permissão para fazer isso”) (o registro funcionava!).
Além disso, o provedor não me permitiu “associar” o novo login na minha tela de usuário (nova funcionalidade legal :)).
Identifiquei rapidamente o problema de login relacionado ao e-mail nesta parte do código:
Não estou familiarizado o suficiente com Ruby e Discourse para afirmar com certeza, mas acredito que esse código tenta atualizar o e-mail principal sempre que um dos e-mails não corresponde (o que falhará quando houver mais de um e-mail e o principal não for o do O365).
No entanto, o openid-connect fez essa parte corretamente e até forneceu uma configuração para atualizar o e-mail (ou não) e associar o login na tela do usuário. Então, copiei sem pudor as linhas relevantes do openid-connect para o office365-auth, comentei o “after_authenticate” no office365-auth e agora tenho um login funcional de qualquer locatário do AzureAD e uma associação sempre que o e-mail for um dos e-mails do usuário.
As alterações relevantes estão no meu repositório no Github e vou criar um pull request. Mas ainda resta um problema ![]()
Como adicionei a capacidade de conectar/revogar, agora o provedor está visível no perfil do usuário, mas falta o nome dele?!:
Como posso adicionar isso? Há algum link para a documentação relevante? Não parece ser suficiente apenas inseri-lo no client.en.yml … ou estou perdendo algo.
Depois que corrigir isso, ficarei feliz em fazer um pull request para o provedor atualizado/corrigido…

