Tikhon
Это ведь получается что к github тоже доступа не будет
Andrey
Для начала тебе надо перестать паниковать, во вторых, дождаться, когда это случится.
Anonymous
гг откисаем
Tikhon
Anonymous
все лайны слили 🥲 сф соло мид не смог 🥲
Andrey
Надо были пуджа пикать, от бы смог
Tikhon
Anonymous
Олег
для чего разводить панику не прочитав документ?
Maxim
🅞leksiy
Ладно, время покажет
🅞leksiy
Нет смысла спорить, просто нужно быть готовым к любому развитию ситуации
🅞leksiy
Ну типа да, там пока о переводе. Только смущают граничные даты и требование отчитаться
🄻🄰🄺🄸
🅞leksiy
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 Друг, а ты с какого языка то пришел?
Tikhon
Herman
Понял
ну и мне кажется что таким образом немного ломается концепция middleware
Herman
у тебя получилась две функции
Herman
которые как одна работает
Herman
Ваще по хорошему роуты группируются, на группы навешиваются middlewares
Herman
то есть например есть public, есть private группы - на private висит auth
Tikhon
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
𝙲𝚊𝚝𝚒𝚘𝚗
а что он сделал
𝙲𝚊𝚝𝚒𝚘𝚗
буду кидать монетку
орел = простить
𝙲𝚊𝚝𝚒𝚘𝚗
повезло
Herman
Herman
а public и private - группы?
Tikhon
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
Herman
а user группировать выше
Denis Pershin
Tikhon
/api/user/private
/api/user/public ?
Tikhon
Я запутался
Tikhon
Почему будет происходить дублирование, и как грамотно и правильно пути сделать ?
Tikhon
Herman
Herman
ну вообще я не про сами пути, я про идею группировки говорил
Herman
а как уже ею пользоваться - вопрос второй
Denis Pershin
А можно без public и private, а сделать фильтр по path и внести туда те, на которые не проверять авторизацию?
Herman
Herman
можно на каждый запрос вешать мидвар отдельно, да
Herman
другое дело насколько это удобно
Herman
Denis Pershin