Сесиите са популярна опция за удостоверяване на потребители в мрежата. Сесията е период, през който потребителят активно се ангажира с приложение. Продължителността на сесията започва, когато потребител влезе и завършва, когато излезе.

HTTP е протокол без състояние, така че често ще трябва да проследявате активността на потребителите ръчно.

От страната на сървъра на вашето приложение можете да генерирате уникална стойност, за предпочитане криптографски защитена. След това можете да съхраните това в бисквитка, която клиентът ще изпрати на вашето приложение при бъдещи заявки, създавайки форма на състояние.

Сесии в Go

Можете да използвате пакета net/http за реализиране на сесии и има много налични пакети, които вече правят това. Най-популярен е пакетът Gorilla sessions. Този пакет предоставя функционалност за съхранение на бисквитки и файлове заедно с персонализирана бекенд инфраструктура на сесията.

Изпълнете тази команда на вашето работно пространство Go, за да инсталирате пакета Gorilla sessions.

instagram viewer
отивам вземете github.com/gorilla/sessions

В този урок ще използвате хранилище за бисквитки за сесии. Ще използвате пакета net/http, за да стартирате уеб сървър, който ще провери проблема на потребителя и ще отмени сесиите.

Ето списъка с импортирания, които ще ви трябват, за да следвате този урок.

импортиране (
"github.com/gorilla/sessions"
"дневник"
"net/http"
)

The дневник Пакетът е за операции, свързани с регистриране, въз основа на състоянието на удостоверяване на потребителя.

Опростено внедряване на магазин за бисквитки

Ще ви е необходимо хранилище за бисквитки за вашите функции за обработване на влизане и излизане. За вашето хранилище за бисквитки ще ви трябва таен ключ за удостоверяване.

Ето функция за внедряване на магазина за бисквитки.

// функцията cookieStore създава хранилище за бисквитки със секретния ключ на потребителя
функcookieStore() *сесии.CookieStore {
SecretKey := []байт("super-secret-SecretKey")
cookieStore := сесии. NewCookieStore (SecretKey)

// функцията връща хранилището за бисквитки, така че други функции да имат достъп до него
връщане cookieStore
}

В cookieStore функция, декларираната променлива на секретния ключ SecretKey е примерен таен ключ. В производството вашият таен ключ трябва да бъде криптографски защитен, като използвате например крипто пакета. Трябва също да заредите тайната от файл с променливи на средата.

Функцията връща стойност на *сесии. CookieStore тип, който представлява хранилището за бисквитки, защитено със секретния ключ. Ще използвате CookieStore функция във вашия Влизам и излез от профила си манипулатори за удостоверяване на потребителите и присвояване на сесии.

Функцията за обработка на вход

Ще искате да проверите дали потребителят вече е влязъл, преди да създадете сесия във вашата функция за обработка на вход. Можете да използвате Вземете метод в хранилището за бисквитки, за да извлечете сесия от бисквитката и да добавите сесията към заявката на клиента.

The Вземете метод връща сесията и грешка, която можете да обработите. Ако трябва да удостоверите потребителя, можете да удостоверите или упълномощите в Влизам манипулатор.

// манипулаторът за влизане извлича сесията от хранилището за бисквитки
функВлизам(автор http. ResponseWriter, заявка *http. Заявка) {
session, err := cookieStore().Get (заявка, „Име на бисквитка от заявка“)

ако грешка!= нула {
дневник. Fatalln (грешка)
}

// задайте вашето потребителско удостоверяване тук въз основа на операцията
сесия. Стойности ["auth status"] = вярно
грешка = сесия. Запазване (заявка, писател)

ако грешка!= нула {
връщане
}
}

Свойството Стойности съдържа свързаните със сесията данни в хранилището на бисквитките:

The Запазване метод записва сесията в хранилището за бисквитки. Във вашите манипулатори ще ви трябват други мерки за удостоверяване за по-висока сигурност.

Проверка на състоянието на влизане на потребителя

Вашият манипулатор за проверка трябва да извлече сесията от бисквитката на клиента, като използва хранилището за бисквитки Вземете метод. След това можете да извлечете сесията и да удостоверите потребителя.

функcheckAuthStatus(автор http. ResponseWriter, заявка *http. Заявка) {
session, err := cookieStore().Get (заявка, „Име на бисквитка от заявка“)

ако грешка!= нула {
дневник. Fatalln (грешка)
}

удостоверена := сесия. Стойности ["auth status"]

ако удостоверен == вярно {
писател. WriteHeader (http. Състояние ОК) // напишете 200 код на състояние
връщане
} друго {
писател. WriteHeader (http. StatusBadRequest) // напишете 400 http статус код
връщане
}
}

The удостоверени променливата използва Стойности свойство за извличане на състоянието от хранилището за бисквитки. Операторът if след това проверява този статус на удостоверяване. Ако се оценява на вярно, клиентът получава 200 HTTP код на състоянието. Ако състоянието на удостоверяване не е вярно, клиентът получава 400 HTTP код за състояние.

Манипулаторът за излизане от сесията

Вашата функция за обработка на излизане ще бъде много подобна на функцията за обработка на влизане. Ще изтриете всички данни, свързани със сесията на потребителя, от хранилището за бисквитки и ще анулирате състоянието на удостоверяване.

функизлез от профила си(автор http. ResponseWriter, заявка *http. Заявка) {
session, err := cookieStore().Get (заявка, „Име на бисквитка от заявка“)

ако грешка!= нула {
връщане
}

// анулира сесията на потребителя от хранилището за бисквитки
сесия. Стойности ["auth status"] = невярно
грешка = сесия. Запазване (заявка, писател)

ако грешка!= нула {
връщане
}
}

The излез от профила си функцията за обработка анулира състоянието на удостоверяване на сесията на потребителя и записва състоянието в хранилището на бисквитки.

Не съхранявайте чувствителни данни в сесии

Сесиите са страхотни за съхраняване на данни, но е най-добре да избягвате съхраняването на чувствителни данни в тях. Хакер може да отвлече сесия, ако съхраните данните му в бисквитка и ги изпратите през обикновен HTTP. Сигурността на вашето приложение е важна за вашите потребители.

Сесиите са със състояние и има много реализации на бази данни на хранилища за бисквитки за пакета Gorilla, както за SQL, така и за NoSQL бази данни.