Skip to content

Commit

Permalink
feat: fix jwt auth
Browse files Browse the repository at this point in the history
  • Loading branch information
Oarkflow committed Oct 7, 2023
1 parent a5fdb25 commit 32b17e3
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 17 deletions.
20 changes: 12 additions & 8 deletions auth/jwt.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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()
Expand All @@ -119,22 +119,26 @@ 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)

nowTime := supporttime.Now()
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)
Expand Down
10 changes: 5 additions & 5 deletions auth/session.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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 {
Expand All @@ -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 {
Expand Down
14 changes: 10 additions & 4 deletions contracts/auth/auth.go
Original file line number Diff line number Diff line change
@@ -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
}
Expand Down

0 comments on commit 32b17e3

Please sign in to comment.