package v1 import ( "context" "errors" "gitea.badhouseplants.net/softplayer/softplayer-backend/internal/controllers" tokens "gitea.badhouseplants.net/softplayer/softplayer-go-proto/pkg/tokens/v1" "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/metadata" "google.golang.org/grpc/status" "google.golang.org/protobuf/types/known/emptypb" ) // var _ tokens.PublicTokensServiceServer = (*PublicTokensServer)(nil) type PublicTokensServer struct { tokens.UnimplementedPublicTokensServiceServer tokenCtrl *controllers.TokenController authorizationCtrl *controllers.AuthController } func NewPublicTokensServer( tokenCtrl *controllers.TokenController, authorizationCtrl *controllers.AuthController, ) *PublicTokensServer { return &PublicTokensServer{ tokenCtrl: tokenCtrl, authorizationCtrl: authorizationCtrl, } } func (srv *PublicTokensServer) AuthenticateWithToken(ctx context.Context, in *tokens.AuthenticateWithTokenRequest) (*emptypb.Empty, error) { tokenAuthRes, err := srv.tokenCtrl.AuthenticateWithToken(ctx, in.TokenValue.Token) if err != nil { if errors.Is(err, controllers.ErrBadToken) { return nil, status.Error(codes.Unauthenticated, "Token is not valid") } if errors.Is(err, controllers.ErrServerError) { return nil, status.Error(codes.Internal, "Something is broken on our side") } return nil, status.Error(codes.Aborted, "Couldn't authorize") } jwtData := &controllers.JWTData{ UserID: tokenAuthRes.UserID, TokenType: controllers.TokenTypeAccess, TokenAud: controllers.TokenAudToken, Scope: tokenAuthRes.Scope, } accessToken, _, err := srv.authorizationCtrl.GenerateToken(jwtData) if err != nil { return nil, status.Error(codes.Aborted, "Couldn't generate an access token") } header := metadata.New(map[string]string{ "X-Access-Token": accessToken, }) if err := grpc.SetHeader(ctx, header); err != nil { return nil, status.Error(codes.Aborted, "Couldn't set metadata") } return &emptypb.Empty{}, nil }