template-monorepo/internal/logic/auth/logout_logic.go

55 lines
1.3 KiB
Go

package auth
import (
"context"
"strings"
domauth "gateway/internal/model/auth/domain/usecase"
"gateway/internal/svc"
"gateway/internal/types"
"github.com/zeromicro/go-zero/core/logx"
)
type LogoutLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewLogoutLogic(ctx context.Context, svcCtx *svc.ServiceContext) *LogoutLogic {
return &LogoutLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *LogoutLogic) Logout() (*types.LogoutData, error) {
if l.svcCtx.AuthToken == nil {
return nil, errb.SysNotImplemented("auth token not configured")
}
raw := bearerAccessToken(l.ctx)
if raw == "" {
return nil, errb.AuthUnauthorized("missing access token")
}
if err := l.svcCtx.AuthToken.Logout(l.ctx, &domauth.LogoutRequest{AccessToken: raw}); err != nil {
return nil, err
}
return &types.LogoutData{OK: true}, nil
}
type bearerTokenContextKey struct{}
// WithBearerAccessToken stores the raw Bearer access token for auth logic (e.g. logout).
func WithBearerAccessToken(ctx context.Context, token string) context.Context {
return context.WithValue(ctx, bearerTokenContextKey{}, strings.TrimSpace(token))
}
func bearerAccessToken(ctx context.Context) string {
if v, ok := ctx.Value(bearerTokenContextKey{}).(string); ok {
return strings.TrimSpace(v)
}
return ""
}