Cliente OAuth para Go (Golang): guia completo da biblioteca

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

Cliente OAuth para Go (Golang): integração de autenticação na sua aplicação

\n\n

As aplicações web modernas raramente dispensam a autenticação de terceiros. O OAuth 2.0 é um protocolo padrão que permite que os usuários façam login através de contas do Google, GitHub, VK e outros serviços. No ecossistema Go (Golang), existe uma biblioteca poderosa para trabalhar com OAuth: golang.org/x/oauth2, que fornece clientes prontos e ferramentas flexíveis para configurar a autorização.

\n\n

Neste artigo, vamos detalhar como instalar, configurar e usar o cliente OAuth para Go, além de apresentar exemplos práticos para provedores populares.

\n\n

O que é OAuth 2.0 e para que serve?

\n\n

OAuth 2.0 é um protocolo de acesso delegado. Em vez de armazenar as senhas dos usuários, sua aplicação recebe um token temporário que permite o acesso a recursos específicos (por exemplo, ao perfil do usuário). As principais vantagens são:

\n\n
    \n
  • Segurança — as senhas não são transmitidas nem armazenadas na sua aplicação.
  • \n
  • Conveniência — os usuários fazem login com um clique através de serviços que já conhecem.
  • \n
  • Flexibilidade — é possível solicitar apenas as permissões necessárias (scope).
  • \n
\n\n

Instalação da biblioteca OAuth para Go

\n\n

A biblioteca golang.org/x/oauth2 é uma extensão oficial do Go. A instalação é feita com o comando padrão:

\n\n
go get golang.org/x/oauth2\ngo get golang.org/x/oauth2/google   // para Google\ngo get golang.org/x/oauth2/github   // para GitHub (se disponível)\n
\n\n

Também pode ser necessário instalar o pacote para trabalhar com um provedor específico (por exemplo, google ou facebook). Para a maioria dos serviços, é preciso escrever seu próprio endpoint, mas a estrutura básica é a mesma.

\n\n

Configuração básica do cliente OAuth

\n\n

Para começar, é necessário registrar o aplicativo no provedor (Google, GitHub, etc.) e obter o ClientID e o ClientSecret. Em seguida, cria-se a configuração OAuth2:

\n\n
package main\n\nimport (\n    "context"\n    "fmt"\n    "golang.org/x/oauth2"\n)\n\nfunc main() {\n    // Configuração OAuth2 para Google\n    conf := &oauth2.Config{\n        ClientID:     "SEU_CLIENT_ID",\n        ClientSecret: "SEU_CLIENT_SECRET",\n        RedirectURL:  "http://localhost:8080/callback",\n        Scopes:       []string{"https://www.googleapis.com/auth/userinfo.email", "https://www.googleapis.com/auth/userinfo.profile"},\n        Endpoint: oauth2.Endpoint{\n            AuthURL:  "https://accounts.google.com/o/oauth2/auth",\n            TokenURL: "https://oauth2.googleapis.com/token",\n        },\n    }\n\n    // Geração da URL para redirecionamento do usuário\n    url := conf.AuthCodeURL("state", oauth2.AccessTypeOffline)\n    fmt.Printf("Acesse o link para autorização: %v\\n", url)\n}\n
\n\n

Observe o parâmetro state — é uma string para proteção contra ataques CSRF. Em uma aplicação real, ela deve ser gerada aleatoriamente e armazenada na sessão.

\n\n

Processamento do callback e obtenção do token

\n\n

Após o usuário autorizar, o provedor o redireciona para a RedirectURL com o parâmetro code. Esse código é trocado por um token de acesso. Exemplo de handler em Go:

\n\n
package main\n\nimport (\n    "context"\n    "fmt"\n    "net/http"\n    "golang.org/x/oauth2"\n)\n\nvar oauthConfig *oauth2.Config\n\nfunc callbackHandler(w http.ResponseWriter, r *http.Request) {\n    code := r.URL.Query().Get("code")\n    if code == "" {\n        http.Error(w, "Código não recebido", http.StatusBadRequest)\n        return\n    }\n\n    // Troca do código pelo token\n    token, err := oauthConfig.Exchange(context.Background(), code)\n    if err != nil {\n        http.Error(w, "Erro na troca do token: "+err.Error(), http.StatusInternalServerError)\n        return\n    }\n\n                    

Recommendations