feat: add simple Oauth2 logic for github
Some checks failed
Backend ci / build (push) Has been cancelled
Some checks failed
Backend ci / build (push) Has been cancelled
This commit is contained in:
@@ -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",
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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=
|
||||||
|
|||||||
@@ -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})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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")
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user