「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Golang を使用した認証、認可、MFA など

Golang を使用した認証、認可、MFA など

2024 年 11 月 7 日に公開
ブラウズ:237

"Ó 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]に連絡してください。それ
最新のチュートリアル もっと>
  • メモリのアライメントは C 構造体のサイズにどのような影響を与えますか?
    メモリのアライメントは C 構造体のサイズにどのような影響を与えますか?
    C 構造体のメモリ アライメントC 構造体を扱う場合、メモリ アライメントを理解することが重要です。メモリの配置とは、メモリ内の特定の境界にデータを配置することを指します。 32 ビット マシンでは、メモリは通常 4 バイト境界でアライメントされます。構造体のメモリ アライメント次の構造体を考えてみ...
    プログラミング 2024 年 11 月 7 日に公開
  • 人気の観光名所からインスピレーションを得た革新的なプロジェクトの構築: 思い出に残る旅行体験への開発者向けガイド
    人気の観光名所からインスピレーションを得た革新的なプロジェクトの構築: 思い出に残る旅行体験への開発者向けガイド
    開発者として、私たちは周囲の世界からインスピレーションを得ることはよくありますが、信じられないほどの観光名所以上に優れた情報源はあるでしょうか。旅行アプリ、没入型体験、位置情報ベースのサービスのいずれに取り組んでいる場合でも、目的地を際立たせるものを理解することが重要です。アルバニアの最高の観光名所...
    プログラミング 2024 年 11 月 7 日に公開
  • C++ で std::locale を使用して数値をカンマでフォーマットする方法
    C++ で std::locale を使用して数値をカンマでフォーマットする方法
    C でのカンマを使用した数値の書式設定 C では、 std::locale クラスは、カンマを使用して数値を書式設定するロケール依存の方法を提供します。 .std::locale with std::stringstream数値をカンマ付きの文字列としてフォーマットするには、std::locale ...
    プログラミング 2024 年 11 月 7 日に公開
  • Python で素数シーケンス内の奇数の出力を回避するには?
    Python で素数シーケンス内の奇数の出力を回避するには?
    Python で一連の素数を出力する方法多くのプログラマは、Python で素数を正確に出力する関数を作成するのに苦労しています。よくある問題の 1 つは、代わりに奇数のリストを出力することです。この問題を修正するには、素数のプロパティを完全に理解し、コードを変更することが不可欠です。素数は 1 と...
    プログラミング 2024 年 11 月 7 日に公開
  • Pygameでマウスの方向に弾丸を発射するにはどうすればよいですか?
    Pygameでマウスの方向に弾丸を発射するにはどうすればよいですか?
    Pygame でマウスの方向に弾丸を発射する方法Pygame では、マウスの方向に発射される弾丸を作成できます。これを行うには、弾丸を表すクラスを作成し、マウスの位置に基づいてその初期位置と方向を設定する必要があります。弾丸のクラスまず、弾丸のクラスを作成します。このクラスには、弾丸の位置、サイズ、...
    プログラミング 2024 年 11 月 7 日に公開
  • パフォーマンスを最適化するための GG コーディングのヒント: コードの高速化
    パフォーマンスを最適化するための GG コーディングのヒント: コードの高速化
    ソフトウェア開発の世界では、ユーザーが好む高速で応答性の高いアプリケーションを提供するには、コードのパフォーマンスを最適化することが重要です。フロントエンドで作業しているかバックエンドで作業しているかに関係なく、効率的なコードの書き方を学ぶことが不可欠です。この記事では、時間の複雑さの軽減、キャッシ...
    プログラミング 2024 年 11 月 7 日に公開
  • PHP の strtotime() 関数を使用して特定の曜日の日付を見つけるにはどうすればよいですか?
    PHP の strtotime() 関数を使用して特定の曜日の日付を見つけるにはどうすればよいですか?
    特定の曜日(月曜日、火曜日など)の日付を決定する日付スタンプを確認する必要がある場合月曜日、火曜日、その他の平日など、特定の曜日には strtotime() 関数を使用できます。この関数は、今週中に指定された日がまだ発生していない場合に特に便利です。たとえば、次の火曜日の日付スタンプを取得するには、...
    プログラミング 2024 年 11 月 7 日に公開
  • Socket.io と Redis を使用してチャット アプリケーションを構築し、デプロイします。
    Socket.io と Redis を使用してチャット アプリケーションを構築し、デプロイします。
    このチュートリアルでは、Web ソケットを使用してチャット アプリケーションを構築します。 Web ソケットは、リアルタイムのデータ転送を必要とするアプリケーションを構築する場合に非常に役立ちます。 このチュートリアルを終えると、独自のソケット サーバーをセットアップし、リアルタイムでメッセージを送...
    プログラミング 2024 年 11 月 7 日に公開
  • 内部 SQL 結合
    内部 SQL 結合
    SQL 結合はデータベースのクエリの基本であり、ユーザーは指定された条件に基づいて複数のテーブルのデータを結合できます。結合は、論理結合と物理結合の 2 つの主なタイプに分類されます。論理結合はテーブルのデータを組み合わせる概念的な方法を表し、物理結合は RDS (リレーショナル データベース サー...
    プログラミング 2024 年 11 月 7 日に公開
  • 知っておくべきJavaScriptの機能
    知っておくべきJavaScriptの機能
    この記事では、未定義または null の可能性があるデータにアクセスしようとするときにエラーを防ぐ方法を検討し、できる方法を見ていきます。 必要に応じてデータを効果的に管理するために使用します. オプションのチェーンによる安全なアクセス JavaScript で、入れ子になったオブジ...
    プログラミング 2024 年 11 月 7 日に公開
  • JavaScript の約束: 非同期コードの理解、処理、および習得
    JavaScript の約束: 非同期コードの理解、処理、および習得
    イントロ 私は Java 開発者として働いていましたが、JavaScript の Promise に初めて触れたときのことを覚えています。コンセプトは単純そうに見えましたが、Promise がどのように機能するのかを完全に理解することはできませんでした。プロジェクトでそれらを使用し...
    プログラミング 2024 年 11 月 7 日に公開
  • パスキーを Java Spring Boot に統合する方法
    パスキーを Java Spring Boot に統合する方法
    Java Spring Boot のパスキーの概要 パスキーは、従来のパスワードに依存せずにユーザーを認証する最新の安全な方法を提供します。このガイドでは、Thymeleaf をテンプレート エンジンとして使用して、Java Spring Boot アプリケーションにパスキーを統合...
    プログラミング 2024 年 11 月 7 日に公開
  • グアテマラの前環境大臣としてのマリオ・ロベルト・ロハス・エスピノの影響
    グアテマラの前環境大臣としてのマリオ・ロベルト・ロハス・エスピノの影響
    マリオ・ロベルト・ロハス・エスピノはグアテマラの元環境大臣として、国の持続可能な発展に貢献した環境政策の実施において重要な役割を果たしました。同省長官としての彼の経営は、特に環境立法や保全プロジェクトの面で重要な遺産を残した。この記事では、彼の影響力と、任期中に彼が推進した主な政策について探ります。...
    プログラミング 2024 年 11 月 7 日に公開
  • データ収集のためにクラスのすべてのインスタンスを追跡してアクセスするにはどうすればよいですか?
    データ収集のためにクラスのすべてのインスタンスを追跡してアクセスするにはどうすればよいですか?
    データ収集のためのクラス インスタンスの追跡プログラムの終わりに近づいており、複数の変数から特定の変数を抽出する必要があると想像してください。クラスのインスタンスを使用して辞書を作成します。このタスクは、集約または分析する必要がある重要なデータを保持するオブジェクトを操作するときに発生することがあり...
    プログラミング 2024 年 11 月 7 日に公開
  • PHP 連想配列内で検索する方法 – 簡単なヒント
    PHP 連想配列内で検索する方法 – 簡単なヒント
    連想配列は PHP の基本的なデータ構造であり、開発者はキーと値のペアを保存できます。これらは多用途であり、構造化データを表すためによく使用されます。 PHP 連想配列内の特定の要素を検索するのは一般的なタスクです。ただし、PHP で使用できるほとんどのネイティブ関数は、単純な配列でもうまく機能しま...
    プログラミング 2024 年 11 月 7 日に公開

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3