Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+717новых вакансий за сутки·60 871вакансия открыта сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании5 951
РезюмеAIПодготовкаСтатьи
ТарифыТарифы
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 391 кандидат открыт к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python9 224
  • Облачные технологии4 076
  • QA вакансии1 588
  • Android1 322
  • Инженер данных805
  • Продакт-менеджер368

Разработка

  • Backend вакансии1 317
  • iOS1 239
  • AI вакансии608
  • Fullstack вакансии523
  • Frontend вакансии456
  • Mobile вакансии28

По стеку

  • Go5 445
  • Java3 175
  • Kotlin1 119
  • Node.js1 026
  • Rust949
  • .NET666
  • PHP311
  • C#210
  • C++204

DevOps и инфраструктура

  • DevOps вакансии2 713
  • Kubernetes2 308
  • Linux-инфраструктура1 890
  • Terraform / IaC1 406
  • CI/CD842
  • Мониторинг и Observability645
  • SRE226
  • Кибербезопасность84

Аналитика и данные

  • Аналитик данных483
  • Data Scientist469
  • Бизнес-аналитик349
  • Системный аналитик48

Другие направления

  • Проджект-менеджер139
  • UI/UX дизайн71
  • Ручное тестирование14

По регионам

  • Вакансии в США24 791
  • Вакансии в Европе9 439
  • Работа в России2 924
  • Вакансии в Канаде2 178

По формату

  • Удалённые вакансии43 505
  • Релокация в США24 791
  • Гибридная работа3 370
  • Офисная работа2 525

По уровню

  • Senior вакансии20 898
  • Middle вакансии12 438
  • Junior вакансии3 864

Сейчас нанимают

Все компании
  • Wise191 вакансия
  • Rakuten188 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Celonis48 вакансий
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме FiberВсе вопросы
FiberMiddleКодинг

Как реализовать middleware аутентификации (например, JWT) в Fiber?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

Используйте github.com/gofiber/contrib/jwt: зарегистрируйте jwtware.New(jwtware.Config{SigningKey: ...}) на защищённых маршрутах, а токен читайте из c.Locals("user").(*jwt.Token).

Установка зависимостей

// go get github.com/gofiber/contrib/jwt
// go get github.com/golang-jwt/jwt/v5

JWT-аутентификация в Fiber

Официальный contrib-пакет github.com/gofiber/contrib/jwt оборачивает библиотеку github.com/golang-jwt/jwt/v5 и предоставляет готовый middleware для проверки Bearer-токенов.

Полный рабочий пример

package main

import (
	"time"

	"github.com/gofiber/contrib/jwt"
	"github.com/gofiber/fiber/v2"
	gojwt "github.com/golang-jwt/jwt/v5"
)

var jwtSecret = []byte("supersecret")

type Claims struct {
	UserID uint   `json:"user_id"`
	Role   string `json:"role"`
	gojwt.RegisteredClaims
}

func main() {
	app := fiber.New()

	// Публичный маршрут — выдача токена
	app.Post("/login", loginHandler)

	// Группа защищённых маршрутов
	api := app.Group("/api", jwtware.New(jwtware.Config{
		SigningKey: jwtware.SigningKey{
			JWTAlg: jwtware.HS256,
			Key:    jwtSecret,
		},
		ErrorHandler: func(c *fiber.Ctx, err error) error {
			return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{
				"error": "invalid or expired token",
			})
		},
	}))

	api.Get("/profile", profileHandler)

	app.Listen(":3000")
}

func loginHandler(c *fiber.Ctx) error {
	// Упрощённая проверка (в реальности — сравнение хэша пароля)
	body := struct {
		Username string `json:"username"`
		Password string `json:"password"`
	}{}
	if err := c.BodyParser(&body); err != nil {
		return c.Status(400).JSON(fiber.Map{"error": "bad request"})
	}

	claims := Claims{
		UserID: 42,
		Role:   "admin",
		RegisteredClaims: gojwt.RegisteredClaims{
			ExpiresAt: gojwt.NewNumericDate(time.Now().Add(24 * time.Hour)),
			IssuedAt:  gojwt.NewNumericDate(time.Now()),
		},
	}
	token := gojwt.NewWithClaims(gojwt.SigningMethodHS256, claims)
	signed, err := token.SignedString(jwtSecret)
	if err != nil {
		return c.Status(500).JSON(fiber.Map{"error": "token generation failed"})
	}
	return c.JSON(fiber.Map{"token": signed})
}

func profileHandler(c *fiber.Ctx) error {
	// Извлекаем распарсенный токен из Locals
	token := c.Locals("user").(*gojwt.Token)
	claims := token.Claims.(gojwt.MapClaims)
	return c.JSON(fiber.Map{
		"user_id": claims["user_id"],
		"role":    claims["role"],
	})
}

Кастомный тип Claims

Для строгой типизации передайте Claims через jwtware.Config.Claims:

jwtware.New(jwtware.Config{
	SigningKey: jwtware.SigningKey{Key: jwtSecret},
	Claims:     &Claims{},
})

// В хэндлере:
claims := c.Locals("user").(*gojwt.Token).Claims.(*Claims)
fmt.Println(claims.UserID, claims.Role)

RS256 (асимметричный ключ)

import "crypto/rsa"

var publicKey *rsa.PublicKey // загружен из PEM-файла

jwtware.New(jwtware.Config{
	SigningKey: jwtware.SigningKey{
		JWTAlg: jwtware.RS256,
		Key:    publicKey,
	},
})

Подводные камни

  • HS256 с коротким секретом — секрет короче 32 байт легко брутфорсится; используйте случайные 64+ байта или переходите на RS256/ES256.
  • Отсутствие проверки exp — библиотека golang-jwt/jwt/v5 проверяет exp автоматически, но если вы парсите токен вручную с ParseWithClaims и передаёте WithoutClaimsValidation, срок действия не проверяется.
  • Хранение секрета в коде — никогда не хардкодьте секрет; читайте из переменной окружения или vault.
  • Порядок middleware: CORS перед JWT — preflight OPTIONS не содержит заголовка Authorization; JWT-middleware должен стоять после CORS, иначе preflight получит 401.
  • Тип значения в Locals — c.Locals("user") возвращает interface{}; приведение к неправильному типу вызовет панику; всегда проверяйте ok при type assertion.
  • Refresh-токены не включены — contrib/jwt только проверяет access-токен; логику refresh нужно реализовывать самостоятельно.
  • Ключ "user" в Locals перезаписывается — если несколько middleware пишут в c.Locals("user"), последний затрёт предыдущего; используйте уникальные ключи.
  • Утечка информации в ErrorHandler — не возвращайте текст ошибки JWT-библиотеки клиенту напрямую (может содержать внутренние детали); оборачивайте в общее сообщение.

Частые вопросы на собеседовании

  • В каких backend-проектах Fiber (Go framework) является сильным выбором, а где лучше выбрать более простой или другой стек?
  • Как понять, что проблема в сервисе связана с Fiber (Go framework), а не с базой, сетью, инфраструктурой или бизнес-логикой?
  • Проект на Fiber (Go framework) вырос из MVP в большой production-сервис. Какие проблемы архитектуры и сопровождения вы ожидаете увидеть?
  • Представьте, endpoint на Fiber (Go framework) иногда отвечает за секунды вместо миллисекунд. Как вы будете искать причину?

Типичные ошибки

  • Давать ответ про JWT middleware в Fiber только на уровне определения, не показывая поведение в реальном приложении.
  • Игнорировать границы ответственности вокруг темы «JWT middleware в Fiber»: кто отменяет работу, кто владеет ресурсом и где формируется ответ клиенту.
  • Не связывать JWT middleware в Fiber с observability, тестированием или безопасностью, когда это влияет на продакшен-поведение.

Что проверяет интервьюер

  • Точно объясняет, что именно делает JWT middleware в Fiber и где это используется в Go-коде.
  • Связывает JWT middleware в Fiber с корректным lifecycle запроса, отменой, конкурентностью или конфигурацией сервера там, где это уместно.
  • Не изобретает API и опирается на реальные контракты официальной документации.

Как вы знаете этот вопрос?

Проверить себя по теме Fiber →

Источники

  • https://docs.gofiber.io/contrib/v3_jwt_v1.x.x/jwt/
  • https://docs.gofiber.io/guide/extractors
←Предыдущий вопросКакие архитектурные решения Fiber (Go framework) задаёт вокруг request lifecycle, middleware, dependency model, validation и error handling?Следующий вопрос→Как реализовать rate limiting в Fiber?

Связанные темы

FiberCodingMiddlewareSecurity