mirror of
https://github.com/casdoor/casdoor.git
synced 2025-05-23 02:35:49 +08:00
feat: add token hash to improve performance
This commit is contained in:
parent
2ce8c93ead
commit
a5f9f61381
@ -17,6 +17,7 @@ package object
|
|||||||
import (
|
import (
|
||||||
"crypto/sha256"
|
"crypto/sha256"
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
|
"encoding/hex"
|
||||||
"fmt"
|
"fmt"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@ -54,6 +55,8 @@ type Token struct {
|
|||||||
Code string `xorm:"varchar(100) index" json:"code"`
|
Code string `xorm:"varchar(100) index" json:"code"`
|
||||||
AccessToken string `xorm:"mediumtext" json:"accessToken"`
|
AccessToken string `xorm:"mediumtext" json:"accessToken"`
|
||||||
RefreshToken string `xorm:"mediumtext" json:"refreshToken"`
|
RefreshToken string `xorm:"mediumtext" json:"refreshToken"`
|
||||||
|
AccessTokenHash string `xorm:"varchar(100) index" json:"accessTokenHash"`
|
||||||
|
RefreshTokenHash string `xorm:"varchar(100) index" json:"refreshTokenHash"`
|
||||||
ExpiresIn int `json:"expiresIn"`
|
ExpiresIn int `json:"expiresIn"`
|
||||||
Scope string `xorm:"varchar(100)" json:"scope"`
|
Scope string `xorm:"varchar(100)" json:"scope"`
|
||||||
TokenType string `xorm:"varchar(100)" json:"tokenType"`
|
TokenType string `xorm:"varchar(100)" json:"tokenType"`
|
||||||
@ -159,6 +162,24 @@ func (token *Token) GetId() string {
|
|||||||
return fmt.Sprintf("%s/%s", token.Owner, token.Name)
|
return fmt.Sprintf("%s/%s", token.Owner, token.Name)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getTokenHash(input string) string {
|
||||||
|
hash := sha256.Sum256([]byte(input))
|
||||||
|
res := hex.EncodeToString(hash[:])
|
||||||
|
if len(res) > 64 {
|
||||||
|
return res[:64]
|
||||||
|
}
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
func (token *Token) popularHashes() {
|
||||||
|
if token.AccessTokenHash == "" && token.AccessToken != "" {
|
||||||
|
token.AccessTokenHash = getTokenHash(token.AccessToken)
|
||||||
|
}
|
||||||
|
if token.RefreshTokenHash == "" && token.RefreshToken != "" {
|
||||||
|
token.RefreshTokenHash = getTokenHash(token.RefreshToken)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func UpdateToken(id string, token *Token) (bool, error) {
|
func UpdateToken(id string, token *Token) (bool, error) {
|
||||||
owner, name := util.GetOwnerAndNameFromId(id)
|
owner, name := util.GetOwnerAndNameFromId(id)
|
||||||
if t, err := getToken(owner, name); err != nil {
|
if t, err := getToken(owner, name); err != nil {
|
||||||
@ -167,6 +188,8 @@ func UpdateToken(id string, token *Token) (bool, error) {
|
|||||||
return false, nil
|
return false, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
token.popularHashes()
|
||||||
|
|
||||||
affected, err := ormer.Engine.ID(core.PK{owner, name}).AllCols().Update(token)
|
affected, err := ormer.Engine.ID(core.PK{owner, name}).AllCols().Update(token)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
return false, err
|
||||||
@ -176,6 +199,8 @@ func UpdateToken(id string, token *Token) (bool, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func AddToken(token *Token) (bool, error) {
|
func AddToken(token *Token) (bool, error) {
|
||||||
|
token.popularHashes()
|
||||||
|
|
||||||
affected, err := ormer.Engine.Insert(token)
|
affected, err := ormer.Engine.Insert(token)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
return false, err
|
||||||
@ -194,7 +219,7 @@ func DeleteToken(token *Token) (bool, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func ExpireTokenByAccessToken(accessToken string) (bool, *Application, *Token, error) {
|
func ExpireTokenByAccessToken(accessToken string) (bool, *Application, *Token, error) {
|
||||||
token := Token{AccessToken: accessToken}
|
token := Token{AccessTokenHash: getTokenHash(accessToken)}
|
||||||
existed, err := ormer.Engine.Get(&token)
|
existed, err := ormer.Engine.Get(&token)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, nil, nil, err
|
return false, nil, nil, err
|
||||||
@ -220,7 +245,7 @@ func ExpireTokenByAccessToken(accessToken string) (bool, *Application, *Token, e
|
|||||||
|
|
||||||
func GetTokenByAccessToken(accessToken string) (*Token, error) {
|
func GetTokenByAccessToken(accessToken string) (*Token, error) {
|
||||||
// Check if the accessToken is in the database
|
// Check if the accessToken is in the database
|
||||||
token := Token{AccessToken: accessToken}
|
token := Token{AccessTokenHash: getTokenHash(accessToken)}
|
||||||
existed, err := ormer.Engine.Get(&token)
|
existed, err := ormer.Engine.Get(&token)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -439,7 +464,7 @@ func RefreshToken(grantType string, refreshToken string, scope string, clientId
|
|||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
// check whether the refresh token is valid, and has not expired.
|
// check whether the refresh token is valid, and has not expired.
|
||||||
token := Token{RefreshToken: refreshToken}
|
token := Token{RefreshTokenHash: getTokenHash(refreshToken)}
|
||||||
existed, err := ormer.Engine.Get(&token)
|
existed, err := ormer.Engine.Get(&token)
|
||||||
if err != nil || !existed {
|
if err != nil || !existed {
|
||||||
return &TokenError{
|
return &TokenError{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user