add auth
This commit is contained in:
@@ -0,0 +1,86 @@
|
||||
package grpc
|
||||
|
||||
import (
|
||||
"context"
|
||||
"log"
|
||||
"strings"
|
||||
|
||||
"datarush/internal/auth/domain"
|
||||
"datarush/internal/auth/service"
|
||||
pb "datarush/pkg/api/auth"
|
||||
|
||||
"google.golang.org/grpc/codes"
|
||||
"google.golang.org/grpc/metadata"
|
||||
"google.golang.org/grpc/status"
|
||||
)
|
||||
|
||||
type AuthHandler struct {
|
||||
pb.UnimplementedAuthServiceServer
|
||||
authService *service.AuthService
|
||||
}
|
||||
|
||||
func NewAuthHandler(authService *service.AuthService) *AuthHandler {
|
||||
return &AuthHandler{
|
||||
authService: authService,
|
||||
}
|
||||
}
|
||||
|
||||
func (h *AuthHandler) SignUp(ctx context.Context, req *pb.SignUpRequest) (*pb.SignUpResponse, error) {
|
||||
token, err := h.authService.SignUp(ctx, req.Email, req.Username, req.Password)
|
||||
if err != nil {
|
||||
log.Printf("signup error: %v", err)
|
||||
switch err {
|
||||
case domain.ErrUserAlreadyExists:
|
||||
return nil, status.Error(codes.AlreadyExists, "user already exists")
|
||||
default:
|
||||
return nil, status.Error(codes.Internal, "internal error")
|
||||
}
|
||||
}
|
||||
|
||||
return &pb.SignUpResponse{Token: token}, nil
|
||||
}
|
||||
|
||||
func (h *AuthHandler) SignIn(ctx context.Context, req *pb.SignInRequest) (*pb.SignInResponse, error) {
|
||||
token, err := h.authService.SignIn(ctx, req.Email, req.Password)
|
||||
if err != nil {
|
||||
log.Printf("signin error: %v", err)
|
||||
switch err {
|
||||
case domain.ErrInvalidPassword, domain.ErrUserNotFound:
|
||||
return nil, status.Error(codes.Unauthenticated, "invalid credentials")
|
||||
default:
|
||||
return nil, status.Error(codes.Internal, "internal error")
|
||||
}
|
||||
}
|
||||
|
||||
return &pb.SignInResponse{Token: token}, nil
|
||||
}
|
||||
|
||||
func (h *AuthHandler) ValidateToken(ctx context.Context, req *pb.ValidateTokenRequest) (*pb.ValidateTokenResponse, error) {
|
||||
token := req.Token
|
||||
|
||||
// If token is empty, try to get it from Authorization header (for gRPC-Gateway)
|
||||
if token == "" {
|
||||
md, ok := metadata.FromIncomingContext(ctx)
|
||||
if ok {
|
||||
authHeaders := md.Get("authorization")
|
||||
if len(authHeaders) > 0 {
|
||||
parts := strings.Split(authHeaders[0], " ")
|
||||
if len(parts) == 2 && parts[0] == "Bearer" {
|
||||
token = parts[1]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if token == "" {
|
||||
return nil, status.Error(codes.Unauthenticated, "missing token")
|
||||
}
|
||||
|
||||
user, err := h.authService.ValidateToken(ctx, token)
|
||||
if err != nil {
|
||||
log.Printf("validate token error: %v", err)
|
||||
return nil, status.Error(codes.Unauthenticated, "invalid token")
|
||||
}
|
||||
|
||||
return &pb.ValidateTokenResponse{UserId: user.ID.String()}, nil
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
package grpc
|
||||
|
||||
import (
|
||||
"log"
|
||||
)
|
||||
|
||||
type ErrorHandler struct{}
|
||||
|
||||
func (e *ErrorHandler) Handle(err error) {
|
||||
if err != nil {
|
||||
log.Printf("error: %v", err)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user