"Ó o cara falando de autenticação em pleno 2024!"
Sim! Vamos explorar como realizar fluxos de autenticação e autorização, e de quebra, entender a diferença entre estar autenticado e estar autorizado (spoiler: não é a mesma coisa!).
Neste texto, falaremos sobre três tópicos importantes:
Se você já trabalhou com autenticação, provavelmente ouviu algo como: “Fulano foi autenticado, então ele pode acessar tal recurso”. Calma lá! Estar autenticado é apenas dizer: “Sim, você é você mesmo!”. Agora, autorização é outra parada — significa: “Você, mesmo sendo você, tem permissão para mexer aqui?”. Percebe a diferença?
JWT é aquele formato que a gente ama... até começar a lidar com expiração, rotação de tokens e as temidas brechas de segurança. O básico é simples:
token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{ "user": "fulano", "admin": true, "exp": time.Now().Add(time.Hour * 24).Unix(), }) tokenString, err := token.SignedString([]byte("s3cr3t")) if err != nil { log.Fatal(err) } fmt.Println("Token:", tokenString)
Simples, né? Um JWT é basicamente um pacote de informações assinado. O problema é que, depois de gerado, ele vive por aí, distribuído na rede. Por isso, controle bem o tempo de expiração e o armazenamento dos tokens!
Quando você quer integrar com outros serviços, tipo permitir que o usuário faça login com Google, GitHub, ou aquele app de delivery, você provavelmente usará OAuth. A ideia é a seguinte: o serviço terceiro confirma quem é o usuário e devolve um token para você, dizendo: “Ele é quem diz ser e está autorizado a fazer tal coisa”.
A sequência geralmente é assim:
Agora, se você quer uma solução completa para autenticação e autorização que já vem com UI e suporte a múltiplos protocolos (JWT, OAuth, etc.), Casdoor pode ser uma boa opção. Ele é uma plataforma open-source, escrita em GOLANG para autenticação e autorização, projetada para facilitar a gestão de usuários e permissões em aplicações modernas. Ele oferece suporte a múltiplos protocolos de autenticação, como JWT, OAuth, SAML, LDAP, e até integração com serviços de identidade populares, como Google, GitHub, WeChat, entre outros.
Com o Casdoor, você obtém:
Além de ser fácil de configurar, o Casdoor é ideal para quem quer rapidez na implementação e precisa de uma interface intuitiva para gerenciar usuários e autorização sem muito esforço.
Você pode explorar mais sobre o projeto no GitHub do Casdoor ou no site oficial.
Se você quer experimentar o Casdoor rapidamente, a maneira mais fácil é rodá-lo com Docker usando a imagem casbin/casdoor-all-in-one. Esse contêiner já vem com tudo configurado (servidor e banco de dados), facilitando o processo.
Execute o seguinte comando no terminal:
docker run -p 8000:8000 casbin/casdoor-all-in-one
Isso irá:
Assim que o contêiner estiver rodando, você pode acessar a interface de administração no navegador:
http://localhost:8000
As credenciais padrão para o login são:
Com isso, você poderá explorar as funcionalidades do Casdoor, configurar provedores de autenticação, criar usuários e definir permissões.
As organizações em Casdoor são usadas para agrupar usuários e aplicações. Siga as etapas para criar sua primeira organização.
Provedores permitem que você configure como os usuários podem se autenticar (Google, GitHub, LDAP, etc.). Adicione um ou mais provedores de autenticação.
Os adapters permitem que você integre o Casdoor a sistemas de autorização externos. Crie um adapter para conectar seu sistema de permissões.
As aplicações permitem vincular usuários e provedores a um contexto específico. Crie uma aplicação e associe a uma organização e provedores.
Após criar sua aplicação, você precisa associar os provedores (Providers) a ela. Isso garante que a aplicação saiba quais métodos de login estarão disponíveis para os usuários.
O Casdoor permite personalizar as telas de login e cadastro para que fiquem com a cara da sua aplicação.
Após configurar tudo, você precisará da URL de autenticação para iniciar o fluxo de login a partir da sua aplicação.
Exemplo de URL:
http://localhost:8000/login/oauth/authorize?client_id=[CLIENT_ID]&response_type=code&redirect_uri=http://localhost:9000/callback&scope=read&state=casdoor
Após o login bem-sucedido, o Casdoor redirecionará o usuário para a URL de callback com um code.
Exemplo de callback:
http://localhost:9000/callback?code=b1bf883de5a552aa43d6&state=casdoor
Esse code é temporário e será trocado por tokens para acessar recursos protegidos.
Após receber o code, você deve trocá-lo por tokens chamando a URL de token do Casdoor.
POST http://localhost:8000/api/login/oauth/access_token
Parâmetros necessários:
A resposta incluirá:
{ "access_token": "eyJhbGciOiJIUzI1...", "id_token": "eyJhbGciOiJIUzI1NiIs...", "refresh_token": "e5d92f3a...", "expires_in": 3600, "token_type": "Bearer" }
Quando o access token expirar, você poderá obter um novo token usando o refresh token. Isso evita que o usuário precise fazer login novamente.
POST http://localhost:8000/api/login/oauth/refresh_token
Parâmetros necessários:
A resposta incluirá um novo json com tokens:
{ "access_token": "eyJhbGciOiJIUzI1...", "id_token": "eyJhbGciOiJIUzI1NiIs...", "refresh_token": "e5d92f3a...", "expires_in": 3600, "token_type": "Bearer" }
O Casdoor também disponibiliza uma API completa documentada no Swagger, permitindo que você crie telas de autenticação totalmente customizadas e adapte o fluxo de login às necessidades do seu projeto. Além disso, ele oferece SDKs para diversas tecnologias populares, como Flutter, React, Vue, Angular, e muito mais, facilitando a integração com diferentes stacks e plataformas. Com essas ferramentas, você tem flexibilidade para implementar autenticação de maneira rápida e eficiente, seja para aplicações web ou mobile.
GET http://localhost:8000/swagger/
Além da autenticação, o Casdoor pode ser integrado com o Casbin, uma poderosa biblioteca de autorização baseada em políticas. O Casbin permite definir quem pode acessar quais APIs e recursos de forma flexível, utilizando uma abordagem baseada em regras. Com suporte a diversos modelos, como ACL (Access Control List), RBAC (Role-Based Access Control) e ABAC (Attribute-Based Access Control), o Casbin facilita o controle granular de permissões.
A combinação de Casdoor para autenticação e Casbin para autorização oferece uma solução robusta para controlar o acesso em suas aplicações. Você pode, por exemplo, autenticar o usuário com Casdoor e utilizar o Casbin para verificar se ele tem permissão para acessar uma rota ou recurso específico.
O método Enforce é o coração do Casbin. Ele é responsável por verificar se uma determinada solicitação de acesso deve ser permitida ou negada com base nas políticas definidas. O método recebe três parâmetros principais: sub (o sujeito, ou usuário), obj (o objeto, ou recurso) e act (a ação, como GET ou POST). Se a política permitir a combinação desses três elementos, o Casbin retorna true, indicando que o acesso é autorizado; caso contrário, retorna false.
Por exemplo, no código abaixo, o Casbin verificará se o usuário pode realizar uma ação específica no recurso solicitado:
ok, err := e.Enforce("alice", "/admin", "GET") if err != nil { log.Fatal(err) } if ok { fmt.Println("Acesso permitido") } else { fmt.Println("Acesso negado") }
Esse processo garante que o acesso seja controlado dinamicamente com base nas permissões definidas na política, evitando que ações não autorizadas sejam executadas.
Aqui está um exemplo de como usar Casbin em uma aplicação Go para autorizar acesso a uma rota HTTP:
package main import ( "github.com/casbin/casbin/v2" "net/http" ) func authorize(e *casbin.Enforcer, sub, obj, act string) bool { ok, err := e.Enforce(sub, obj, act) if err != nil { return false } return ok } func middlewareAuth(e *casbin.Enforcer, next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { user := r.Header.Get("user") // Obtém o usuário do cabeçalho resource := r.URL.Path // Recurso sendo acessado action := r.Method // Método HTTP (GET, POST, etc.) if !authorize(e, user, resource, action) { http.Error(w, "Forbidden", http.StatusForbidden) return } next.ServeHTTP(w, r) // Continua se autorizado }) }
[request_definition] r = sub, obj, act [policy_definition] p = sub, obj, act [role_definition] g = _, _ [policy] p, admin, /admin, GET p, user, /profile, GET [role_assignment] g, alice, admin g, bob, user
Nesta política, o admin tem acesso à rota /admin e o user à rota /profile. O usuário Alice é atribuído ao papel de admin, enquanto Bob é um user.
Com essa abordagem, você pode criar sistemas seguros e escaláveis, combinando autenticação com o Casdoor e autorização com o Casbin. Explore os links para mais exemplos e ajuste a implementação conforme as necessidades do seu projeto.
E por fim, o MFA.
A Autenticação Multi-Fator (MFA) adiciona uma camada extra de segurança ao processo de login. Com ela, mesmo que alguém descubra a senha do usuário, será necessário um segundo fator para concluir a autenticação, como um código gerado por um app autenticador (Google Authenticator, Authy, etc.).
Possível pela interface web ou implementando na API do casdoor para o usuário específico.
Ao realizar o login deve pedir o código de autenticação para validação.
Simples, não?
Autenticação e autorização são como aquelas engrenagens que, juntas, mantêm o sistema rodando redondo. A autenticação confirma quem é o usuário, enquanto a autorização define o que ele pode fazer. Não basta saber quem está logado; é preciso garantir que cada um só tenha acesso ao que realmente pode. É tipo festa: uma coisa é passar pela entrada, outra é conseguir entrar na área VIP.
Com o Casdoor, fica fácil gerenciar o processo de autenticação. Ele oferece uma variedade de opções, como login com Google, GitHub, além de integração com protocolos como JWT e OAuth. Já o Casbin é o cara que define as regras e garante que cada recurso seja acessado por quem tem permissão, funcionando como uma política de segurança que você controla.
Usar essas duas ferramentas juntas é uma solução poderosa. O Casdoor garante que só usuários legítimos passem pela porta, enquanto o Casbin faz o controle fino, autorizando ou bloqueando ações com base em regras personalizadas. E o melhor é que tudo isso pode ser integrado facilmente via API, com direito a documentação no Swagger e SDKs para várias tecnologias, como Flutter, React e Vue.
Com essa combinação, seu sistema fica bem organizado e seguro, sem complicação. Agora é só botar a mão na massa e deixar tudo funcionando como deve. No fim das contas, um sistema bem protegido é como uma festa bem organizada: quanto mais controle, mais tranquilo é para todo mundo se divertir e aproveitar!
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3