wip: 24/10/28
This commit is contained in:
98
internal/middleware/auth/auth.go
Normal file
98
internal/middleware/auth/auth.go
Normal file
@ -0,0 +1,98 @@
|
||||
package auth
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"github.com/loveuer/nf"
|
||||
"github.com/loveuer/nf/nft/resp"
|
||||
"time"
|
||||
"uauth/internal/store/cache"
|
||||
"uauth/internal/tool"
|
||||
"uauth/model"
|
||||
)
|
||||
|
||||
type Config struct {
|
||||
IgnoreFn func(c *nf.Ctx) bool
|
||||
TokenFn func(c *nf.Ctx) (string, bool)
|
||||
GetUserFn func(c *nf.Ctx, token string) (*model.User, error)
|
||||
}
|
||||
|
||||
var (
|
||||
defaultIgnoreFn = func(c *nf.Ctx) bool {
|
||||
return false
|
||||
}
|
||||
|
||||
defaultTokenFn = func(c *nf.Ctx) (string, bool) {
|
||||
var token string
|
||||
|
||||
if token = c.Request.Header.Get("Authorization"); token != "" {
|
||||
return token, true
|
||||
}
|
||||
|
||||
if token = c.Query("access_token"); token != "" {
|
||||
return token, true
|
||||
}
|
||||
|
||||
if token = c.Cookies("access_token"); token != "" {
|
||||
return token, true
|
||||
}
|
||||
|
||||
return "", false
|
||||
}
|
||||
|
||||
defaultGetUserFn = func(c *nf.Ctx, token string) (*model.User, error) {
|
||||
var (
|
||||
err error
|
||||
op = new(model.User)
|
||||
)
|
||||
|
||||
if err = cache.Client.GetExScan(tool.Timeout(3), cache.Prefix+"token:"+token, 24*time.Hour).Scan(op); err != nil {
|
||||
if errors.Is(err, cache.ErrorKeyNotFound) {
|
||||
return nil, resp.Resp401(c, nil, "用户认证信息不存在或已过期, 请重新登录")
|
||||
}
|
||||
|
||||
return nil, resp.Resp500(c, err)
|
||||
}
|
||||
|
||||
return op, nil
|
||||
}
|
||||
)
|
||||
|
||||
func New(cfgs ...*Config) nf.HandlerFunc {
|
||||
var cfg = &Config{}
|
||||
|
||||
if len(cfgs) > 0 && cfgs[0] != nil {
|
||||
cfg = cfgs[0]
|
||||
}
|
||||
|
||||
if cfg.IgnoreFn == nil {
|
||||
cfg.IgnoreFn = defaultIgnoreFn
|
||||
}
|
||||
|
||||
if cfg.TokenFn == nil {
|
||||
cfg.TokenFn = defaultTokenFn
|
||||
}
|
||||
|
||||
if cfg.GetUserFn == nil {
|
||||
cfg.GetUserFn = defaultGetUserFn
|
||||
}
|
||||
|
||||
return func(c *nf.Ctx) error {
|
||||
if cfg.IgnoreFn(c) {
|
||||
return c.Next()
|
||||
}
|
||||
|
||||
token, ok := cfg.TokenFn(c)
|
||||
if !ok {
|
||||
return resp.Resp401(c, nil, "请登录")
|
||||
}
|
||||
|
||||
op, err := cfg.GetUserFn(c, token)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
c.Locals("user", op)
|
||||
|
||||
return c.Next()
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user