Cliente OAuth para Go (Golang): Conexão a provedores OAuth 2.0

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Biblioteca de cliente OAuth para Go (Golang)



A biblioteca golang.org/x/oauth2 é o pacote oficial para trabalhar com o protocolo OAuth 2.0 na linguagem Go. Ela fornece uma interface conveniente para autenticação de usuários através de serviços de terceiros (Google, GitHub, Facebook, VK e outros), bem como para gerenciamento de tokens de acesso e atualização.



Esta ferramenta é o padrão de facto para implementar OAuth 2.0 em aplicações Go. Ela é ativamente mantida pela equipe Go e usada em milhares de projetos, incluindo Kubernetes, Docker e muitos outros.



Principais funcionalidades

  • Suporte a todos os grants OAuth 2.0 — Authorization Code, Client Credentials, Resource Owner Password Credentials, Implicit.
  • Gerenciamento automático de tokens — obtenção, atualização e armazenamento de tokens access/refresh.
  • Suporte integrado para provedores populares — Google, GitHub, Facebook, Microsoft, Slack e outros.
  • Configuração flexível do cliente HTTP — inserção automática de tokens nos cabeçalhos das requisições.
  • Armazenamento seguro de tokens — suporte a criptografia e armazenamentos personalizados.
  • Integração com net/http — middleware simples para processamento de requisições.


Instalação

A instalação é feita da forma padrão através do go get:

go get golang.org/x/oauth2


Também é recomendável instalar o pacote para um provedor específico, por exemplo, para Google:

go get golang.org/x/oauth2/google


Exemplo básico de uso

Vamos considerar um exemplo simples de autenticação via Google OAuth 2.0:



package main

import ( "context" "fmt" "net/http" "golang.org/x/oauth2" "golang.org/x/oauth2/google")

func main() { // Configuração OAuth 2.0 config := &oauth2.Config{ ClientID: "SEU_CLIENT_ID", ClientSecret: "SEU_CLIENT_SECRET", RedirectURL: "http://localhost:8080/callback", Scopes: []string{"https://www.googleapis.com/auth/userinfo.email"}, Endpoint: google.Endpoint, }

// Criando URL para autorização authURL := config.AuthCodeURL("state-token", oauth2.AccessTypeOffline) fmt.Println("Acesse o link:", authURL)

// Processamento do callback http.HandleFunc("/callback", func(w http.ResponseWriter, r *http.Request) { code := r.URL.Query().Get("code") token, err := config.Exchange(context.Background(), code) if err != nil { http.Error(w, "Erro na troca do código", http.StatusInternalServerError) return } fmt.Fprintf(w, "Token de acesso: %s", token.AccessToken) })

http.ListenAndServe(":8080", nil)}


Trabalhando com tokens

A biblioteca fornece métodos convenientes para trabalhar com tokens:



// Salvando o tokentoken := &oauth2.Token{    AccessToken:  "access-token",    TokenType:    "Bearer",    RefreshToken: "refresh-token",    Expiry:       time.Now().Add(1 * time.Hour),}

// Criando um cliente HTTP com inserção automática de tokenclient := config.Client(context.Background(), token)

// Executando uma requisição com autorizaçãoresp, err := client.Get("https://www.googleapis.com/oauth2/v2/userinfo")if err != nil { // tratamento de erro}defer resp.Body.Close()


Armazenamento personalizado de tokens

Para aplicações em produção, recomenda-se implementar seu próprio armazenamento:



type TokenStorage interface {    GetToken() (*oauth2.Token, error)    SetToken(*oauth2.Token) error}

// Exemplo usando arquivotype FileStorage struct { path string}

func (f *FileStorage) GetToken() (*oauth2.Token, error) { data, err := os.ReadFile(f.pat

Recommendations