package tokenservicelogic import ( "ark-permission/gen_result/pb/permission" "ark-permission/internal/svc" ers "code.30cm.net/wanderland/library-go/errors" "context" "github.com/zeromicro/go-zero/core/logx" ) type CancelTokenLogic struct { ctx context.Context svcCtx *svc.ServiceContext logx.Logger } func NewCancelTokenLogic(ctx context.Context, svcCtx *svc.ServiceContext) *CancelTokenLogic { return &CancelTokenLogic{ ctx: ctx, svcCtx: svcCtx, Logger: logx.WithContext(ctx), } } type cancelTokenReq struct { Token string `json:"token" validate:"required"` } // CancelToken 取消 Token,也包含他裡面的 One Time Toke func (l *CancelTokenLogic) CancelToken(in *permission.CancelTokenReq) (*permission.OKResp, error) { // 驗證所需 if err := l.svcCtx.Validate.ValidateAll(&cancelTokenReq{ Token: in.GetToken(), }); err != nil { return nil, ers.InvalidFormat(err.Error()) } claims, err := parseClaims(in.GetToken(), l.svcCtx.Config.Token.Secret, false) if err != nil { logx.WithCallerSkip(1).WithFields( logx.Field("func", "parseClaims"), ).Error(err.Error()) return nil, err } token, err := l.svcCtx.TokenRedisRepo.GetAccessTokenByID(l.ctx, claims.ID()) if err != nil { logx.WithCallerSkip(1).WithFields( logx.Field("func", "TokenRedisRepo.GetByAccess"), logx.Field("claims", claims), ).Error(err.Error()) return nil, err } err = l.svcCtx.TokenRedisRepo.Delete(l.ctx, token) if err != nil { logx.WithCallerSkip(1).WithFields( logx.Field("func", "TokenRedisRepo.Delete"), logx.Field("req", token), ).Error(err.Error()) return nil, err } return &permission.OKResp{}, nil }