بسته Gorilla Go و اینکه چگونه می تواند به شما در احراز هویت کاربران کمک کند را کشف کنید.
Sessions یک گزینه محبوب برای احراز هویت کاربر در سراسر وب است. جلسه دوره ای است که در طی آن کاربر به طور فعال با یک برنامه درگیر می شود. طول عمر یک جلسه زمانی شروع می شود که کاربر وارد سیستم می شود و با خروج از سیستم به پایان می رسد.
HTTP یک پروتکل بدون حالت است، بنابراین اغلب باید فعالیت کاربر را به صورت دستی ردیابی کنید.
در سمت سرور برنامه خود، می توانید یک مقدار منحصر به فرد، ترجیحاً یک ارزش رمزنگاری امن ایجاد کنید. سپس میتوانید آن را در یک کوکی ذخیره کنید که مشتری در درخواستهای بعدی به برنامه شما ارسال میکند و شکلی از حالت ایجاد میکند.
جلسات در Go
میتوانید از بسته net/http برای پیادهسازی جلسات استفاده کنید، و بستههای زیادی در دسترس هستند که قبلاً این کار را انجام میدهند. محبوب ترین بسته جلسات گوریلا است. این بسته قابلیت ذخیرهسازی کوکی و فایل را در کنار زیرساخت پشتیبانی جلسه سفارشی ارائه میکند.
این دستور را در فضای کاری Go خود اجرا کنید تا بسته Gorilla sessions نصب شود.
go get github.com/gorilla/sessions
در این آموزش، از یک فروشگاه کوکی برای جلسات استفاده خواهید کرد. شما از بسته net/http برای راه اندازی وب سروری استفاده خواهید کرد که مشکل کاربر را بررسی می کند و جلسات را باطل می کند.
در اینجا لیست وارداتی است که برای دنبال کردن این آموزش به آنها نیاز دارید.
import (
"github.com/gorilla/sessions"
"log"
"net/http"
)
بسته log برای عملیات مربوط به لاگ بر اساس وضعیت احراز هویت کاربر است.
پیاده سازی فروشگاه کوکی ساده
برای عملکردهای کنترل کننده ورود و خروج خود به یک فروشگاه کوکی نیاز دارید. برای فروشگاه کوکی خود، به یک کلید مخفی برای احراز هویت نیاز دارید.
در اینجا یک تابع برای اجرای فروشگاه کوکی ها وجود دارد.
// cookieStore function creates a cookie store with the user's secret key
func cookieStore() *sessions.CookieStore {
SecretKey := []byte("super-secret-SecretKey")
cookieStore := sessions.NewCookieStore(SecretKey)
// function returns the cookie store so other functions can access it
return cookieStore
}
در تابع cookieStore، متغیر کلید مخفی اعلام شده SecretKey یک کلید مخفی نمونه است. در تولید، کلید مخفی شما باید از نظر رمزنگاری ایمن باشد، به عنوان مثال از بسته رمزنگاری استفاده شود. شما همچنین باید رمز را از یک فایل متغیرهای محیطی بارگیری کنید.
تابع مقداری از نوع *sessions.CookieStore را برمی گرداند که نشان دهنده ذخیره کوکی ایمن شده با کلید مخفی است. شما از تابع CookieStore در کنترل کننده های ورود و خروج خود برای احراز هویت کاربران و اختصاص جلسات استفاده خواهید کرد.
عملکرد کنترل کننده ورود
قبل از ایجاد یک جلسه در عملکرد کنترل کننده ورود، باید بررسی کنید که آیا کاربر قبلاً وارد سیستم شده است یا خیر. می توانید از روش Get در فروشگاه کوکی برای بازیابی یک جلسه از کوکی و اضافه کردن جلسه به درخواست مشتری استفاده کنید.
متد Get جلسه و خطایی را که می توانید کنترل کنید برمی گرداند. اگر نیاز به احراز هویت کاربر دارید، می توانید در کنترل کننده ورود احراز هویت یا مجوز دهید.
// login handler retrieves the session from the cookie Store
func login(writer http.ResponseWriter, request *http.Request) {
session, err := cookieStore().Get(request, "Cookie Name From Request")
if err != nil {
log.Fatalln(err)
}
// set your user authentication here based on the operation
session.Values["auth status"] = true
err = session.Save(request, writer)
if err != nil {
return
}
}
ویژگی Values داده های مربوط به جلسه را در فروشگاه کوکی نگه می دارد:
روش Save جلسه را در فروشگاه کوکی ذخیره می کند. در کنترل کننده های خود، برای امنیت بالاتر به اقدامات احراز هویت دیگری نیاز دارید.
بررسی وضعیت ورود کاربر
کنترل کننده تأیید شما باید با استفاده از روش Get فروشگاه کوکی، جلسه را از کوکی مشتری بازیابی کند. سپس می توانید جلسه را بازیابی کنید و کاربر را احراز هویت کنید.
func checkAuthStatus(writer http.ResponseWriter, request *http.Request) {
session, err := cookieStore().Get(request, "Cookie Name From Request")
if err != nil {
log.Fatalln(err)
}
authenticated := session.Values["auth status"]
if authenticated == true {
writer.WriteHeader(http.StatusOK) // write 200 status code
return
} else {
writer.WriteHeader(http.StatusBadRequest) // write 400 http status code
return
}
}
متغیر احراز هویت شده از ویژگی Values برای بازیابی وضعیت از فروشگاه کوکی استفاده می کند. سپس دستور if این وضعیت احراز هویت را تأیید می کند. اگر درست ارزیابی شود، کلاینت کد وضعیت 200 HTTP را دریافت می کند. اگر وضعیت احراز هویت درست نباشد، مشتری کد وضعیت 400 HTTP را دریافت می کند.
کنترل کننده خروج از جلسه
عملکرد کنترل کننده خروج شما بسیار شبیه به عملکرد کنترل کننده ورود خواهد بود. شما تمام داده های مربوط به جلسه کاربر را از فروشگاه کوکی حذف می کنید و وضعیت احراز هویت را باطل می کنید.
func logout(writer http.ResponseWriter, request *http.Request) {
session, err := cookieStore().Get(request, "Cookie Name From Request")
if err != nil {
return
}
// nullify the user's session from the cookie Store
session.Values["auth status"] = false
err = session.Save(request, writer)
if err != nil {
return
}
}
عملکرد کنترل کننده خروج، وضعیت احراز هویت جلسه کاربر را باطل می کند و وضعیت را در فروشگاه کوکی ذخیره می کند.
داده های حساس را در جلسات ذخیره نکنید
جلسات برای ذخیره داده ها عالی هستند، اما بهتر است از ذخیره داده های حساس در آنها خودداری کنید. اگر شما داده های آن را در یک کوکی ذخیره کرده و از طریق HTTP ساده بفرستید، مهاجم می تواند جلسه ای را ربوده باشد. امنیت اپلیکیشن شما برای کاربران شما مهم است.
Session ها حالتی هستند و پیاده سازی های پایگاه داده بسیاری از فروشگاه های کوکی برای بسته Gorilla، برای هر دو پایگاه داده SQL و NoSQL وجود دارد.