feat: add simple Oauth2 logic for github
Some checks failed
Backend ci / build (push) Has been cancelled

This commit is contained in:
d3m0k1d
2026-02-10 00:07:29 +03:00
parent c62dd7f421
commit 53d8760912
8 changed files with 109 additions and 18 deletions

View File

@@ -15,6 +15,32 @@ const docTemplate = `{
"host": "{{.Host}}", "host": "{{.Host}}",
"basePath": "{{.BasePath}}", "basePath": "{{.BasePath}}",
"paths": { "paths": {
"/callback": {
"get": {
"description": "Callback for oauth2 providers",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"auth"
],
"summary": "Callback for oauth2 providers",
"responses": {
"200": {
"description": "OK",
"schema": {
"type": "object",
"additionalProperties": {
"type": "string"
}
}
}
}
}
},
"/posts": { "/posts": {
"get": { "get": {
"description": "Get all posts", "description": "Get all posts",

View File

@@ -4,6 +4,32 @@
"contact": {} "contact": {}
}, },
"paths": { "paths": {
"/callback": {
"get": {
"description": "Callback for oauth2 providers",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"auth"
],
"summary": "Callback for oauth2 providers",
"responses": {
"200": {
"description": "OK",
"schema": {
"type": "object",
"additionalProperties": {
"type": "string"
}
}
}
}
}
},
"/posts": { "/posts": {
"get": { "get": {
"description": "Get all posts", "description": "Get all posts",

View File

@@ -32,6 +32,23 @@ definitions:
info: info:
contact: {} contact: {}
paths: paths:
/callback:
get:
consumes:
- application/json
description: Callback for oauth2 providers
produces:
- application/json
responses:
"200":
description: OK
schema:
additionalProperties:
type: string
type: object
summary: Callback for oauth2 providers
tags:
- auth
/posts: /posts:
get: get:
consumes: consumes:

View File

@@ -57,6 +57,7 @@ require (
golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546 // indirect golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546 // indirect
golang.org/x/mod v0.32.0 // indirect golang.org/x/mod v0.32.0 // indirect
golang.org/x/net v0.49.0 // indirect golang.org/x/net v0.49.0 // indirect
golang.org/x/oauth2 v0.35.0 // indirect
golang.org/x/sync v0.19.0 // indirect golang.org/x/sync v0.19.0 // indirect
golang.org/x/sys v0.40.0 // indirect golang.org/x/sys v0.40.0 // indirect
golang.org/x/text v0.33.0 // indirect golang.org/x/text v0.33.0 // indirect

View File

@@ -138,6 +138,8 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug
golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.49.0 h1:eeHFmOGUTtaaPSGNmjBKpbng9MulQsJURQUAfUwY++o= golang.org/x/net v0.49.0 h1:eeHFmOGUTtaaPSGNmjBKpbng9MulQsJURQUAfUwY++o=
golang.org/x/net v0.49.0/go.mod h1:/ysNB2EvaqvesRkuLAyjI1ycPZlQHM3q01F02UY/MV8= golang.org/x/net v0.49.0/go.mod h1:/ysNB2EvaqvesRkuLAyjI1ycPZlQHM3q01F02UY/MV8=
golang.org/x/oauth2 v0.35.0 h1:Mv2mzuHuZuY2+bkyWXIHMfhNdJAdwW3FuWeCPYN5GVQ=
golang.org/x/oauth2 v0.35.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4=

View File

@@ -1,17 +1,30 @@
package handlers package handlers
import ( import (
"gitea.d3m0k1d.ru/d3m0k1d/d3m0k1d.ru/backend/internal/repositories" "os"
"gitea.d3m0k1d.ru/d3m0k1d/d3m0k1d.ru/backend/internal/logger"
"gitea.d3m0k1d.ru/d3m0k1d/d3m0k1d.ru/backend/internal/repositories"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"golang.org/x/oauth2"
"golang.org/x/oauth2/endpoints"
) )
type AuthHandlers struct { type AuthHandlers struct {
repo repositories.AuthRepository repo repositories.AuthRepository
logger *logger.Logger
}
var configGithub = &oauth2.Config{
ClientID: os.Getenv("GITHUB_CLIENT_ID"),
ClientSecret: os.Getenv("GITHUB_CLIENT_SECRET"),
RedirectURL: "https://d3m0k1d.ru/",
Scopes: []string{"user"},
Endpoint: endpoints.GitHub,
} }
func NewAuthHandlers(repo repositories.AuthRepository) *AuthHandlers { func NewAuthHandlers(repo repositories.AuthRepository) *AuthHandlers {
return &AuthHandlers{repo: repo} return &AuthHandlers{repo: repo, logger: logger.New(false)}
} }
// Callback godoc // Callback godoc
@@ -21,7 +34,15 @@ func NewAuthHandlers(repo repositories.AuthRepository) *AuthHandlers {
// @Accept json // @Accept json
// @Produce json // @Produce json
// @Success 200 {object} map[string]string // @Success 200 {object} map[string]string
// @Router /callback [get] // @Router /callback/github [get]
func (h *AuthHandlers) Callback(c *gin.Context) { func (h *AuthHandlers) CallbackGithub(c *gin.Context) {
h.logger.Info("CallbackGithub called")
token, err := configGithub.Exchange(c.Request.Context(), c.Query("code"))
if err != nil {
h.logger.Error("error request: " + err.Error())
c.Status(500)
}
h.logger.Info("200 OK GET /callback/github")
c.JSON(200, gin.H{"token": token})
} }

View File

@@ -11,14 +11,13 @@ import (
type PostHandlers struct { type PostHandlers struct {
repo repositories.PostRepository repo repositories.PostRepository
logger *logger.Logger
} }
func NewPostHandlers(repo repositories.PostRepository) *PostHandlers { func NewPostHandlers(repo repositories.PostRepository) *PostHandlers {
return &PostHandlers{repo: repo} return &PostHandlers{repo: repo, logger: logger.New(false)}
} }
var log = logger.New(false)
// GetPosts godoc // GetPosts godoc
// @Summary Get all posts // @Summary Get all posts
// @Description Get all posts // @Description Get all posts
@@ -31,10 +30,10 @@ func (h *PostHandlers) GetPosts(c *gin.Context) {
var result []storage.PostReq var result []storage.PostReq
result, err := h.repo.GetAll(c.Request.Context()) result, err := h.repo.GetAll(c.Request.Context())
if err != nil { if err != nil {
log.Error("error request: " + err.Error()) h.logger.Error("error request: " + err.Error())
c.Status(500) c.Status(500)
} }
log.Info("200 OK GET /posts") h.logger.Info("200 OK GET /posts")
c.JSON(200, result) c.JSON(200, result)
} }
@@ -54,15 +53,15 @@ func (h *PostHandlers) GetPost(c *gin.Context) {
id_p := c.Param("id") id_p := c.Param("id")
id, err := strconv.Atoi(id_p) id, err := strconv.Atoi(id_p)
if err != nil { if err != nil {
log.Error("error request: " + err.Error()) h.logger.Error("error request: " + err.Error())
c.Status(500) c.Status(500)
} }
result, err = h.repo.GetByID(c.Request.Context(), id) result, err = h.repo.GetByID(c.Request.Context(), id)
if err != nil { if err != nil {
log.Error("error request: " + err.Error()) h.logger.Error("error request: " + err.Error())
c.Status(500) c.Status(500)
} }
log.Info("200 OK GET /posts/" + id_p) h.logger.Info("200 OK GET /posts/" + id_p)
c.JSON(200, result) c.JSON(200, result)
// TODO: added validaton for 400 response // TODO: added validaton for 400 response
} }
@@ -112,7 +111,7 @@ func (h *PostHandlers) UpdatePost(c *gin.Context) {
id_p := c.Param("id") id_p := c.Param("id")
id, err := strconv.Atoi(id_p) id, err := strconv.Atoi(id_p)
if err != nil { if err != nil {
log.Error("error request: " + err.Error()) h.logger.Error("error request: " + err.Error())
c.Status(500) c.Status(500)
} }
var req storage.Post var req storage.Post
@@ -127,7 +126,7 @@ func (h *PostHandlers) UpdatePost(c *gin.Context) {
} }
c.JSON(200, req) c.JSON(200, req)
log.Info("200 OK PUT /posts/" + id_p) h.logger.Info("200 OK PUT /posts/" + id_p)
} }
// DeletePost godoc // DeletePost godoc
@@ -139,5 +138,4 @@ func (h *PostHandlers) UpdatePost(c *gin.Context) {
// @Success 200 {object} storage.Post // @Success 200 {object} storage.Post
// @Router /posts/{id} [delete] // @Router /posts/{id} [delete]
func DeletePost(c *gin.Context) { func DeletePost(c *gin.Context) {
log.Info("DeletePost")
} }

View File

@@ -11,7 +11,7 @@ func Register(router *gin.Engine, db *sql.DB) {
handler_posts := NewPostHandlers(repositories.NewPostRepository(db)) handler_posts := NewPostHandlers(repositories.NewPostRepository(db))
handler_auth := NewAuthHandlers(repositories.NewAuthRepository(db)) handler_auth := NewAuthHandlers(repositories.NewAuthRepository(db))
v1 := router.Group("api/v1") v1 := router.Group("api/v1")
v1.GET("/callback", handler_auth.Callback) v1.GET("/callback", handler_auth.CallbackGithub)
posts := v1.Group("posts") posts := v1.Group("posts")
{ {
posts.GET("/", handler_posts.GetPosts) posts.GET("/", handler_posts.GetPosts)