”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 使用 Golang 进行身份验证、授权、MFA 等

使用 Golang 进行身份验证、授权、MFA 等

发布于2024-11-07
浏览:445

"Ó 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!).

Autenticação, Autorização, MFA e muito mais com Golang

Neste texto, falaremos sobre três tópicos importantes:

  • JWT (o queridinho do mundo stateless)
  • OAuth (aquele que vive nas sombras das APIs de terceiros)
  • Casdoor (uma ferramenta que promete facilitar sua vida)

Autenticação vs. Autorização: Entendendo a Treta

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: JSON Web Tokens no Role

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!


OAuth

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:

  1. O usuário clica em "Login com Google".
  2. Redirecionamos ele para o Google para se autenticar.
  3. Ele autoriza seu app a usar as informações.
  4. Seu app recebe um access token e, se for bonzinho, também um refresh token.

Casdoor

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:

  • Interface de gerenciamento de usuários pronta para uso.
  • Administração centralizada de permissões e roles.
  • Integração fácil com APIs e front-ends em diferentes linguagens, incluindo Golang.
  • Multi-fator de autenticação (MFA) disponível para aumentar a segurança.
  • Suporte a OAuth e SSO (Single Sign-On), ideal para aplicações que precisam conectar múltiplos serviços.

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.


Como Rodar o Casdoor com Docker para Testes

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.

Passo 1: Rodar o Casdoor com Docker

Execute o seguinte comando no terminal:

docker run -p 8000:8000 casbin/casdoor-all-in-one

Isso irá:

  1. Baixar a imagem do Casdoor (caso você ainda não tenha).
  2. Rodar o servidor Casdoor na porta 8000.

Passo 2: Acessar a Interface do Casdoor

Assim que o contêiner estiver rodando, você pode acessar a interface de administração no navegador:

http://localhost:8000

Passo 3: Login na Interface de Admin

As credenciais padrão para o login são:

  • Usuário: admin
  • Senha: 123

Com isso, você poderá explorar as funcionalidades do Casdoor, configurar provedores de autenticação, criar usuários e definir permissões.


Configuração Básica do Casdoor

1. Criar uma Organização

As organizações em Casdoor são usadas para agrupar usuários e aplicações. Siga as etapas para criar sua primeira organização.

Autenticação, Autorização, MFA e muito mais com Golang


2. Criar Provedores

Provedores permitem que você configure como os usuários podem se autenticar (Google, GitHub, LDAP, etc.). Adicione um ou mais provedores de autenticação.

Autenticação, Autorização, MFA e muito mais com Golang


3. Criar Adapters

Os adapters permitem que você integre o Casdoor a sistemas de autorização externos. Crie um adapter para conectar seu sistema de permissões.

Autenticação, Autorização, MFA e muito mais com Golang


4. Criar uma Aplicação

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.

Autenticação, Autorização, MFA e muito mais com Golang


Passo 5: Adicionar os Providers na Aplicação

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.

  1. Acesse a aplicação que você criou.
  2. Adicione os provedores configurados previamente à lista de Providers da aplicação.

Autenticação, Autorização, MFA e muito mais com Golang


Passo 6: Configurar o Layout do Login e do Cadastro

O Casdoor permite personalizar as telas de login e cadastro para que fiquem com a cara da sua aplicação.

  1. Na interface de administração, acesse as configurações de UI da aplicação.
  2. Personalize as cores, logos e textos para o login e o cadastro.
  3. Visualize as mudanças em tempo real e salve.

Autenticação, Autorização, MFA e muito mais com Golang


Passo 7: Obter a URL para Autenticação

Após configurar tudo, você precisará da URL de autenticação para iniciar o fluxo de login a partir da sua aplicação.

  1. Acesse a aplicação e copie a URL de autenticação disponível na aba de configurações.
  2. Utilize essa URL para redirecionar usuários ao Casdoor quando precisarem se autenticar.

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

Autenticação, Autorização, MFA e muito mais com Golang


Passo 8: Callback com o Code

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.


Passo 9: Obter Access Token, ID Token e Refresh Token

Após receber o code, você deve trocá-lo por tokens chamando a URL de token do Casdoor.

URL para Obter Tokens:

POST http://localhost:8000/api/login/oauth/access_token

Parâmetros necessários:

  • client_id: ID da aplicação.
  • client_secret: Segredo da aplicação.
  • code: O código recebido na URL de callback.
  • redirect_uri: A mesma URL usada no processo de login.
  • grant_type: "authorization_code".

A resposta incluirá:

{
  "access_token": "eyJhbGciOiJIUzI1...",
  "id_token": "eyJhbGciOiJIUzI1NiIs...",
  "refresh_token": "e5d92f3a...",
  "expires_in": 3600,
  "token_type": "Bearer"
}

Autenticação, Autorização, MFA e muito mais com Golang


Passo 10: Renovar o Access Token com o Refresh Token

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.

URL para Renovar o Token:

POST http://localhost:8000/api/login/oauth/refresh_token

Parâmetros necessários:

  • grant_type: "refresh_code".
  • client_secret: Segredo da aplicação.
  • client_secret: ID da aplicação.
  • refresh_token: O código JWT de refresh na URL de access_token.
  • scope: "read".

A resposta incluirá um novo json com tokens:

{
  "access_token": "eyJhbGciOiJIUzI1...",
  "id_token": "eyJhbGciOiJIUzI1NiIs...",
  "refresh_token": "e5d92f3a...",
  "expires_in": 3600,
  "token_type": "Bearer"
}

Autenticação, Autorização, MFA e muito mais com Golang


API Completa e SDKs para Integração

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/

Autenticação, Autorização, MFA e muito mais com Golang


Integração com Casbin para Autorização

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.


Como Funciona o Enforce no Casbin

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.


Exemplos de Uso em Controllers HTTP e Recursos

Aqui está um exemplo de como usar Casbin em uma aplicação Go para autorizar acesso a uma rota HTTP:

Exemplo de Middleware para Autorização com Casbin

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
    })
}

Exemplo de Política RBAC (Role-Based Access Control)

[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.

Configuração no Casdoor

Passo 1: Criar o modelo

Autenticação, Autorização, MFA e muito mais com Golang


Passo 2: Definir o Enforce

Autenticação, Autorização, MFA e muito mais com Golang


E por fim, o MFA.

Como Configurar MFA no Casdoor

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.).

Passo 1: Adicionar autenticação 2 fatores no usuário.

Possível pela interface web ou implementando na API do casdoor para o usuário específico.

Autenticação, Autorização, MFA e muito mais com Golang


Passo 2: Realizar o Login

Ao realizar o login deve pedir o código de autenticação para validação.

Autenticação, Autorização, MFA e muito mais com Golang

Simples, não?


Conclusã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!

版本声明 本文转载于:https://dev.to/booscaaa/autenticacao-autorizacao-mfa-e-muito-mais-com-golang-1go5?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何使用 std::locale 在 C++ 中使用逗号格式化数字?
    如何使用 std::locale 在 C++ 中使用逗号格式化数字?
    在 C 中用逗号格式化数字 在 C 中,std::locale 类提供了一种依赖于区域设置的方式用逗号格式化数字.std::locale 与 std::stringstream要将数字格式化为带逗号的字符串,可以将 std::locale 与 std::stringstream 一起使用如下:#in...
    编程 发布于2024-11-07
  • 如何避免在 Python 中打印素数序列中的奇数?
    如何避免在 Python 中打印素数序列中的奇数?
    如何在 Python 中打印素数序列许多程序员都在努力创建一个在 Python 中准确打印素数的函数。一个常见的问题是打印奇数列表。要解决这个问题,必须彻底了解素数属性并修改代码。素数只能被 1 和它们本身整除。因此,改进的代码检查从 2 到数字的平方根(如果数字较小,则为数字本身)范围内的整除性。...
    编程 发布于2024-11-07
  • 如何在 Pygame 中向鼠标方向发射子弹?
    如何在 Pygame 中向鼠标方向发射子弹?
    如何在 Pygame 中朝鼠标方向发射子弹在 Pygame 中,可以创建一颗朝鼠标方向发射的子弹。为此,需要创建一个代表子弹的类,并根据鼠标位置设置其初始位置和方向。子弹的类首先,为项目符号创建一个类。该类应包含子弹的位置、大小和表面的属性。表面就是将在屏幕上渲染的内容。import pygame ...
    编程 发布于2024-11-07
  • 优化性能的 GG 编码技巧:加快代码速度
    优化性能的 GG 编码技巧:加快代码速度
    在软件开发领域,优化代码性能对于交付用户喜爱的快速响应的应用程序至关重要。无论您从事前端还是后端工作,学习如何编写高效的代码都是至关重要的。在本文中,我们将探讨各种性能优化技术,例如降低时间复杂度、缓存、延迟加载和并行性。我们还将深入探讨如何分析和优化前端和后端代码。让我们开始提高代码的速度和效率!...
    编程 发布于2024-11-07
  • 如何使用 PHP 的 strtotime() 函数查找一周中特定一天的日期?
    如何使用 PHP 的 strtotime() 函数查找一周中特定一天的日期?
    确定一周中指定日期(星期一、星期二等)的日期如果您需要确定日期戳一周中的特定一天,例如星期一、星期二或任何其他工作日,可以使用 strtotime() 函数。当指定日期在本周内尚未出现时,此函数特别有用。例如,要获取下周二的日期戳,只需使用以下代码:strtotime('next tuesday')...
    编程 发布于2024-11-07
  • 使用 Socket.io 和 Redis 构建和部署聊天应用程序。
    使用 Socket.io 和 Redis 构建和部署聊天应用程序。
    在本教程中,我们将使用 Web 套接字构建一个聊天应用程序。当您想要构建需要实时传输数据的应用程序时,Web 套接字非常有用。 在本教程结束时,您将能够设置自己的套接字服务器、实时发送和接收消息、在 Redis 中存储数据以及在渲染和 google cloud run 上部署您的应用程序。 ...
    编程 发布于2024-11-07
  • SQL 连接内部
    SQL 连接内部
    SQL 连接是查询数据库的基础,它允许用户根据指定条件组合多个表中的数据。连接分为两种主要类型:逻辑连接和物理连接。逻辑联接代表组合表中数据的概念方式,而物理联接是指这些联接在数据库系统(例如 RDS(关系数据库服务)或其他 SQL 服务器)中的实际实现。在今天的博文中,我们将揭开 SQL 连接的神...
    编程 发布于2024-11-07
  • 你应该知道的 Javascript 特性
    你应该知道的 Javascript 特性
    在本文中,我们将探讨如何在尝试访问可能是未定义或 null 的数据时防止错误,并且我们将介绍您可以使用的方法用于在必要时有效管理数据。 通过可选链接进行安全访问 在 JavaScript 中,当尝试访问嵌套对象中的值或函数时,如果结果为 undefined,您的代码可能会引发错误。此...
    编程 发布于2024-11-07
  • JavaScript 中的 Promise:理解、处理和掌握异步代码
    JavaScript 中的 Promise:理解、处理和掌握异步代码
    简介 我曾经是一名 Java 开发人员,我记得第一次接触 JavaScript 中的 Promise 时。尽管这个概念看起来很简单,但我仍然无法完全理解 Promise 是如何工作的。当我开始在项目中使用它们并了解它们解决的案例时,情况发生了变化。然后灵光乍现的时刻到来了,一切都变...
    编程 发布于2024-11-07
  • 如何将密钥集成到 Java Spring Boot 中
    如何将密钥集成到 Java Spring Boot 中
    Java Spring Boot 中的密钥简介 密钥提供了一种现代、安全的方式来验证用户身份,而无需依赖传统密码。在本指南中,我们将引导您使用 Thymeleaf 作为模板引擎将密钥集成到 Java Spring Boot 应用程序中。 我们将利用 Corbado 的密钥优先 UI...
    编程 发布于2024-11-07
  • 马里奥·罗伯托·罗哈斯·埃斯皮诺担任危地马拉前环境部长的影响
    马里奥·罗伯托·罗哈斯·埃斯皮诺担任危地马拉前环境部长的影响
    作为危地马拉前环境部长,马里奥·罗伯托·罗哈斯·埃斯皮诺在执行环境政策方面发挥了至关重要的作用,为该国的可持续发展做出了贡献。他作为该部门领导的管理留下了重要的遗产,特别是在环境立法和保护项目方面。在本文中,我们探讨了他的影响以及他在任期内推行的主要政策。 主要环境政策 在担任部长期...
    编程 发布于2024-11-07
  • 如何跟踪和访问类的所有实例以进行数据收集?
    如何跟踪和访问类的所有实例以进行数据收集?
    跟踪数据收集的类实例假设您正在接近程序末尾,并且需要从多个变量中提取特定变量用于填充字典的类的实例。当处理包含需要聚合或分析的基本数据的对象时,可能会出现此任务。为了说明该问题,请考虑这个简化的类结构:class Foo(): def __init__(self): self...
    编程 发布于2024-11-07
  • 如何在 PHP 关联数组中搜索 – 快速提示
    如何在 PHP 关联数组中搜索 – 快速提示
    关联数组是 PHP 中的基本数据结构,允许开发人员存储键值对。它们用途广泛,通常用于表示结构化数据。在 PHP 关联数组中搜索特定元素是一项常见任务。但 PHP 中可用的最原生函数可以很好地处理简单的数组。 出于这个原因,我们经常必须找到允许我们在关联数组上执行相同操作的函数组合。可能没有内存不足...
    编程 发布于2024-11-07
  • Web 开发的未来:每个开发人员都应该了解的新兴趋势和技术
    Web 开发的未来:每个开发人员都应该了解的新兴趋势和技术
    介绍 Web 开发从早期的静态 HTML 页面和简单的 CSS 设计已经走过了漫长的道路。多年来,在技术进步和用户对更具动态性、交互性和响应性的网站不断增长的需求的推动下,该领域发展迅速。随着互联网成为日常生活中不可或缺的一部分,网络开发人员必须不断适应新趋势和技术,以保持相关性并...
    编程 发布于2024-11-07
  • 初学者 Python 程序员可以使用 ChatGPT
    初学者 Python 程序员可以使用 ChatGPT
    作为一名 Python 初学者,您面临着无数的挑战,从编写干净的代码到排除错误。 ChatGPT 可以成为您提高生产力和简化编码之旅的秘密武器。您可以直接向 ChatGPT 提问并获得所需的答案,而无需筛选无休止的文档或论坛。无论您是在调试一段棘手的代码、寻找项目灵感,还是寻求复杂概念的解释,Ch...
    编程 发布于2024-11-07

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3