2024-10-25 18:18:11 +08:00

78 lines
1.7 KiB
Go

package handler
import (
_ "embed"
"github.com/loveuer/nf"
"github.com/loveuer/nf/nft/resp"
"net/http"
"net/url"
)
var (
//go:embed serve_login.html
page string
)
func LoginPage(c *nf.Ctx) error {
type Req struct {
ClientID string `query:"client_id"`
ClientSecret string `query:"client_secret"`
Scope string `query:"scope"`
RedirectURI string `query:"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 页面
return c.RenderHTML("login", page, map[string]interface{}{
"client_id": req.ClientID,
"client_secret": req.ClientSecret,
"redirect_uri": req.RedirectURI,
"scope": req.Scope,
})
}
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)
}