From a3d97bece98c6c261c3c0a717957a17aff9c283c Mon Sep 17 00:00:00 2001 From: weloe <1345895607@qq.com> Date: Mon, 24 Jul 2023 12:43:27 +0800 Subject: [PATCH] feat: add sso-server, sso-client config examples --- Readme.md | 2 + examples/sso/sso-client-3/sso-client.go | 132 ++++++++++++++++++++++ examples/sso/sso-server/sso-server.go | 140 ++++++++++++++++++++++++ 3 files changed, 274 insertions(+) create mode 100644 examples/sso/sso-client-3/sso-client.go create mode 100644 examples/sso/sso-server/sso-server.go diff --git a/Readme.md b/Readme.md index c4dd494..409b1e9 100644 --- a/Readme.md +++ b/Readme.md @@ -190,7 +190,9 @@ func CheckAuth(w http.ResponseWriter, req *http.Request) { } ``` ## SSO +SSO-Server examples: https://github.com/weloe/token-go/blob/master/examples/sso/sso-server/sso-server.go +SSO-Client examples: https://github.com/weloe/token-go/blob/master/examples/sso/sso-client-3/sso-client.go ## Api diff --git a/examples/sso/sso-client-3/sso-client.go b/examples/sso/sso-client-3/sso-client.go new file mode 100644 index 0000000..2ca2bce --- /dev/null +++ b/examples/sso/sso-client-3/sso-client.go @@ -0,0 +1,132 @@ +package main + +import ( + "encoding/json" + "fmt" + tokenGo "github.com/weloe/token-go" + "github.com/weloe/token-go/config" + "github.com/weloe/token-go/model" + "github.com/weloe/token-go/sso" + "io" + "io/ioutil" + "log" + "net/http" + "strconv" + "strings" +) + +var enforcer *tokenGo.Enforcer + +var ssoEnforcer *sso.SsoEnforcer + +func main() { + var err error + // use default adapter + adapter := tokenGo.NewDefaultAdapter() + enforcer, err = tokenGo.NewEnforcer(adapter) + if err != nil { + log.Fatal(err) + } + // enable logger + enforcer.EnableLog() + ssoOptions := &config.SsoOptions{ + AuthUrl: "/sso/auth", + IsSlo: true, + IsHttp: true, + SloUrl: "/sso/signout", + CheckTicketUrl: "/sso/checkTicket", + ServerUrl: "http://token-go-sso-server.com:9000", + SendHttp: func(url string) (string, error) { + response, err := http.Get(url) + if err != nil { + log.Printf("http.Get() failed: %v", err) + return "", err + } + + defer func(Body io.ReadCloser) { + err = Body.Close() + if err != nil { + log.Printf("read response body failed: %v", err) + } + }(response.Body) + + body, err := ioutil.ReadAll(response.Body) + if err != nil { + log.Printf("ioutil.ReadAll() failed: %v", err) + return "", err + } + + return string(body), nil + }, + } + signOptions := &config.SignOptions{ + SecretKey: "kQwIOrYvnXmSDkwEiFngrKidMcdrgKor", + IsCheckNonce: true, + } + ssoEnforcer, err = sso.NewSsoEnforcer(&sso.Options{ + SsoOptions: ssoOptions, + SignOptions: signOptions, + Enforcer: enforcer, + }) + if err != nil { + log.Fatalf("NewSsoEnforcer() failed: %v", err) + } + + engine := new(Engine) + log.Fatal(http.ListenAndServe(":9001", engine)) +} + +// Engine is the uni handler for all requests +type Engine struct{} + +func (engine *Engine) ServeHTTP(w http.ResponseWriter, req *http.Request) { + if req.URL.String() == "/" { + isLogin, err := enforcer.IsLogin(tokenGo.NewHttpContext(req, w)) + if err != nil { + fmt.Fprintf(w, "enforcer.IsLogin() failed: %v", err) + return + } + response := "
isLogin = " + strconv.FormatBool(isLogin) + "
" + w.Header().Set("Content-Type", "text/html") + fmt.Fprint(w, response) + } else if strings.HasPrefix(req.URL.String(), "/sso/") { + res := ssoEnforcer.ClientDispatcher(tokenGo.NewHttpContext(req, w)) + + result, ok := res.(*model.Result) + if ok { + bytes, err := json.Marshal(result) + if err != nil { + fmt.Fprintf(w, "json.Marshal() = %v", err) + return + } + + _, err = w.Write(bytes) + if err != nil { + fmt.Fprintf(w, "w.Write() = %v", err) + return + } + return + } + html, ok := res.(string) + if ok { + w.Header().Set("Content-Type", "text/html") + fmt.Fprintf(w, "%s", html) + return + } + + bytes, err := json.Marshal(model.Ok()) + if err != nil { + fmt.Fprintf(w, "json.Marshal() = %v", err) + return + } + + _, err = w.Write(bytes) + if err != nil { + fmt.Fprintf(w, "w.Write() = %v", err) + return + } + + } else { + fmt.Fprintf(w, "not this api") + } +} diff --git a/examples/sso/sso-server/sso-server.go b/examples/sso/sso-server/sso-server.go new file mode 100644 index 0000000..e149148 --- /dev/null +++ b/examples/sso/sso-server/sso-server.go @@ -0,0 +1,140 @@ +package main + +import ( + "encoding/json" + "fmt" + tokenGo "github.com/weloe/token-go" + "github.com/weloe/token-go/config" + "github.com/weloe/token-go/ctx" + "github.com/weloe/token-go/model" + "github.com/weloe/token-go/sso" + "io" + "io/ioutil" + "log" + "net/http" + "strings" +) + +var enforcer *tokenGo.Enforcer + +var ssoEnforcer *sso.SsoEnforcer + +func main() { + var err error + // use default adapter + adapter := tokenGo.NewDefaultAdapter() + enforcer, err = tokenGo.NewEnforcer(adapter) + if err != nil { + log.Fatal(err) + } + // enable logger + enforcer.EnableLog() + ssoOptions := &config.SsoOptions{ + Mode: "", + TicketTimeout: 300, + AllowUrl: "*", + IsSlo: true, + + IsHttp: true, + ServerUrl: "http://token-go-sso-server.com:9000", + NotLoginView: func() interface{} { + msg := "not log in SSO-Server, please visit doLogin " + return msg + }, + DoLoginHandle: func(name string, pwd string, ctx ctx.Context) (interface{}, error) { + if name != "tokengo" { + return "name error", nil + } + if pwd != "123456" { + return "pwd error", nil + } + token, err := enforcer.Login("1001", ctx) + if err != nil { + return nil, err + } + return model.Ok().SetData(token), nil + }, + SendHttp: func(url string) (string, error) { + response, err := http.Get(url) + if err != nil { + log.Printf("http.Get() failed: %v", err) + return "", err + } + + defer func(Body io.ReadCloser) { + err = Body.Close() + if err != nil { + log.Printf("read response body failed: %v", err) + } + }(response.Body) + + body, err := ioutil.ReadAll(response.Body) + if err != nil { + log.Printf("ioutil.ReadAll() failed: %v", err) + return "", err + } + + return string(body), nil + }, + } + signOptions := &config.SignOptions{ + SecretKey: "kQwIOrYvnXmSDkwEiFngrKidMcdrgKor", + IsCheckNonce: true, + } + ssoEnforcer, err = sso.NewSsoEnforcer(&sso.Options{ + SsoOptions: ssoOptions, + SignOptions: signOptions, + Enforcer: enforcer, + }) + if err != nil { + log.Fatalf("NewSsoEnforcer() failed: %v", err) + } + engine := new(Engine) + log.Fatal(http.ListenAndServe(":9000", engine)) +} + +// Engine is the uni handler for all requests +type Engine struct{} + +func (engine *Engine) ServeHTTP(w http.ResponseWriter, req *http.Request) { + if strings.HasPrefix(req.URL.String(), "/sso/") { + res := ssoEnforcer.ServerDisPatcher(tokenGo.NewHttpContext(req, w)) + + result, ok := res.(*model.Result) + if ok { + bytes, err := json.Marshal(result) + if err != nil { + fmt.Fprintf(w, "json.Marshal() = %v", err) + return + } + + _, err = w.Write(bytes) + if err != nil { + fmt.Fprintf(w, "w.Write() = %v", err) + return + } + return + } + html, ok := res.(string) + if ok { + w.Header().Set("Content-Type", "text/html") + fmt.Fprintf(w, "%s", html) + return + } + + bytes, err := json.Marshal(model.Ok()) + if err != nil { + fmt.Fprintf(w, "json.Marshal() = %v", err) + return + } + + _, err = w.Write(bytes) + if err != nil { + fmt.Fprintf(w, "w.Write() = %v", err) + return + } + + } else { + fmt.Fprintf(w, "not this api") + } +}