2024-10-28 18:16:36 +08:00

87 lines
2.1 KiB
Go

package handler
import (
_ "embed"
"github.com/google/uuid"
"github.com/loveuer/nf"
"github.com/loveuer/nf/nft/resp"
"net/http"
"net/url"
"time"
"uauth/internal/store/cache"
)
var (
//go:embed serve_login.html
pageLogin string
)
func LoginPage(c *nf.Ctx) error {
type Req struct {
ClientId string `query:"client_id" json:"client_id"`
ClientSecret string `query:"client_secret" json:"client_secret"`
Scope string `query:"scope" json:"scope"`
RedirectURI string `query:"redirect_uri" json:"redirect_uri"`
}
var (
err error
req = new(Req)
)
if err = c.QueryParser(req); err != nil {
return resp.Resp400(c, err.Error())
}
if req.ClientId == "" || req.ClientSecret == "" || req.RedirectURI == "" {
return resp.Resp400(c, req)
}
// todo: 验证 client id, client secret, scoop
// todo: 如果用户是已登录状态,则直接带上信息返回到 authorize 页面
state := uuid.New().String()[:8]
if err = cache.Client.SetEx(c.Context(), cache.Prefix+"state_code:"+state, nil, 10*time.Minute); err != nil {
return resp.Resp500(c, err.Error())
}
return c.RenderHTML("login", pageLogin, map[string]interface{}{
"client_id": req.ClientId,
"client_secret": req.ClientSecret,
"redirect_uri": req.RedirectURI,
"scope": req.Scope,
"state": state,
})
}
func LoginAction(c *nf.Ctx) error {
type Req struct {
Username string `form:"username"`
Password string `form:"password"`
ClientId string `form:"client_id"`
ClientSecret string `form:"client_secret"`
RedirectURI string `form:"redirect_uri"`
Scope string `form:"scope"`
}
var (
err error
req = new(Req)
)
if err = c.BodyParser(req); err != nil {
return resp.Resp400(c, err.Error())
}
// todo: 验证用户登录是否成功,等等
queries := make(url.Values)
queries.Add("client_id", req.ClientId)
queries.Add("client_secret", req.ClientSecret)
queries.Add("redirect_uri", req.RedirectURI)
queries.Add("scope", req.Scope)
return c.Redirect("/api/oauth/v2/authorize?"+queries.Encode(), http.StatusFound)
}