From e831ad6bf6b86deba9de869979be0cf751afe424 Mon Sep 17 00:00:00 2001 From: weloe <1345895607@qq.com> Date: Sat, 6 May 2023 23:37:13 +0800 Subject: [PATCH] feat: add usage example --- Readme.md | 105 ++++++++++++++++++++++++++++++++++++++++ examples/http-server.go | 61 +++++++++++++++++++++++ log/default_logger.go | 2 +- model/function.go | 5 +- 4 files changed, 171 insertions(+), 2 deletions(-) create mode 100644 Readme.md create mode 100644 examples/http-server.go diff --git a/Readme.md b/Readme.md new file mode 100644 index 0000000..6a52715 --- /dev/null +++ b/Readme.md @@ -0,0 +1,105 @@ +# Token-Go + +This library focuses on solving login authentication problems, such as: login, multi-account login, shared token, logout, kickout ... + +## Installation + +``` +go get github.com/weloe/token-go +``` + +## Simple Example + +```go +import ( + "fmt" + tokenGo "github.com/weloe/token-go" + "log" + "net/http" +) + +var enforcer *tokenGo.Enforcer + +func main() { + var err error + // use default adapter + adapter := tokenGo.NewDefaultAdapter() + enforcer, err = tokenGo.NewEnforcer(adapter) + // enable logger + enforcer.EnableLog() + if err != nil { + log.Fatal(err) + } + + http.HandleFunc("/user/login", Login) + http.HandleFunc("/user/logout", Logout) + http.HandleFunc("/user/isLogin", IsLogin) + http.HandleFunc("/user/kickout", Kickout) + + log.Fatal(http.ListenAndServe(":8081", nil)) +} + +func Login(w http.ResponseWriter, req *http.Request) { + token, err := enforcer.Login("1", tokenGo.NewHttpContext(req, w)) + if err != nil { + fmt.Fprintf(w, "Login error: %s\n", err) + } + fmt.Fprintf(w, "token: %s\n", token) +} + +func Logout(w http.ResponseWriter, req *http.Request) { + err := enforcer.Logout(tokenGo.NewHttpContext(req, w)) + if err != nil { + fmt.Fprintf(w, "Logout error: %s\n", err) + } + fmt.Fprintf(w, "logout success") +} + +func IsLogin(w http.ResponseWriter, req *http.Request) { + login, err := enforcer.IsLogin(tokenGo.NewHttpContext(req, w)) + if err != nil { + fmt.Fprintf(w, "IsLogin() = %v: %v", login, err) + } + fmt.Fprintf(w, "IsLogin() = %v", login) +} + +func Kickout(w http.ResponseWriter, req *http.Request) { + err := enforcer.Kickout(req.URL.Query().Get("id"), "") + if err != nil { + fmt.Fprintf(w, "error: %s\n", err) + } + fmt.Fprintf(w, "logout success") +} +``` + +## Custom TokenConfig + +```go +import ( + "fmt" + tokenGo "github.com/weloe/token-go" + "github.com/weloe/token-go/config" + "log" + "net/http" +) + +var enforcer *tokenGo.Enforcer + +func main() { + var err error + // use default adapter + adapter := tokenGo.NewDefaultAdapter() + tokenConfig := &config.TokenConfig{ + TokenName: "uuid", + Timeout: 60, + IsReadCookie: true, + IsReadHeader: true, + IsReadBody: false, + IsConcurrent: true, + IsShare: true, + MaxLoginCount: -1, + } + enforcer, err = tokenGo.NewEnforcer(tokenConfig, adapter) +} +``` + diff --git a/examples/http-server.go b/examples/http-server.go new file mode 100644 index 0000000..72ce801 --- /dev/null +++ b/examples/http-server.go @@ -0,0 +1,61 @@ +package main + +import ( + "fmt" + tokenGo "github.com/weloe/token-go" + "log" + "net/http" +) + +var enforcer *tokenGo.Enforcer + +func main() { + var err error + // use default adapter + adapter := tokenGo.NewDefaultAdapter() + enforcer, err = tokenGo.NewEnforcer(adapter) + // enable logger + enforcer.EnableLog() + if err != nil { + log.Fatal(err) + } + + http.HandleFunc("/user/login", Login) + http.HandleFunc("/user/logout", Logout) + http.HandleFunc("/user/isLogin", IsLogin) + http.HandleFunc("/user/kickout", Kickout) + + log.Fatal(http.ListenAndServe(":8081", nil)) +} + +func Login(w http.ResponseWriter, req *http.Request) { + token, err := enforcer.Login("1", tokenGo.NewHttpContext(req, w)) + if err != nil { + fmt.Fprintf(w, "Login error: %s\n", err) + } + fmt.Fprintf(w, "token: %s\n", token) +} + +func Logout(w http.ResponseWriter, req *http.Request) { + err := enforcer.Logout(tokenGo.NewHttpContext(req, w)) + if err != nil { + fmt.Fprintf(w, "Logout error: %s\n", err) + } + fmt.Fprintf(w, "logout success") +} + +func IsLogin(w http.ResponseWriter, req *http.Request) { + login, err := enforcer.IsLogin(tokenGo.NewHttpContext(req, w)) + if err != nil { + fmt.Fprintf(w, "IsLogin() = %v: %v", login, err) + } + fmt.Fprintf(w, "IsLogin() = %v", login) +} + +func Kickout(w http.ResponseWriter, req *http.Request) { + err := enforcer.Kickout(req.URL.Query().Get("id"), "") + if err != nil { + fmt.Fprintf(w, "error: %s\n", err) + } + fmt.Fprintf(w, "logout success") +} diff --git a/log/default_logger.go b/log/default_logger.go index da9eaff..2c15f00 100644 --- a/log/default_logger.go +++ b/log/default_logger.go @@ -23,7 +23,7 @@ func (d *DefaultLogger) Login(loginType string, id interface{}, tokenValue strin if !d.enable { return } - log.Printf("LoginByModel: loginId = %v, loginType = %v, tokenValue = %v, "+ + log.Printf("Login: loginId = %v, loginType = %v, tokenValue = %v, "+ "loginMode = %v", id, loginType, tokenValue, loginModel) } diff --git a/model/function.go b/model/function.go index d1d6077..99addbc 100644 --- a/model/function.go +++ b/model/function.go @@ -13,6 +13,9 @@ type GenerateTokenFunc struct { } func (g *GenerateTokenFunc) Exec(tokenForm string) (string, error) { + if tokenForm == "" { + return "", errors.New("GenerateToken failed: tokenStyle is nil") + } handlerFunc, err := g.GetFunction(tokenForm) if err != nil { return "", err @@ -30,7 +33,7 @@ func (g *GenerateTokenFunc) GetFunction(tokenForm string) (GenerateFunc, error) return nil, errors.New("GetFunction() failed: load func error") } if value == nil { - return nil, errors.New("GetFunction() failed: func doesn't exist") + return nil, errors.New("GetFunction() failed: this tokenStyle generate func doesn't exist") } handlerFunc := value.(GenerateFunc) return handlerFunc, nil