Files
open-im-server/pkg/common/db/controller/auth.go
T

63 lines
2.0 KiB
Go
Raw Normal View History

2023-01-31 20:33:33 +08:00
package controller
2023-02-09 17:55:59 +08:00
import (
"context"
2023-03-23 19:02:20 +08:00
2023-03-16 10:46:06 +08:00
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/constant"
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/cache"
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/tokenverify"
"github.com/OpenIMSDK/Open-IM-Server/pkg/utils"
2023-03-01 15:32:26 +08:00
"github.com/golang-jwt/jwt/v4"
2023-02-09 17:55:59 +08:00
)
2023-01-31 20:33:33 +08:00
2023-03-01 15:32:26 +08:00
type AuthDatabase interface {
2023-02-09 17:55:59 +08:00
//结果为空 不返回错误
GetTokensWithoutError(ctx context.Context, userID, platform string) (map[string]int, error)
//创建token
CreateToken(ctx context.Context, userID string, platform string) (string, error)
}
2023-03-01 15:32:26 +08:00
type authDatabase struct {
2023-03-03 17:42:26 +08:00
cache cache.Model
2023-03-01 15:32:26 +08:00
accessSecret string
accessExpire int64
2023-02-09 17:55:59 +08:00
}
2023-03-03 17:42:26 +08:00
func NewAuthDatabase(cache cache.Model, accessSecret string, accessExpire int64) AuthDatabase {
2023-03-01 15:32:26 +08:00
return &authDatabase{cache: cache, accessSecret: accessSecret, accessExpire: accessExpire}
2023-02-09 17:55:59 +08:00
}
// 结果为空 不返回错误
2023-03-01 15:32:26 +08:00
func (a *authDatabase) GetTokensWithoutError(ctx context.Context, userID, platform string) (map[string]int, error) {
return a.cache.GetTokensWithoutError(ctx, userID, platform)
2023-02-09 17:55:59 +08:00
}
// 创建token
2023-03-01 15:32:26 +08:00
func (a *authDatabase) CreateToken(ctx context.Context, userID string, platform string) (string, error) {
tokens, err := a.cache.GetTokensWithoutError(ctx, userID, platform)
if err != nil {
return "", err
}
var deleteTokenKey []string
for k, v := range tokens {
_, err = tokenverify.GetClaimFromToken(k)
if err != nil || v != constant.NormalToken {
deleteTokenKey = append(deleteTokenKey, k)
}
}
if len(deleteTokenKey) != 0 {
err := a.cache.DeleteTokenByUidPid(ctx, userID, platform, deleteTokenKey)
if err != nil {
return "", err
}
}
claims := tokenverify.BuildClaims(userID, platform, a.accessExpire)
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
tokenString, err := token.SignedString([]byte(a.accessSecret))
if err != nil {
return "", utils.Wrap(err, "")
}
return tokenString, a.cache.AddTokenFlag(ctx, userID, constant.PlatformNameToID(platform), tokenString, constant.NormalToken)
2023-01-31 20:33:33 +08:00
}