A login authentication library. Extensions: https://github.com/weloe/token-go-extensions
Go to file
2024-06-18 19:08:17 +08:00
.github/workflows feat: update workflow and add Readme 2023-08-24 00:41:53 +08:00
auth feat: add simple auth api 2023-05-11 02:05:06 +08:00
config feat: support double token 2023-11-01 04:32:05 +08:00
constant feat: support double token 2023-11-01 04:32:05 +08:00
ctx fix: fix set cookie error, lint error and update default token name to ''Tokengo' 2023-06-06 06:03:16 +08:00
errors feat: improve code, add errors 2023-10-12 16:31:54 +08:00
examples feat: add QRCode example 2023-10-17 17:47:08 +08:00
log refactor: DefaultAdapter add timer enable 2023-10-15 22:51:49 +08:00
model feat: add device manager api 2023-11-06 00:54:30 +08:00
persist feat: update Serialize 2024-06-18 19:08:17 +08:00
sso feat: update annotation 2023-10-15 01:19:22 +08:00
util fix: util.InterfaceToBytes convert error 2024-06-18 19:01:31 +08:00
.gitignore Init gitignore,workflows 2023-04-30 20:46:25 +08:00
enforcer_auth_api_test.go feat: improve test case 2023-10-12 17:56:29 +08:00
enforcer_auth_api.go feat: add simple auth api 2023-05-11 02:05:06 +08:00
enforcer_distributed.go feat: add Dispatcher and UpdatableWatcher 2023-10-21 01:33:49 +08:00
enforcer_interface.go refactor: simplify parameters 2023-12-04 00:38:27 +08:00
enforcer_internal_api.go refactor: extract deleteRedundantTokenSign method 2023-11-04 19:15:24 +08:00
enforcer_manager_api_test.go feat: update CreateTempToken,add CreateTempTokenByStyle 2023-10-28 00:35:02 +08:00
enforcer_manager_api.go fix: scanned token error https://github.com/weloe/token-go/issues/2 2024-06-06 17:53:11 +08:00
enforcer_synced.go feat: add synced enforcer 2023-11-02 05:11:03 +08:00
enforcer_test.go feat: add device manager api 2023-11-06 00:54:30 +08:00
enforcer.go refactor: simplify parameters 2023-12-04 00:38:27 +08:00
go.mod feat: add viper to implement read yaml,ini config 2023-05-10 03:29:04 +08:00
go.sum feat: add viper to implement read yaml,ini config 2023-05-10 03:29:04 +08:00
LICENSE Init gitignore,workflows 2023-04-30 20:46:25 +08:00
Readme.md feat: support double token 2023-11-01 04:32:05 +08:00

Token-Go

This library focuses on solving login authentication problems, such as: login, multi-account login, shared token login, token refresh, double token refresh, QR Code login, logout, kickout, banned, second auth, temp-token, SSO ...

Installation

go get github.com/weloe/token-go

Simple Example

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

The same user can only log in once: IsConcurrent = false && IsShare = false

The same user logs in multiple times and shares a token: IsConcurrent = true && IsShare = true

Multiple logins of the same user to multiple tokens: IsConcurrent = true && IsShare = false

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(adapter, tokenConfig)
}

You can also configure it using a yml or ini file like this

token-go/token_conf.ini at master · weloe/token-go · GitHub

token-go/token_conf.yaml at master · weloe/token-go · GitHub

Then use enforcer, err = tokenGo.NewEnforcer(adapter, filepath) to init.

Authorization

A simple permission verification method is also provided

type ACL interface {
	GetPermission(id string) []string
}
type RBAC interface {
	GetRole(id string) []string
}

Implement either of these two interfaces and call enforcer.SetAuth(model) After that, you can use these two APIs for permission verification

// implement RBAC
CheckRole(ctx ctx.Context, role string) error
// implement ACL
CheckPermission(ctx ctx.Context, permission string) error

example

type Auth struct {
}

func (m *Auth) GetRole(id string) []string {
	var arr = make([]string, 2)
	arr[1] = "user"
	return arr
}
func (m *Auth) GetPermission(id string) []string {
	var arr = make([]string, 2)
	arr[1] = "user::get"
	return arr
}


func main() {
	var err error
	// use default adapter
	adapter := tokenGo.NewDefaultAdapter()
	enforcer, err = tokenGo.NewEnforcer(adapter)
	// set auth
	enforcer.SetAuth(&Auth{})
	// enable logger
	enforcer.EnableLog()
	if err != nil {
		log.Fatal(err)
	}
	
	http.HandleFunc("/user/check", CheckAuth)
	
	log.Fatal(http.ListenAndServe(":8081", nil))
}

func CheckAuth(w http.ResponseWriter, req *http.Request) {
	ctx := tokenGo.NewHttpContext(req, w)
	err := enforcer.CheckRole(ctx, "user")
	if err != nil {
		fmt.Fprintf(w, "CheckRole() error: %s\n", err)
		return
	}
	err = enforcer.CheckPermission(ctx, "user::get")
	if err != nil {
		fmt.Fprintf(w, "CheckPermission() error: %s\n", err)
		return
	}
	fmt.Fprintf(w, "you have authorization")
}

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

Extensions

https://github.com/weloe/token-go-extensions

Adapter
RedisAdapter go get github.com/weloe/token-go-extensions/redis-adapter
Enforcer
StatelessEnforcer go get github.com/weloe/token-go-extensions/jwt

Documentation

https://github.com/weloe/token-go/wiki

Api

token_go package - github.com/weloe/token-go - Go Packages