SSO JWT - Passando Grupos

Eu uso GitHub - discourse/discourse-jwt: Discourse Auth support for JSON Web Tokens (JWT) · GitHub para autenticação com um serviço JWT personalizado.

Funciona para fazer login do usuário, mas passar a chave groups não parece estar fazendo nada. Analisei o código do ManagedAuthenticator e não vi nada relacionado a grupos.

Está faltando algo ou minha compreensão está incorreta?

Obrigado!

Você não está perdendo nada — o plugin JWT não suporta a passagem de grupos. Torná-lo possível exigiria algum trabalho de desenvolvimento no plugin.

@david, você acha que isso é difícil de fazer para alguém que nunca escreveu plugins? É tão simples quanto buscar, pelo nome, os grupos que vêm do JWT, no Discourse e atribuir o resultado da consulta (dos objetos de grupo) a user.groups? Tenho alguma familiaridade com o plugin (por mais simples que seja) e talvez possa fazer isso.

Além disso, devo mesmo me preocupar com isso? Se eu tiver um JWT em mãos, consigo autenticar por meio do OpenID Connect?

Depende de como você quer que funcione… Você provavelmente também vai querer criar grupos normais no Discourse, sem que o JWT remova membros deles aleatoriamente. No nosso sistema nativo de SSO do Discourse, resolvemos isso com dois parâmetros: “adicionar grupos” e “remover grupos”.

https://github.com/discourse/discourse/blob/master/app/models/discourse_single_sign_on.rb#L159-L179

No plugin JWT, você provavelmente adicionaria essa lógica na função after_authenticate do autenticador. Certifique-se de chamar super e retornar sua resposta, para que tudo o que já existe continue funcionando corretamente. Um exemplo desse tipo de sobrescrita está aqui.

Ótimo! Isso me deu o que eu queria; devo ser capaz de resolver o resto. Obrigado!

Você avançou com isso? Gostaria de saber como posso fazer um SSO usando apenas JWT.

O plugin discourse-jwt funciona. No entanto, parece que ele foi projetado para funcionar apenas com o algoritmo HS256, por algum motivo. É simples o suficiente para fazê-lo funcionar com outros.

Você pode conferir o repositório com o qual brinquei: discourse-jwt/plugin.rb at master · arivanandan/discourse-jwt · GitHub