Autentifikatsiya
Kirish
Autentifikatsiya veb-ilovalarda ajralmas xususiyatdir. Goravelning facades.Auth() moduli JWT va Session drayverlarini qo‘llab-quvvatlaydi va siz drayver va foydalanuvchi provayderini sozlashingiz mumkin.
Konfiguratsiya
Ilovada turli foydalanuvchi identifikatorlarini almashtirish uchun config/auth.go faylida defaults guard va bir nechta guards ni sozlashingiz mumkin.
JWT parametrlarini, masalan, secret, ttl, refresh_ttl ni config/jwt.go faylida sozlashingiz mumkin.
Har xil JWT Guard har xil konfiguratsiyalarni qo‘llab-quvvatlaydi
Har bir Guard uchun TTL, Secret va RefreshTTL ni alohida config/auth.go faylida sozlashingiz mumkin. Agar sozlanmagan bo‘lsa, ushbu uchta konfiguratsiya standart sifatida config/jwt.go fayli tomonidan ishlatiladi.
// config/auth.go
"guards": map[string]any{
"user": map[string]any{
"driver": "jwt",
++ "ttl": 60,
++ "refresh_ttl": 0,
++ "secret": "your-secret",
},
},JWT Token Yaratish
./artisan jwt:secretFoydalanuvchi Yordamida Token Yaratish
Model orqali token yaratishingiz mumkin. Agar model orm.Model dan foydalansa, qo‘shimcha sozlash talab qilinmaydi, aks holda modelning asosiy kalit maydonida Tag ni sozlashingiz kerak, masalan:
type User struct {
ID uint `gorm:"primaryKey"`
Name string
}
var user models.User
user.ID = 1
token, err := facades.Auth(ctx).Login(&user)ID Yordamida Token Yaratish
token, err := facades.Auth(ctx).LoginUsingID(1)Tokenni Tahlil Qilish
payload, err := facades.Auth(ctx).Parse(token)payload orqali quyidagilarni olishingiz mumkin:
Guard: Joriy Guard;Key: Foydalanuvchi belgisi;ExpireAt: Muddati tugash vaqti;IssuedAt: Berilgan vaqt;
Agar
errErrorTokenExpireddan boshqa bo‘lsa va nolga teng bo‘lmasa, payload nolga teng bo‘lishi kerak.
Tokenni muddati o‘tganligini err orqali aniqlashingiz mumkin:
"errors"
"github.com/goravel/framework/auth"
errors.Is(err, auth.ErrorTokenExpired)Token Bearer prefiksi bilan yoki undan holi normal tahlil qilinishi mumkin.
Foydalanuvchini Olish
Foydalanuvchini olishdan oldin Parse orqali Token yaratishingiz kerak, bu jarayon HTTP middleware orqali boshqarilishi mumkin.
var user models.User
err := facades.Auth(ctx).User(&user) // Ko‘rsatkich bo‘lishi kerak
id, err := facades.Auth(ctx).ID()Tokenni Yangilash
Foydalanuvchini yangilashdan oldin Parse orqali Token yaratishingiz kerak.
token, err := facades.Auth(ctx).Refresh()Chiqish
err := facades.Auth(ctx).Logout()Bir Nechta Guardlar
token, err := facades.Auth(ctx).Guard("admin").LoginUsingID(1)
err := facades.Auth(ctx).Guard("admin").Parse(token)
token, err := facades.Auth(ctx).Guard("admin").User(&user)Standart guard ishlatilmaganda, yuqoridagi metodlarni chaqirishdan oldin
Guardmetodini chaqirish shart.
Maxsus Drayver
Maxsus Guard Qo‘shish
O‘zingizning autentifikatsiya guard drayveringizni aniqlash uchun facades.Auth().Extend() metodidan foydalanishingiz mumkin, bu metod AuthServiceProvider ning Boot metodida chaqirilishi mumkin.
import "github.com/goravel/framework/contracts/auth"
func (receiver *AuthServiceProvider) Boot(app foundation.Application) {
facades.Auth().Extend("custom-driver", func(ctx http.Context, name string, userProvider auth.UserProvider) (auth.GuardDriver, error) {
return &CustomGuard{}, nil
})
}Maxsus guardni aniqlaganingizdan so‘ng, uni auth.go faylining guards konfiguratsiyasida ko‘rsatishingiz mumkin:
"guards": map[string]any{
"api": map[string]any{
"driver": "custom-driver",
"provider": "users",
},
},Maxsus UserProvider Qo‘shish
O‘zingizning foydalanuvchi provayderingizni aniqlash uchun facades.Auth().Provider() metodidan foydalanishingiz mumkin, bu metod ham AuthServiceProvider ning Boot metodida chaqirilishi mumkin.
import "github.com/goravel/framework/contracts/auth"
facades.Auth().Provider("custom-provider", func(ctx http.Context) (auth.UserProvider, error) {
return &UserProvider{}, nil
})Provider metodi yordamida provayder ro‘yxatdan o‘tkazilgandan so‘ng, auth.go konfiguratsiya faylida maxsus foydalanuvchi provayderidan foydalanishingiz mumkin. Birinchidan, yangi drayverdan foydalanadigan provider ni aniqlang:
"providers": map[string]any{
"users": map[string]any{
"driver": "custom-provider",
},
},Nihoyat, ushbu provayderga guards konfiguratsiyasida murojaat qilishingiz mumkin:
"guards": map[string]any{
"api": map[string]any{
"driver": "custom-provider",
"provider": "users",
},
},