Пишем gRPC сервис на Go - Сервис авторизации / УЛЬТИМАТИВНЫЙ гайд

Sdílet
Vložit
  • čas přidán 3. 05. 2024
  • Пишем полноценный gRPC сервис с современной архитектурой. Также:
    - Напишем контракт protobuf, разберемся с кодогенерацией
    - Научимся работать с ошибками и логами
    - Настроим миграции для БД
    - Настроим автоматический деплой через GitHub Actions, напишем для этого workflow
    - и др.
    Исходный код проекта (версия кода с зафиксированной версией на момент выхода гайда): github.com/GolangLessons/sso/...
    Текстовая версия в виде инструкции: slc.tl/ygj4t
    Полная текстовая версия гайда: habr.com/ru/articles/774796/
    Облачный сервер для для gRPC-сервиса: slc.tl/s0kla
    --------
    Другие мои ролики, дополняющие текущий:
    REST API - URL Shortener: • Пишем REST API сервис ...
    Интерфейсы по месту использования: • Почему интерфейсы лучш...
    Моки и их генерация: • Генерация и использова...
    Использование SQLite в Go: • SQLite в Golang - как ...
    ----
    👾 t.me/ntuzov - мой канал в Telegram.
    Пишу в нём много интересного: гайды, которых нет на CZcams, интересные мысли про разработку, новости и анонсы всех моих активностей и др.
    👀 GoLang Digest: t.me/golang_digest - мои регулярные подборки интересных материалов по Go.
    🗣️ Наше сообщество GopherClub: t.me/+zsSZ63wEJDs3NGVi
    Лучшее русскоязычное Go-сообщество с очень приятной атмосферой, без токсиков. Вежливо и терпеливо помогаем новичкам, конструктивно дискутируем с профессионалами и т.п.
    Здесь также присутствуют все звезды Go-сообщества и представители интересных компаний 😄
    ❤️ Если у вас есть желание поддержать развитие канала:
    Секретный телеграм-канал:
    - В рублях: t.me/+1UPXV_DGnG1mODJi
    - В евро: t.me/+hedI8LevYTc5MDM6
    Boosty: boosty.to/nikolay.tuzov
    Patreon: / tuzov
    ----
    Тайм-коды:
    00:00 Вступление
    01:00 Мой Телеграм-канал, зачем на него подписываться
    02:04 Теоретический ликбез
    06:49 SSO или Auth?
    07:58 Авторизация и аутентификация - в чем разница?
    08:31 Архитектура авторизации в нашем сервисе
    09:51 Что такое JWT и зачем он нужен?
    14:01 Архитектура приложения
    16:33 Protobuf контракт
    31:24 Пишем SSO: каркас и структура проекта
    38:03 Конфигурация приложения
    52:32 Настраиваем логгер - log.slog
    01:03:56 gRPC-сервер и хэндлеры
    01:18:48 Запуск и проверка приложения
    01:22:04 Graceful shutdown
    01:27:08 Хэндлер Login()
    01:34:28 Хэндлер Register()
    01:36:01 Хэндлер IsAdmin()
    01:36:53 Сервисный слой
    01:46:27 Метод RegisterNewUser() и хэширование паролей
    01:52:05 Метод Login() и сравнение хэшей паролей
    01:58:00 Создание JWT-токена
    02:04:45 Миграции базы данных
    02:23:05 Слой работы с данными: реализация Storage
    02:32:09 Собираем все компоненты воедино
    02:37:11 Пишем функциональные тесты
    03:05:22 Интеграция с другим сервисом: URL Shortener
    03:15:05 Покупка облачного сервера для деплоя
    03:19:16 GitHub Actions: настраиваем автоматический деплой
    03:36:53 Тестируем задеплоенный сервис
    03:41:23 Заключение
    03:41:35 Наше сообщество - Gopher Club
    03:43:16 Как поддержать развитие канала
    #golang #ntuzov

Komentáře • 139

  • @nikolay_tuzov
    @nikolay_tuzov  Před 5 měsíci +12

    Текстовая версия в виде инструкции: slc.tl/ygj4t
    Полная текстовая версия гайда: habr.com/ru/articles/774796/
    Облачный сервер для для gRPC-сервиса: slc.tl/s0kla
    👾Мой канал в Telegram: t.me/ntuzov
    Пишу там новости, анонсы своих активностей и просто интересные мысли
    Также с его помощью я получаю от вас оперативный фидбэк по роликам - что нравится, что не нравится, какой ролик делать следующим и т.п.

    • @user-fe6pi9vb6h
      @user-fe6pi9vb6h Před 5 měsíci

      Понимание того кто находится перед нами - это идентификация, а аутентификация это уже проверка того что пользователь идентифицирован верно, грубо говоря что Вася это действительно Вася а не Петя которые пытается зайти под пользователем Васей. Так же как в ООП здесь тоже есть свои 3 кита безопасновти - Идентификация, аутентификация и авторизация.

    • @melomalo1682
      @melomalo1682 Před 4 měsíci

      Здравствуйте Николай! В текстовой версии вот тут Команда для генерации будет следующей: неполная команда при копировании!

    • @Encrouter
      @Encrouter Před 3 měsíci

      4:08 Зачем самому изобретать велосипед, когда есть GZip сжатие на лету? Для json у меня соотношение достигало 10:1.
      Вот убирать _ненужные в данный момент_ данные, либо какие-либо _промежуточные_ данные, _необязательные вообще для пользователя_ стоит.

  • @user-xe1ng4wv9k
    @user-xe1ng4wv9k Před 5 měsíci +45

    Большой длинный многословный комментарий бесконечный благодарности чтобы алгоритмы ютуба вывели ролик в топ

  • @xBAMIIuPx
    @xBAMIIuPx Před 5 měsíci +38

    Спасибо за такой, не побоюсь сказать, титанический труд. Очень мало подобных видео 👍

    • @user-le7cf1qk8l
      @user-le7cf1qk8l Před 5 měsíci +2

      Это мне на несколько дней плотных занятий.

  • @research_Development
    @research_Development Před 5 měsíci +6

    Лайк не глядя)) Что короткие, что длинные ролики - топовые у тебя.

  • @markmakarov4544
    @markmakarov4544 Před 5 měsíci +10

    Огромное СПАСИБО за такие гайды по гошке!
    Очень круто раскрываешь тематику.

  • @jordenskraften8273
    @jordenskraften8273 Před 5 měsíci +1

    Как раз недавно начинал делать свои поделки и осваивать gRPC, спасибо за еще один хороший материал по этой теме

  • @eleimt
    @eleimt Před 5 měsíci +9

    Ролик и автора в ТОП! Огромная благодарность ❤

  • @emptiness4357
    @emptiness4357 Před 5 měsíci +3

    Спасибо за видео, ждал его как второе пришествие ♥

  • @igor_ni
    @igor_ni Před 4 měsíci +2

    Удивительно ясные и логичные объяснения действий и своего выбора. Смотрел и наслаждался!

  • @cipplant2800
    @cipplant2800 Před 5 měsíci +3

    Весь месяц ждал только это видео❤

  • @arxonic
    @arxonic Před 5 měsíci +5

    спасибо за труд, очень полезная информация ❤

  • @beertooo
    @beertooo Před 5 měsíci +1

    Спасибо за твой труд, очень полезно!

  • @funnyduck6326
    @funnyduck6326 Před měsícem +2

    Спасибо огромное, только погружаюсь в Go и выпало ваше видео, с удовольствием посмотрел, действительно огромная польза для комьюнити)

  • @VanFunify
    @VanFunify Před 5 měsíci

    Спасибо за твои труды!!!

  • @user-kp4mt2jc3d
    @user-kp4mt2jc3d Před 5 měsíci +3

    Вот это трудовая мощь, спасибо!

  • @madbad1310
    @madbad1310 Před 5 měsíci +3

    Давно ждал. Спасибо большое!

  • @nrm3122
    @nrm3122 Před 4 měsíci

    Неужели ролики такого крутого уровня можно найти на Ютубе.
    Спасибо, приятно посмотреть!

  • @user-ys9pz5cp7l
    @user-ys9pz5cp7l Před 4 měsíci +1

    Братец, это просто огромная работа, большое тебе спасибо за бесплатный контент такого уровня, было очень интересно. Лайк, подписка.

  • @albakov
    @albakov Před 5 měsíci +1

    Это было прекрасно, спасибо! )

  • @user-xh5mp4rc6g
    @user-xh5mp4rc6g Před 4 měsíci +2

    Благодарен за видео. Очень помогает развиваться.

  • @DEHbNO4b
    @DEHbNO4b Před 5 měsíci

    спасибо за проделанную работу!

  • @alexeykashurnikov7442
    @alexeykashurnikov7442 Před 3 měsíci

    Спасибо огромное за такой прекрасный гайд! Если будет возможность в отдельном ролике настроить пайплайн, будет вообще обалденно :)

  • @sr0888
    @sr0888 Před měsícem +1

    Спасибо! Огромная польза для меня, я сейчас перехожу с ноды на гошку

  • @sergeywhite8897
    @sergeywhite8897 Před 5 měsíci +2

    Мы ждали и наконец-то дождались

  • @Kannball
    @Kannball Před 5 měsíci

    На роликах данного канала я обычно использую лайки вместо "посмотреть позже". Автор как всегда выдал лютешую базу. Ждём продолжения

  • @hurricane-rus
    @hurricane-rus Před 4 měsíci

    Спасибо - хотим еще таких видео!)

  • @user-cg7jr2kt4l
    @user-cg7jr2kt4l Před 5 měsíci +3

    Очень крутой ролик, спасибо большое за знания. Интересно было бы увидеть использование docker в вашем исполнении, так как вы довольно исчерпывающе рассказываете и показываете всякие нюансы.

    • @nikolay_tuzov
      @nikolay_tuzov  Před 5 měsíci +1

      Темы для новых роликов теперь можно предлагать здесь: ntuzov.canny.io/golang-lessons/p/scheduler
      Тогда точно не потеряется, не забудется, и сможем оценить востребованность темы.
      А чтобы точно сдлеать это правильно, советую сначала прочитать этот пост: t.me/ntuzov/355

  • @xJusper
    @xJusper Před 5 měsíci +1

    Спасибо за ролик

  • @liteleak4049
    @liteleak4049 Před 4 měsíci

    Титанический труд, спасибо!

  • @vladpetrov4512
    @vladpetrov4512 Před 4 měsíci +1

    Продолжай в том же духе! Один из лучших каналов на ютубе про гошечку

  • @alexispell4251
    @alexispell4251 Před 5 měsíci +1

    Коммент в поддержу твоего канала. Спасибо!

  • @hardlabor9412
    @hardlabor9412 Před 5 měsíci +2

    Спасибо спс, только искал видео по gRPC, толкового ничего не нашел, а на собесах спрашивают😊

  • @tumenit
    @tumenit Před měsícem

    Спасибо! Очень познавательный видос.

  • @utti_12c
    @utti_12c Před 2 měsíci

    Спасибо🙏💕 большое дай Бог вам здоровья

  • @sergeywhite8897
    @sergeywhite8897 Před 5 měsíci +1

    Тут про gRpc только несколько хендлерочков, очень жду если расскажешь и покажешь(очень ждал), примеры как использовать разные варинаты gRpc на практике. То есть server Stream, client Stream и комбинацию этих подходов. В любом случае, сделал невероятный труд. Красава

  • @evilLincoln
    @evilLincoln Před 4 měsíci

    Спасибо! Наверняка есть какие-то неточности, но в целом редкое на Ютубе видео, где разобрана не отдельная деталь, а вся конструкция в целом

  • @atipuginhere
    @atipuginhere Před 5 měsíci

    Мощно, крутяк :)

  • @snamenatel
    @snamenatel Před 3 měsíci +1

    Круто! Да это ж круто!

  • @invisibleinvisible83
    @invisibleinvisible83 Před 5 měsíci +5

    Благодарю за такой труд 🙏🏻🌹🌹🌹 Процветания каналу и всем здоровья 🙏🏻🌹🌹🌹особенно Николаю за такой труд

  • @eamarc
    @eamarc Před 5 měsíci +3

    мне больше нравится для кода в /internal логировать ошибку сразу после получения и передавать оригинал вызывающему коду, а вот для кода в /pkg уже можно и обернуть...
    Кстати, в показанном подходе определения интерфейса более серьёзный недостаток, это если в сигнатуре метода появляется пользовательский тип - тогда абстракция протекает из-за связи или приходится писать нецензурный кастинг.

  • @defanji8484
    @defanji8484 Před 5 měsíci +1

    Лучший!!

  • @LunsBeats
    @LunsBeats Před 5 měsíci +1

    Подобных по содержанию и насыщенности роликов, если и делают в рускоговорящем сегменте, то единицы, однозначно лайк и уважение

  • @AlexSmith-pd8cn
    @AlexSmith-pd8cn Před 5 měsíci +1

    Хотелось бы в ролике увидеть про использование связки gRPC и Kafka

  • @nika31169
    @nika31169 Před 5 měsíci

    Жду такой же видос, только по брокерам

  • @denis7442
    @denis7442 Před 5 měsíci +1

    Автолайк Коляну, топовый контент, красава!

  • @Iaxls
    @Iaxls Před 4 měsíci

    Топ контент! Лайк и комментарий в поддержку и для продвижения канала!

  • @protomem0709
    @protomem0709 Před 5 měsíci +2

    Круто

  • @gigavaxer6557
    @gigavaxer6557 Před 2 měsíci +1

    Сам PHP разраб. Решил посмотреть под работу видос и не смог работать, потому что смотрел видос)
    Очень все доходчиво обясняет автор. Спасибо. Посмотрю после работи)

    • @nikolay_tuzov
      @nikolay_tuzov  Před 2 měsíci

      Ого, очень приятно видеть, что мой ролик настолько затягивает ❤️

  • @kvizyx636
    @kvizyx636 Před 5 měsíci +1

    Thanks

  • @timurtimerkhanov9335
    @timurtimerkhanov9335 Před 3 měsíci

    Николай Топовый профессионал!

  • @andreipopov2700
    @andreipopov2700 Před 5 měsíci +3

    Легендарный автор! Я по его роликам учился) лайк не глядя

  • @kotlinjava5228
    @kotlinjava5228 Před 5 měsíci

    ГИГАНТСКОЕ СПАСИБО НИКОЛАЙ!За флаг РК как обычно уважение🇰🇿🦅🔥

  • @Iaxls
    @Iaxls Před 4 měsíci +1

    Николай, подскажите - в следующем видео про permissions какой паттерн планируете использовать? ABAC или RBAC? Очень надеюсь и хотелось бы увидеть реализацию именно ABAC, в силу наибольшей гибкости. К слову приходилось реализовывать ABAC на nodejs, но очень интересно посмотреть на все это дело на go.

  • @unicoxr5tj417
    @unicoxr5tj417 Před 5 měsíci +3

    ой, за взрослое всегда лайк

  • @aboronilov
    @aboronilov Před 3 měsíci

    Привет. Супер обучалки. Подписался. У тебя есть контент где ты учишь делать микросервисы? Желательно с тестированием и логгированием😊

  • @trowy193
    @trowy193 Před 5 měsíci +1

    11:50 Харасмент через жвт токены, кибербулинг выходит на новый уровень

  • @aleksandrsavvinov4768
    @aleksandrsavvinov4768 Před 5 měsíci

    тупа царь

  • @user-gh6ol1sn6k
    @user-gh6ol1sn6k Před 3 měsíci

    Спасибо за видео, крутой материал. Есть вопрос. А в каком месте реализуется регистрация и логин в реальных условиях. Например если это фронт, то чтобы получить токен, можно реализовать запрос через js, или есть более лучшие подходы?

  • @user-bb1ji5jn9u
    @user-bb1ji5jn9u Před měsícem

    Благодарю автора за годный материал - это во первых.
    А во-вторых хотел спросить/предложить:
    Нормально ли, чтобы не передавать три раза storage в функцию, объявить интерфейс Service и встроить в него все те три интерфейса, образец:
    type Service interface {
    package.UrlSaver
    package.AppProvider
    package.UserProvider
    }
    И потом передавать его одного в функцию-конструктор New(log *slog.Logger, port int, tokenTtl time.Duration, service package.Service)
    ?

  • @zayets1987
    @zayets1987 Před 2 měsíci +2

    Спасибо за труд, в IDE jetbrain нужно задавать env не используя скобок “ ” - CONFIG_PATH=config/local.yaml , нужно задавть в меню File -> Settigs ->GO-> Go modules CONFIG_PATH=config/local.yaml !!!!! Вопрос почему здесь панику используешь в конфиге, а в рест API фатал пишешь?

  • @sd3veng338
    @sd3veng338 Před 5 měsíci

    Будет ли видео по прекрутке фронта к сервису авторизации?

  • @user-zy9qu9fg3t
    @user-zy9qu9fg3t Před 3 měsíci

    за флаг отдельный лайк ❤

  • @user-mu1ud3ov6g
    @user-mu1ud3ov6g Před 4 měsíci

    Доброго дня. Вцелом крутой ролик.
    Но есть вещь, которая прям тригерит "Нельзя передавать роль is_admin в токене, если захотим лишить человека прав, а токен 1 час живёт, то не лишим".
    Ну в рамках такого пет-проекта - может и да.
    А Если у тебя KeyCloack + Kong ? И лишим и довольно быстро, и без проблем. Logout ему сделаем и всё.
    Как например браузер будет определять is_admin? Кроме как по токену?
    Делать ему целую ручку для этого - ну вот тебе и нагрузка на сервер.
    Ну или если ролевая модель сложнее чем Админ, не Админ.
    Вобщем стоило сказать что описанные проблемы они касаются только текущей реализации пета-демки.

    • @vladislavstepanov7591
      @vladislavstepanov7591 Před 3 měsíci

      Описанная проблема относится в целом к jwt. Мы также и не можем сразу разлогинить человека, максимум что можно сделать - это запретить обновлять токен, чтобы токен человека не смог обновиться, но опять таки у человека все еще будет доступ все время пока живет текущий токен.
      Решение для этого простое - либо уменьшаем время жизни аксесс токена до маленьких значений(например 5 минут) либо старые добрые сессии)

  • @madbad1310
    @madbad1310 Před 5 měsíci

    Может прикольней было бы не встраивать все интерфейсы Storage в сервис Auth по одному, а определить общий интерфейс, который бы объединял все мелкие интерфейсы. И в случае рефакторинга не составило бы труда отделить конкретный интерфейс, выпилив его из общего.

  • @xjoel0065
    @xjoel0065 Před měsícem

    Несколько вопросов
    Если запускать миграции в самом приложении после инициализации базы? без отдельного мигратора. это ок? например пакетом goose?
    Нужен ли такой сложный github actions конфиг связанный с systemd, не проще ли создать пакет и с помощью docker Watchtower ждать изменений в образе что хранится в пакетах на гитхаб?

  • @vladimir_-_
    @vladimir_-_ Před 3 měsíci

    Николай Тузов, спасибо вам за контент. Я сам самоучка , работаю как веб-разработчик начинал с курсов и фронта, сейчас посматриваю в сторону бэка, php честно не хочется углубляться хотя каждый день с ним сталкиваюсь. Николай Тузов хотел спросить на площадках много старых курсов по go, есть ли разница от версий с какой можно начать или как js просто обрастает новыми фичками ?

    • @nikolay_tuzov
      @nikolay_tuzov  Před 3 měsíci

      Большой разницы нет. Можно изучить курсы / книги по старым версиям, а потом ознакомиться с нововведениями. Но если есть возможность, лучше выбирать актуальный материал.

    • @vladimir_-_
      @vladimir_-_ Před 3 měsíci

      @@nikolay_tuzov спасибо за ответ, будем вливаться в Go

  • @worus276
    @worus276 Před 5 měsíci

    Столкнулся с такой проблемой: при написании TestLogin_FailCases, тест выдавал ошибку на строчке require.Contains(t, err.Error(), tt.expectedErr), смотрю в логах, а там проверяется наличие "invalid email or password" (1) в "invalid argument" (2). Проблему решил, заменив текст ошибки в grpc хендлере с (2) на (1). Вопрос, не стоит ли как - то стандартизировать внутри сервиса название подобных ошибок?
    P.S. ролик очень крутой, автору большое спасибо за проделанную работу!

  • @vp_arth
    @vp_arth Před měsícem

    Несколько минут описываешь I из SOLID, не упоминая сам SOLID.
    Можно же просто сказать «вот, есть такой принцип, используйте его».
    Собственно, все эти паттерны и наборы принципов существуют для упрощения коммуникаций.

  • @Rundik
    @Rundik Před 2 měsíci

    Аус!

  • @dokinaKA
    @dokinaKA Před 4 měsíci

    если вдруг, у Вас возник затык с установкой protoc, и вроде все рекомендации и документации прочтены, а команда protoc --version ругается - просто добавьте в переменную среды в Path путь к файлу protoc-25.1-win64\bin

  • @Carimusa
    @Carimusa Před 5 měsíci +1

    Логером удобно логировать имя файла и строку из которой собственно лог.

    • @nikolay_tuzov
      @nikolay_tuzov  Před 5 měsíci

      А если вы обновите код и строчки немного сдвинутся? И при этом вам потребуется посмотреть вчерашние логи, когда версия кода была другая? А если позавчерашние, когда версия кода была ещё более старая?
      Можно, конечно, ещё и версию кода логировать, но это слишком уж запарно - разбираться к какой версии что относится, и что было в этой строчке в такой-то версии.

    • @Carimusa
      @Carimusa Před 5 měsíci

      ​Файл и строка берется не в месте логирования. В Го можно получить стек вызовов через runtime / Caller, логгер это может сделать сам.
      По поводу изменений версий: у нас с этим за много лет проблем не было )
      Более того, если багрепортер указал в репорте версию и номер строки из лога не соответствует коду этой версии, то это сразу указывает, что багрепортер где-то ошибся )

    • @nikolay_tuzov
      @nikolay_tuzov  Před 5 měsíci

      ​@@Carimusa не очень понял, что значит "берется не в месте логирования", и как это связано с тем что я написал?
      Использование runtime / Caller довольно затратная и не быстрая штука, не во всех случаях подойдет.
      Багрепортер, это отдельная история вообще. Я больше про то, чтобы удобно было в логах разбираться, и чётко понимать, к какой функции относится та или иная запись.

    • @Carimusa
      @Carimusa Před 5 měsíci

      @@nikolay_tuzov
      Согласен, затратно и не быстро, но на практике, по умолчанию, на продакшене логируются ошибки и немного информационных сообщений. Если собирается дебаг логи, то затраты на io оказываются значительно больше, чем все остальное.
      По поводу смещения номера строки, то это больше специфика нашего проекта.
      У нас не бывает логов, без привязки к версии продукта.

  • @user-ju8xk9sh2m
    @user-ju8xk9sh2m Před 5 měsíci

    А есть ли варианты для бесплатного деплоя, и какой лучше?

  • @user-kp4mt2jc3d
    @user-kp4mt2jc3d Před 2 měsíci

    Подскажите, пожалуйста, верно ли, что protobuf преобразует ключи как запросов к сервису, так и ответов?
    И клиент на своей стороне декодирует ответ от сервиса с помощью контракта

  • @phplego
    @phplego Před 3 měsíci +1

    А почему все методы сервисного слоя принимают Context, но нет самой проверки на предмет отмены этого контекста? Какой в нем тогда смысл? Спасибо.

  • @nomionz4150
    @nomionz4150 Před 5 měsíci

    Николай, мне очень понравился ваш гайд и вдохновившись решил привнести свой вклад и облечгить людям установку grpc-go плагина и protoc. Я заметил что мой комментарий с ссылкой на репо был сразу удален :( Почему я не могу поделиться решением, которое в разы упращает процесс установки?

    • @nikolay_tuzov
      @nikolay_tuzov  Před 5 měsíci +1

      Я не удалял, возможно ютуб автоматом блокирует такое, но это странно. Попробуй ещё раз.

    • @nomionz4150
      @nomionz4150 Před 5 měsíci

      ​@@nikolay_tuzov в таком случае извините, не берите на свой счет :) Я погуглил и вы правы, youtube действительно автоматически удаляет комментарии с ссылками.

  • @artyomecheistov
    @artyomecheistov Před měsícem

    Для чего мы используем Prepare в данном примере, можете объяснить?

  • @xlzpm9722
    @xlzpm9722 Před 3 měsíci

    Здравствуйте, Николай, вы в ролике упомянули gtpr или как то так произнесли это сокращение, но в инете совсем нет ничего про это, можете написать , как по правильному

    • @nikolay_tuzov
      @nikolay_tuzov  Před 3 měsíci

      General Data Protection Regulation (EU GDPR) - регламент по защите данных в ЕС

  • @artyomecheistov
    @artyomecheistov Před měsícem

    Почему services знает о storage(импортируем ошибки из него)?

  • @eternalcringe
    @eternalcringe Před 5 měsíci

    посмотрел два раза, пока ничего не понятно, сейчас начну заново

    • @nikolay_tuzov
      @nikolay_tuzov  Před 5 měsíci +1

      Ты в закрытом канале смотрел? )

  • @user-fs4xc9nn6c
    @user-fs4xc9nn6c Před 4 měsíci

    2:30:44 на 65 строке нет ли риска sql иньекции? Пришел с другого яп и там это через orm защищено от подобных моментов.

    • @nikolay_tuzov
      @nikolay_tuzov  Před 4 měsíci +1

      Нет, т.к. мы используем метод db.Prepare(). Значения будут экранированы.

  • @user-wh6ui3pz9q
    @user-wh6ui3pz9q Před 5 měsíci +1

    44:51 не избыточно называть структуру GRPCConfig, при условии что она находится в пакете config?

  • @buginsystem8925
    @buginsystem8925 Před 5 měsíci

    А не подскажите, что за текстовый редактор используется на 33:00 ?

    • @nikolay_tuzov
      @nikolay_tuzov  Před 5 měsíci

      Это не редактор, это просто скриншот ) А изначально текст был написан в Obsidian

    • @buginsystem8925
      @buginsystem8925 Před 5 měsíci

      @@nikolay_tuzov понял. А что за просмотрщик картинок, в котором открыт скриншот?

    • @nikolay_tuzov
      @nikolay_tuzov  Před 5 měsíci

      @@buginsystem8925 это окошко самого же скриншотера - Shottr. Хорошая штука)

  • @user-yf5ip7td2y
    @user-yf5ip7td2y Před 5 měsíci +1

    За флаг Казахстана отдельное спасибо 🇰🇿😊

  • @user-bg2xp5up1e
    @user-bg2xp5up1e Před 5 měsíci

    Подскажите пожалуйста, как импортировать пакет log/slog

    • @user-ru2og2ld6k
      @user-ru2og2ld6k Před 5 měsíci

      С версии 1.21 он включен в стандартную библиотеку, если его нет просто обнови go.

  • @ericcartman8047
    @ericcartman8047 Před 3 měsíci

    Реально ли стать джуном на Golang без опыта или нужно начать с другого языка?

    • @nikolay_tuzov
      @nikolay_tuzov  Před 3 měsíci +1

      Я думаю, вполне реально. Но лучше не верить мне на слово, а проверять эту инфу более тщательно - изучить вакансии, поспрашивать в чатах.
      Вообще, я знаю пару примеров ребят, которые начали именно с Го, и у которых всё получилось.

  • @artyomecheistov
    @artyomecheistov Před měsícem

    Почему logger в internal а не pkg?

  • @vp_arth
    @vp_arth Před měsícem

    А где ошибка «Вы ввели пароль пользователя X, проверьте правильность введённого email»? :)

  • @user-no9zt9dh4o
    @user-no9zt9dh4o Před 5 měsíci

    а что за утилита для автогенерациии внутри приложения?
    спасибо

    • @nikolay_tuzov
      @nikolay_tuzov  Před 5 měsíci

      GitHub Copilot, у меня про него есть отдельный ролик

    • @user-no9zt9dh4o
      @user-no9zt9dh4o Před 5 měsíci

      @@nikolay_tuzov спасибо

  • @vp_arth
    @vp_arth Před měsícem

    Ручку на добавление аппки... А авторизовывать эту ручку кто будет? Этот же сервис? =)

  • @akaassa73
    @akaassa73 Před 5 měsíci

    А зачем нужен бранч guide-version?

    • @nikolay_tuzov
      @nikolay_tuzov  Před 5 měsíci

      Я буду дорабатывать проект, и он будет отличаться от того, что покзан в ролике. В этой ветке версия будет зафиксирована.

  • @UAStriker
    @UAStriker Před 5 měsíci

    Скажите, зачем везде контекст прокидывать?

  • @MrBoBrilO
    @MrBoBrilO Před 5 měsíci +3

    Ещё бы деплой на gitlab ci/cd был и была бы совсем абсолютная вкуснятина, но и так очень круто, благодарю!

    • @nikolay_tuzov
      @nikolay_tuzov  Před 5 měsíci +2

      А зачем gitlab, если есть github? Для пет-проектов идеально, а на работе этим девопсы занимаются обычно.

  • @Rundik
    @Rundik Před 2 měsíci

    В конфиге не рекомендуется хранить сикреты

  • @user-si5xg4yo4s
    @user-si5xg4yo4s Před 3 měsíci

    2:32:00

  • @alexkozadaev911
    @alexkozadaev911 Před 3 měsíci +1

    Спасибо! Ну гайд скорее исчерпывающий, а не ультимативный. 🤔

  • @madbad1310
    @madbad1310 Před 5 měsíci

    Совет. Не ставьте утилиту proto через apt install - может установиться старая версия, и тогда будут проблемы. Ставьте через вариант Install pre-compiled binaries.

  • @user-si5xg4yo4s
    @user-si5xg4yo4s Před 2 měsíci

    Эпизод: пишем функциональные тесты

  • @vasiliylu8054
    @vasiliylu8054 Před 5 měsíci

    Флаг KZ?

    • @nikolay_tuzov
      @nikolay_tuzov  Před 5 měsíci +1

      Ага

    • @vasiliylu8054
      @vasiliylu8054 Před 5 měsíci

      @@nikolay_tuzov Спасибо за гайд, Крутая подача.

  • @Qwerty-yg5be
    @Qwerty-yg5be Před 3 měsíci

    Можно узнать что за "ручка"?
    Сильное желание кандидату сразу отказ проставить вызывает, даже не брать на собеседование.
    Handle, endpoint, call, etc?
    Ох уж эти ньюфаги, как бессмысленное менеджерьё переизобретает то, что есть и ставит это себе в заслуги :)

    • @vladislavstepanov7591
      @vladislavstepanov7591 Před 3 měsíci

      ох уж эти староверы
      ручка - забавное название эндпоинтов, объясняется просто что нужно потянуть за "ручку"(дернуть эндпоинт)

    • @Qwerty-yg5be
      @Qwerty-yg5be Před 3 měsíci

      @@vladislavstepanov7591 При чём тут староверы, если уже есть хорошее, устоявшееся слово для этого?
      Я понимаю что составители курсов скиллбокса дояркам иначе не объяснят что это за процесс, если только не на пальцах, но чтобы образованные люди использовали аналогии для умственно отсталых детей...
      Та же хрень что с феминитивами - искажает литературную норму ради... чего?
      P. S. Тянешь ты себе член, а эндпойнты вызываешь. Вообще не факт что он вернёт что-то полезное в твоём контексте, поэтому никак не "потянуть".

  • @myddl2643
    @myddl2643 Před 5 měsíci

    искал медь (шитпост говно), а нашел золото