From 32b17e32ce8ab7a7742523816cef58b5fb22bd0c Mon Sep 17 00:00:00 2001 From: Oarkflow Date: Sat, 7 Oct 2023 11:08:28 +0545 Subject: [PATCH] feat: fix jwt auth --- auth/jwt.go | 20 ++++++++++++-------- auth/session.go | 10 +++++----- contracts/auth/auth.go | 14 ++++++++++---- 3 files changed, 27 insertions(+), 17 deletions(-) diff --git a/auth/jwt.go b/auth/jwt.go index b2f62d0..02783ee 100644 --- a/auth/jwt.go +++ b/auth/jwt.go @@ -80,7 +80,7 @@ func (app *Jwt) Data(ctx *frame.Context) (map[string]any, error) { return nil, nil } -func (app *Jwt) Login(ctx *frame.Context, user authContract.User, data ...map[string]any) (token string, err error) { +func (app *Jwt) Login(ctx *frame.Context, user authContract.User, data ...map[string]any) (token *authContract.AccessToken, err error) { t := reflect.TypeOf(user).Elem() v := reflect.ValueOf(user).Elem() fmt.Println(user) @@ -101,13 +101,13 @@ func (app *Jwt) Login(ctx *frame.Context, user authContract.User, data ...map[st return app.LoginUsingID(ctx, v.Field(i).Interface()) } } - return "", ErrorNoPrimaryKeyField + return nil, ErrorNoPrimaryKeyField } -func (app *Jwt) LoginUsingID(ctx *frame.Context, id any) (token string, err error) { +func (app *Jwt) LoginUsingID(ctx *frame.Context, id any) (token *authContract.AccessToken, err error) { secret := facades.Config.GetString("jwt.secret") if secret == "" { - return "", ErrorEmptySecret + return nil, ErrorEmptySecret } nowTime := supporttime.Now() @@ -119,14 +119,18 @@ func (app *Jwt) LoginUsingID(ctx *frame.Context, id any) (token string, err erro Subject: fmt.Sprintf("%v", id), } tokenClaims := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) - return tokenClaims.SignedString([]byte(secret)) + tok, err := tokenClaims.SignedString([]byte(secret)) + if err != nil { + return nil, err + } + return &authContract.AccessToken{Token: tok, ExpiresAt: expireTime}, nil } // Refresh need parse token first. -func (app *Jwt) Refresh(ctx *frame.Context) (token string, err error) { +func (app *Jwt) Refresh(ctx *frame.Context) (token *authContract.AccessToken, err error) { val := ctx.Value("token_claim") if val == nil { - return "", ErrorParseTokenFirst + return nil, ErrorParseTokenFirst } claim := val.(jwt.RegisteredClaims) @@ -134,7 +138,7 @@ func (app *Jwt) Refresh(ctx *frame.Context) (token string, err error) { refreshTtl := facades.Config.GetInt("jwt.refresh_ttl") expireTime := claim.ExpiresAt.Add(time.Duration(refreshTtl) * unit) if nowTime.Unix() > expireTime.Unix() { - return "", ErrorRefreshTimeExceeded + return nil, ErrorRefreshTimeExceeded } return app.LoginUsingID(ctx, claim.Subject) diff --git a/auth/session.go b/auth/session.go index 7a31f1c..cfcb44e 100644 --- a/auth/session.go +++ b/auth/session.go @@ -82,7 +82,7 @@ func (app *Session) Data(ctx *frame.Context) (map[string]any, error) { return data, nil } -func (app *Session) Login(ctx *frame.Context, user auth.User, data ...map[string]any) (token string, err error) { +func (app *Session) Login(ctx *frame.Context, user auth.User, data ...map[string]any) (token *auth.AccessToken, err error) { var store *session.Store if app.store == nil { store = facades.Session @@ -91,7 +91,7 @@ func (app *Session) Login(ctx *frame.Context, user auth.User, data ...map[string } s, err := session.Pick(ctx, store) if err != nil { - return "", err + return nil, err } s.Set(ctx.AuthUserKey, user) if len(data) > 0 { @@ -104,13 +104,13 @@ func (app *Session) Login(ctx *frame.Context, user auth.User, data ...map[string return } -func (app *Session) LoginUsingID(ctx *frame.Context, id any) (token string, err error) { +func (app *Session) LoginUsingID(ctx *frame.Context, id any) (token *auth.AccessToken, err error) { return } // Refresh need parse token first. -func (app *Session) Refresh(ctx *frame.Context) (token string, err error) { - return "", nil +func (app *Session) Refresh(ctx *frame.Context) (token *auth.AccessToken, err error) { + return nil, nil } func (app *Session) Logout(ctx *frame.Context) error { diff --git a/contracts/auth/auth.go b/contracts/auth/auth.go index fae968e..20c90a3 100644 --- a/contracts/auth/auth.go +++ b/contracts/auth/auth.go @@ -1,17 +1,23 @@ package auth import ( + "time" + "github.com/oarkflow/frame" ) +type AccessToken struct { + Token string `json:"token"` + ExpiresAt time.Time `json:"expires_at"` +} + type Auth interface { Guard(name string) Auth Parse(ctx *frame.Context, token string, user User) error User(ctx *frame.Context, user User) error - Login(ctx *frame.Context, user User, data ...map[string]any) (token string, err error) - LoginUsingID(ctx *frame.Context, id interface{}) (token string, err error) - Refresh(ctx *frame.Context) (token string, err error) - + Login(ctx *frame.Context, user User, data ...map[string]any) (token *AccessToken, err error) + LoginUsingID(ctx *frame.Context, id interface{}) (token *AccessToken, err error) + Refresh(ctx *frame.Context) (token *AccessToken, err error) Data(ctx *frame.Context) (map[string]any, error) Logout(ctx *frame.Context) error }