108 lines
2.9 KiB
Go
Raw Normal View History

2024-12-01 18:04:02 +08:00
package impl
import (
"context"
2024-12-08 11:59:36 +08:00
"fmt"
2024-12-01 18:04:02 +08:00
2024-12-08 11:59:36 +08:00
"github.com/infraboard/mcube/v2/exception"
2024-12-15 11:36:22 +08:00
"github.com/infraboard/mcube/v2/ioc"
2024-12-08 11:59:36 +08:00
"github.com/infraboard/mcube/v2/ioc/config/datasource"
2024-12-15 15:57:48 +08:00
"github.com/infraboard/mcube/v2/ioc/config/log"
2024-12-01 18:04:02 +08:00
"gitlab.com/go-course-project/go17/vblog/apps/token"
2024-12-08 11:59:36 +08:00
"gitlab.com/go-course-project/go17/vblog/apps/user"
2024-12-01 18:04:02 +08:00
)
2024-12-15 11:36:22 +08:00
func init() {
ioc.Controller().Registry(&TokenServiceImpl{})
2024-12-15 10:13:35 +08:00
}
2024-12-01 18:04:02 +08:00
// 定义一个struct, 用于实现 UserService就是刚才定义的接口
// 怎么才能判断这个结构体没有实现这个接口
type TokenServiceImpl struct {
2024-12-15 11:36:22 +08:00
ioc.ObjectImpl
2024-12-08 11:59:36 +08:00
// user service
user user.AdminService
2024-12-15 15:57:48 +08:00
// 如果你控制器有一些配置
DefaultExpiredTTL int `json:"default_expired_ttl" yaml:"default_expired_ttl" toml:"default_expired_ttl" env:"DEFAULT_EXPIRED_TTL"`
2024-12-01 18:04:02 +08:00
}
2024-12-15 11:36:22 +08:00
func (*TokenServiceImpl) Name() string {
return token.AppName
}
// 他需要自己去获取依赖通过ioc
func (i *TokenServiceImpl) Init() error {
i.user = user.GetService()
2024-12-15 15:57:48 +08:00
log.L().Debug().Msgf("DefaultExpiredTTL: %d", i.DefaultExpiredTTL)
2024-12-15 11:36:22 +08:00
return nil
}
2024-12-01 18:04:02 +08:00
// IssueToken implements token.Service.
2024-12-08 11:59:36 +08:00
func (t *TokenServiceImpl) IssueToken(ctx context.Context, in *token.IssueTokenRequest) (*token.Token, error) {
if err := in.Validate(); err != nil {
return nil, exception.NewBadRequest("参数校验异常: %s", err)
}
// 1. 查询用户
u, err := t.user.DescribeUser(ctx, &user.DescribeUserRequest{
DescribeBy: user.DESCRIBE_BY_USERNAME,
Value: in.Username,
})
if err != nil {
2025-01-12 10:14:49 +08:00
if exception.IsNotFoundError(err) {
return nil, exception.NewUnauthorized("用户名或者密码错误").WithData(err)
}
2024-12-08 11:59:36 +08:00
return nil, err
}
// 2. 比对密码
if err := u.CheckPassword(in.Password); err != nil {
2025-01-05 17:15:05 +08:00
return nil, exception.NewUnauthorized("用户名或者密码错误").WithData(err)
2024-12-08 11:59:36 +08:00
}
// 3. 颁发Token
tk := token.NewToken(fmt.Sprintf("%d", u.Id)).SetRefUserName(u.Username)
2024-12-15 12:10:11 +08:00
// if in.RememberMe {
// tk.AccessTokenExpireAt
// }
2024-12-08 11:59:36 +08:00
if err := datasource.DBFromCtx(ctx).Create(tk).Error; err != nil {
return nil, err
}
return tk, nil
2024-12-01 18:04:02 +08:00
}
// RevolkToken implements token.Service.
func (t *TokenServiceImpl) RevolkToken(context.Context, *token.RevolkTokenRequest) (*token.Token, error) {
panic("unimplemented")
}
// ValidateToken implements token.Service.
2024-12-08 11:59:36 +08:00
// 1. 这个令牌是不是我们发
// 2. 这个令牌有没有过期
func (t *TokenServiceImpl) ValidateToken(ctx context.Context, in *token.ValidateTokenRequest) (*token.Token, error) {
tk := &token.Token{}
if err := datasource.DBFromCtx(ctx).Where("access_token = ?", in.AccessToken).Take(tk).Error; err != nil {
return nil, err
}
if err := tk.IsAccessTokenExpired(); err != nil {
return nil, err
}
2024-12-08 18:10:55 +08:00
// 1. 补充用户信息
u, err := t.user.DescribeUser(ctx, &user.DescribeUserRequest{
DescribeBy: user.DESCRIBE_BY_ID,
Value: tk.RefUserId,
})
if err != nil {
return nil, err
}
tk.RefUserName = u.Username
2024-12-08 11:59:36 +08:00
return tk, nil
2024-12-01 18:04:02 +08:00
}