Tikhon
Это ведь получается что к github тоже доступа не будет
Andrey
Для начала тебе надо перестать паниковать, во вторых, дождаться, когда это случится.
Anonymous
гг откисаем
Anonymous
все лайны слили 🥲 сф соло мид не смог 🥲
Олег
Указ уже выпустили
указ о чем именно?
Andrey
Надо были пуджа пикать, от бы смог
Tikhon
Олег
для чего разводить панику не прочитав документ?
🅞leksiy
для чего разводить панику не прочитав документ?
Ну если почитать документ, то все и выглядит как подготовка к отключению. Возможно в ближайшее время этого не произойдет, хотя фиг пойми, что у них в голове
🅞leksiy
Ладно, время покажет
🅞leksiy
Нет смысла спорить, просто нужно быть готовым к любому развитию ситуации
Олег
Ну если почитать документ, то все и выглядит как подготовка к отключению. Возможно в ближайшее время этого не произойдет, хотя фиг пойми, что у них в голове
Выше в комменте написано "Указ уже выпустили", но указ то ведь не о том что все, отключаемся, указ о гос порталах и их переносе на российские рельсы, что вполне логично. Если в России накладывают ограничения на оплату, то нужно переносить сервисы туда где ты можешь за них оплатить и не ожидать возможных ограничений работы... Я думаю на фоне этого и так многие компании, особенно ориентированные на один Российский рынок даже без этого указа начинают похожий процесс просто для того чтобы перестраховаться.
Олег
Нет смысла спорить, просто нужно быть готовым к любому развитию ситуации
вот тут соглашусь, хз что у них в головах и что могут учудить правительства, но я думаю что не стоит трактовать указ приведенных выше только в этом ключе :)
🅞leksiy
Ну типа да, там пока о переводе. Только смущают граничные даты и требование отчитаться
Олег
Ну типа да, там пока о переводе. Только смущают граничные даты и требование отчитаться
так до 10 числа ожидают работоспособность международных транзакций по визе/мастеркард, а далее уже хз как поддерживать такие сервисы. Может с этим связано, ну и даты в любом случае были бы какие-то установлены.
🄻🄰🄺🄸
Откуда инфа про 11?
🅞leksiy
Откуда инфа про 11?
Задай им вопрос)
Herman
зачем?
Herman
ну и наверное смотря откуда
Herman
из узбекистана какого мб и стоит
Captain Jack Vielfrass
Поближе к чебурнету?
Tikhon
Воооот, я добился чего хотел package main import ( "fmt" "log" ) type context struct { Request string } func NewContext() *context { return &context{ Request: "", } } func Login(ctx *context) { fmt.Printf("[EVENT] Login...") } func FindUser(ctx *context) { fmt.Printf("[EVENT] Find...") } func AuthMiddleware(f func(*context), ctx *context) { if ctx.Request == "" { log.Fatal("Empty request") } f(ctx) } func main() { ctx := NewContext() AuthMiddleware(Login, ctx) } В контексте использования такого middleware вместе с gin функция AuthMiddleware будет выглядеть так: func AuthMiddleware(f func(*gin.Context), ctx *gin.Context) func(ctx *gin.Context) { token := ctx.Request.Header.Get("Authorization") if token == "" { ctx.JSON(http.StatusBadRequest, gin.H{"error": "Empty token"}) } return f(ctx *gin.Context) } Зачем такой костыль спросите вы, когда в gin уже есть специальная функция для вызова middleware ? Потому что она мне не нравится Вариант использования router.Use : router.Use(AuthMiddleware) router.POST("/login", userController.Login) router.POST("/login", userController.Register) Мой вариант: router.POST("/login", AuthMiddleware(userController.Login)) router.POST("/login", userController.Register))
Herman
))))0
Tikhon
Мне кажется что так лучше читается и выглядит
Herman
Herman
если нужно вызвать несколько функций подряд на одном роуте
Herman
то их можно затолкать подряд
Herman
...HandlerFunc означает что принимается любое кол-во HandlerFunc
Herman
Воооот, я добился чего хотел package main import ( "fmt" "log" ) type context struct { Request string } func NewContext() *context { return &context{ Request: "", } } func Login(ctx *context) { fmt.Printf("[EVENT] Login...") } func FindUser(ctx *context) { fmt.Printf("[EVENT] Find...") } func AuthMiddleware(f func(*context), ctx *context) { if ctx.Request == "" { log.Fatal("Empty request") } f(ctx) } func main() { ctx := NewContext() AuthMiddleware(Login, ctx) } В контексте использования такого middleware вместе с gin функция AuthMiddleware будет выглядеть так: func AuthMiddleware(f func(*gin.Context), ctx *gin.Context) func(ctx *gin.Context) { token := ctx.Request.Header.Get("Authorization") if token == "" { ctx.JSON(http.StatusBadRequest, gin.H{"error": "Empty token"}) } return f(ctx *gin.Context) } Зачем такой костыль спросите вы, когда в gin уже есть специальная функция для вызова middleware ? Потому что она мне не нравится Вариант использования router.Use : router.Use(AuthMiddleware) router.POST("/login", userController.Login) router.POST("/login", userController.Register) Мой вариант: router.POST("/login", AuthMiddleware(userController.Login)) router.POST("/login", userController.Register))
а когда будет 100 хендлеров как отслеживать, какие из них с auth а какие без
Herman
каждый смотреть отдельно?
Andrey
@tikhonfedulov Друг, а ты с какого языка то пришел?
Herman
Понял
ну и мне кажется что таким образом немного ломается концепция middleware
Herman
у тебя получилась две функции
Herman
которые как одна работает
Herman
Ваще по хорошему роуты группируются, на группы навешиваются middlewares
Herman
то есть например есть public, есть private группы - на private висит auth
Herman
Воооот, я добился чего хотел package main import ( "fmt" "log" ) type context struct { Request string } func NewContext() *context { return &context{ Request: "", } } func Login(ctx *context) { fmt.Printf("[EVENT] Login...") } func FindUser(ctx *context) { fmt.Printf("[EVENT] Find...") } func AuthMiddleware(f func(*context), ctx *context) { if ctx.Request == "" { log.Fatal("Empty request") } f(ctx) } func main() { ctx := NewContext() AuthMiddleware(Login, ctx) } В контексте использования такого middleware вместе с gin функция AuthMiddleware будет выглядеть так: func AuthMiddleware(f func(*gin.Context), ctx *gin.Context) func(ctx *gin.Context) { token := ctx.Request.Header.Get("Authorization") if token == "" { ctx.JSON(http.StatusBadRequest, gin.H{"error": "Empty token"}) } return f(ctx *gin.Context) } Зачем такой костыль спросите вы, когда в gin уже есть специальная функция для вызова middleware ? Потому что она мне не нравится Вариант использования router.Use : router.Use(AuthMiddleware) router.POST("/login", userController.Login) router.POST("/login", userController.Register) Мой вариант: router.POST("/login", AuthMiddleware(userController.Login)) router.POST("/login", userController.Register))
Ну и еще в такой идее проблемка - а что если мы захотим добавить еще пару middleware?
Herman
О, удобно
группировка методом Group делается
Herman
apiRouter := gin.New() apiV1 := apiRouter.Group(
Айрат
@banofbot
𝙲𝚊𝚝𝚒𝚘𝚗
а что он сделал
𝙲𝚊𝚝𝚒𝚘𝚗
буду кидать монетку орел = простить
𝙲𝚊𝚝𝚒𝚘𝚗
повезло
Tikhon
то есть например есть public, есть private группы - на private висит auth
Как посоветуете назвать пути в api ? Прямо /api/public/register и /api/private/logout ?
Herman
а public и private - группы?
Tikhon
а public и private - группы?
Ну получается что так
Tikhon
Метод router.Group() требует указания пути
Herman
пути общего для группы
Tikhon
Соответственно чтобы навешать на private группу middleware который проверяет наличие bearer токена - нам нужно все пути через /api/private/ проводить
Herman
то есть условно api := gin.New() apiPrivate = api.Group("/private", middleware.Auth) apiPublic = api.Group("/public")
Herman
ну а дальше уже на apiPrivate вешать logout
Tikhon
apiPrivate.Use(AuthMiddleware) { apiPrivate.POST("/logout", userController) apiPrivate.POST("/что-то там ещё", userController) }
Tikhon
Правильно ведь ?
Tikhon
Denis Pershin
А не будет дублирования? Например /public/user/register И /private/user/deactivate Или вам норм?
Herman
ну надо понимать, что это скобка фигурная - не тело метода Use - ее надо перенести
Herman
а user группировать выше
Tikhon
/api/user/private /api/user/public ?
Tikhon
Я запутался
Tikhon
Почему будет происходить дублирование, и как грамотно и правильно пути сделать ?
Herman
/api/user/private /api/user/public ?
это действительно будет не совсем удобно
Herman
user/private и user/public можно сделать
можно вот так без дублирования
Herman
ну вообще я не про сами пути, я про идею группировки говорил
Herman
а как уже ею пользоваться - вопрос второй
Denis Pershin
А можно без public и private, а сделать фильтр по path и внести туда те, на которые не проверять авторизацию?
Herman
можно на каждый запрос вешать мидвар отдельно, да
Herman
другое дело насколько это удобно
Denis Pershin
а как этот фильтр будет выглядеть?
На каждый запрос проверять есть ли path в массиве или мапе. Но на сколько это норма, пока не ясно
Herman
На каждый запрос проверять есть ли path в массиве или мапе. Но на сколько это норма, пока не ясно
Нуу, мне кажется этот group примерно так и работает. Но я не уверен)
Denis Pershin
Нуу, мне кажется этот group примерно так и работает. Но я не уверен)
Возможно) это просто так, набросик был на подумать