Files
dokku-ui/internal/server/api/auth/github.go
2023-04-25 14:33:14 +08:00

77 lines
1.8 KiB
Go

package auth
import (
"context"
"github.com/labstack/echo/v4"
"github.com/rs/zerolog/log"
"gitlab.com/texm/shokku/internal/env"
"gitlab.com/texm/shokku/internal/models"
"gitlab.com/texm/shokku/internal/server/auth"
"gitlab.com/texm/shokku/internal/server/dto"
"gitlab.com/texm/shokku/internal/server/github"
"net/http"
)
func GetGithubAuthInfo(e *env.Env, c echo.Context) error {
var ghApp models.GithubApp
if err := e.DB.First(&ghApp).Error; err != nil {
log.Error().Err(err).Msg("no github app in db")
return echo.ErrBadRequest
}
return c.JSON(http.StatusOK, dto.GetGithubAuthInfoResponse{
ClientID: ghApp.ClientId,
})
}
func CompleteGithubAuth(e *env.Env, c echo.Context) error {
var req dto.GithubAuthRequest
if err := c.Bind(&req); err != nil {
return echo.ErrBadRequest
}
ctx := context.Background()
params := github.CodeExchangeParams{
Code: req.Code,
Scopes: []string{},
RedirectURL: req.RedirectURL,
}
client, err := github.ExchangeCode(ctx, e, params)
if err != nil {
log.Error().Err(err).Msg("failed to exchange code for client")
return echo.ErrBadRequest
}
user, err := client.GetUser(ctx)
if err != nil {
log.Error().Err(err).Msg("failed to get user")
return echo.ErrBadRequest
}
var count int64
dbUser := models.User{Name: user.GetLogin()}
r := e.DB.Model(&dbUser).Where(&dbUser).Count(&count)
if r.Error != nil {
log.Error().
Err(r.Error).
Str("name", user.GetLogin()).
Msg("user lookup error")
return echo.ErrInternalServerError
}
if count == 0 {
return echo.ErrForbidden
}
claims := auth.UserClaims{
Name: user.GetLogin(),
}
token, err := e.Auth.NewToken(claims)
if err != nil {
log.Error().Err(err).Msg("failed to create jwt")
return echo.ErrInternalServerError
}
e.Auth.SetTokenCookies(c, token)
return c.NoContent(http.StatusOK)
}