mirror of
https://github.com/weloe/token-go.git
synced 2025-10-04 23:22:41 +08:00
feat: add login logout feature and test
This commit is contained in:
138
enforcer_internal_api.go
Normal file
138
enforcer_internal_api.go
Normal file
@@ -0,0 +1,138 @@
|
||||
package token_go
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"github.com/weloe/token-go/constant"
|
||||
"github.com/weloe/token-go/model"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
// createLoginToken create by config.TokenConfig and model.Login
|
||||
func (e *Enforcer) createLoginToken(id string, loginModel *model.Login) (string, error) {
|
||||
tokenConfig := e.config
|
||||
var tokenValue string
|
||||
var err error
|
||||
// if isConcurrent is false,
|
||||
if !tokenConfig.IsConcurrent {
|
||||
err = e.Replaced(id, loginModel.Device)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
}
|
||||
|
||||
// if loginModel set token, return directly
|
||||
if loginModel.Token != "" {
|
||||
return loginModel.Token, nil
|
||||
}
|
||||
|
||||
// if share token
|
||||
if tokenConfig.IsConcurrent && tokenConfig.IsShare {
|
||||
// reuse the previous token.
|
||||
if v := e.GetSession(id); v != nil {
|
||||
tokenValue = v.GetLastTokenByDevice(loginModel.Device)
|
||||
if tokenValue != "" {
|
||||
return tokenValue, nil
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// create new token
|
||||
tokenValue, err = e.generateFunc.Exec(tokenConfig.TokenStyle)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return tokenValue, nil
|
||||
}
|
||||
|
||||
// responseToken set token to cookie or header
|
||||
func (e *Enforcer) responseToken(tokenValue string, loginModel *model.Login) error {
|
||||
|
||||
tokenConfig := e.config
|
||||
|
||||
// set token to cookie
|
||||
if tokenConfig.IsReadCookie {
|
||||
cookieTimeout := tokenConfig.Timeout
|
||||
if loginModel.IsLastingCookie {
|
||||
cookieTimeout = -1
|
||||
}
|
||||
// add cookie use tokenConfig.CookieConfig
|
||||
e.webCtx.Response().AddCookie(tokenConfig.TokenName,
|
||||
tokenValue,
|
||||
tokenConfig.CookieConfig.Path,
|
||||
tokenConfig.CookieConfig.Domain,
|
||||
cookieTimeout)
|
||||
}
|
||||
|
||||
// set token to header
|
||||
if loginModel.IsWriteHeader {
|
||||
e.webCtx.Response().SetHeader(tokenConfig.TokenName, tokenValue)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// logoutByToken clear token info
|
||||
func (e *Enforcer) logoutByToken(token string) error {
|
||||
var err error
|
||||
// delete token-id
|
||||
id := e.adapter.GetStr(e.spliceTokenKey(token))
|
||||
if id == "" {
|
||||
return errors.New("not logged in")
|
||||
}
|
||||
// delete token-id
|
||||
err = e.adapter.Delete(e.spliceTokenKey(token))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
session := e.GetSession(id)
|
||||
if session != nil {
|
||||
// delete tokenSign
|
||||
session.RemoveTokenSign(token)
|
||||
}
|
||||
// check TokenSignList length, if length == 0, delete this session
|
||||
if session != nil && session.TokenSignList.Len() == 0 {
|
||||
err = e.deleteSession(id)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
e.logger.Logout(e.loginType, id, token)
|
||||
|
||||
if e.watcher != nil {
|
||||
e.watcher.Logout(e.loginType, id, token)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// validateValue validate if value is proper
|
||||
func (e *Enforcer) validateValue(str string) (bool, error) {
|
||||
i, err := strconv.Atoi(str)
|
||||
// if convert err return true
|
||||
if err != nil {
|
||||
return true, nil
|
||||
}
|
||||
if i == constant.BeReplaced {
|
||||
return false, errors.New("this account is replaced")
|
||||
}
|
||||
if i == constant.BeKicked {
|
||||
return false, errors.New("this account is kicked out")
|
||||
}
|
||||
if i == constant.BeBanned {
|
||||
return false, errors.New("this account is banned")
|
||||
}
|
||||
return true, nil
|
||||
}
|
||||
|
||||
// spliceSessionKey splice session-id key
|
||||
func (e *Enforcer) spliceSessionKey(id string) string {
|
||||
return e.config.TokenName + ":" + e.loginType + ":session:" + id
|
||||
}
|
||||
|
||||
// spliceTokenKey splice token-id key
|
||||
func (e *Enforcer) spliceTokenKey(id string) string {
|
||||
return e.config.TokenName + ":" + e.loginType + ":token:" + id
|
||||
}
|
Reference in New Issue
Block a user