104 lines
2.3 KiB
Go
104 lines
2.3 KiB
Go
package auth
|
|
|
|
import (
|
|
"io"
|
|
"log"
|
|
"net/http"
|
|
|
|
"management/internal/erpserver/model/form"
|
|
v1 "management/internal/erpserver/service/v1"
|
|
authv1 "management/internal/erpserver/service/v1/auth"
|
|
"management/internal/erpserver/templ/auth"
|
|
"management/internal/pkg/binding"
|
|
"management/internal/pkg/mid"
|
|
"management/internal/pkg/render"
|
|
"management/internal/pkg/session"
|
|
|
|
"github.com/drhin/logger"
|
|
)
|
|
|
|
type app struct {
|
|
log *logger.Logger
|
|
sm session.Manager
|
|
render render.Renderer
|
|
captchaService v1.CaptchaService
|
|
userService v1.UserService
|
|
authService *authv1.Auth
|
|
}
|
|
|
|
func newApp(
|
|
log *logger.Logger,
|
|
sm session.Manager,
|
|
render render.Renderer,
|
|
captchaService v1.CaptchaService,
|
|
userService v1.UserService,
|
|
authService *authv1.Auth,
|
|
) *app {
|
|
return &app{
|
|
log: log,
|
|
sm: sm,
|
|
render: render,
|
|
captchaService: captchaService,
|
|
userService: userService,
|
|
authService: authService,
|
|
}
|
|
}
|
|
|
|
func (a *app) login(w http.ResponseWriter, r *http.Request) {
|
|
ctx := r.Context()
|
|
switch r.Method {
|
|
case http.MethodGet:
|
|
u := mid.GetUser(ctx)
|
|
if u.ID > 0 {
|
|
if err := a.sm.RenewToken(ctx); err == nil {
|
|
http.Redirect(w, r, "/home.html", http.StatusFound)
|
|
return
|
|
}
|
|
}
|
|
|
|
_ = a.sm.Destroy(ctx)
|
|
component := auth.Login(ctx)
|
|
a.render.Render(ctx, w, component)
|
|
case http.MethodPost:
|
|
defer func(Body io.ReadCloser) {
|
|
err := Body.Close()
|
|
if err != nil {
|
|
a.log.Error(err.Error(), err)
|
|
}
|
|
}(r.Body)
|
|
var req form.Login
|
|
if err := binding.Form.Bind(r, &req); err != nil {
|
|
e := binding.ValidatorErrors(err)
|
|
a.render.JSONErr(w, e)
|
|
return
|
|
}
|
|
|
|
if !a.captchaService.Verify(req.CaptchaID, req.Captcha, true) {
|
|
a.render.JSONErr(w, "验证码错误")
|
|
return
|
|
}
|
|
|
|
req = req.SetAttributes(r)
|
|
//err := a.userService.Login(ctx, &req)
|
|
risk, err := a.authService.Authenticate(ctx, req)
|
|
if err != nil {
|
|
a.render.JSONErr(w, err.Error())
|
|
return
|
|
}
|
|
|
|
log.Println("risk:", risk)
|
|
|
|
a.render.JSONOk(w, "login successfully")
|
|
default:
|
|
http.Error(w, "Method Not Allowed", http.StatusMethodNotAllowed)
|
|
}
|
|
}
|
|
|
|
func (a *app) logout(w http.ResponseWriter, r *http.Request) {
|
|
err := a.sm.Destroy(r.Context())
|
|
if err != nil {
|
|
a.log.Error(err.Error(), err)
|
|
}
|
|
http.Redirect(w, r, "/", http.StatusFound)
|
|
}
|