Cliente OAuth para Go (Golang): integração de autenticação na sua aplicação
\n\nAs 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.
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\nO que é OAuth 2.0 e para que serve?
\n\nOAuth 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
Instalação da biblioteca OAuth para Go
\n\nA biblioteca golang.org/x/oauth2 é uma extensão oficial do Go. A instalação é feita com o comando padrão:
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\nTambé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.
Configuração básica do cliente OAuth
\n\nPara 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:
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\nObserve 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.
Processamento do callback e obtenção do token
\n\nApó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:
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