2024-12-08 18:10:55 +08:00

83 lines
2.2 KiB
Go

package impl
import (
"context"
"fmt"
"github.com/infraboard/mcube/v2/exception"
"github.com/infraboard/mcube/v2/ioc/config/datasource"
"gitlab.com/go-course-project/go17/vblog/apps/token"
"gitlab.com/go-course-project/go17/vblog/apps/user"
"gitlab.com/go-course-project/go17/vblog/apps/user/impl"
)
var TokenService token.Service = &TokenServiceImpl{
user: impl.UserService,
}
// 定义一个struct, 用于实现 UserService就是刚才定义的接口
// 怎么才能判断这个结构体没有实现这个接口
type TokenServiceImpl struct {
// user service
user user.AdminService
}
// IssueToken implements token.Service.
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 {
return nil, err
}
// 2. 比对密码
if err := u.CheckPassword(in.Password); err != nil {
return nil, err
}
// 3. 颁发Token
tk := token.NewToken(fmt.Sprintf("%d", u.Id)).SetRefUserName(u.Username)
if err := datasource.DBFromCtx(ctx).Create(tk).Error; err != nil {
return nil, err
}
return tk, nil
}
// RevolkToken implements token.Service.
func (t *TokenServiceImpl) RevolkToken(context.Context, *token.RevolkTokenRequest) (*token.Token, error) {
panic("unimplemented")
}
// ValidateToken implements token.Service.
// 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
}
// 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
return tk, nil
}