Sesi adalah opsi populer untuk autentikasi pengguna di seluruh web. Sesi adalah periode di mana pengguna secara aktif terlibat dengan aplikasi. Masa pakai sesi dimulai saat pengguna masuk dan berakhir saat mereka keluar.

HTTP adalah protokol tanpa kewarganegaraan, jadi Anda sering harus melacak aktivitas pengguna secara manual.

Di sisi server aplikasi Anda, Anda dapat menghasilkan nilai unik, lebih disukai yang aman secara kriptografis. Anda kemudian dapat menyimpannya dalam cookie yang akan dikirim klien ke aplikasi Anda pada permintaan di masa mendatang, menciptakan bentuk status.

Sesi di Go

Anda dapat menggunakan paket net/http untuk mengimplementasikan sesi, dan ada banyak paket yang tersedia yang sudah melakukan ini. Yang paling populer adalah paket sesi Gorilla. Paket ini menyediakan fungsionalitas cookie dan penyimpanan file bersama infrastruktur backend sesi kustom.

Jalankan perintah ini di ruang kerja Go Anda untuk menginstal paket sesi Gorilla.

Pergilah dapatkan github.com/gorilla/sessions

Dalam tutorial ini, Anda akan menggunakan cookie store untuk sesi. Anda akan menggunakan paket net/http untuk memulai server web yang akan memeriksa masalah pengguna dan mencabut sesi.

Berikut daftar impor yang Anda perlukan untuk mengikuti tutorial ini.

impor (
"github.com/gorilla/sessions"
"catatan"
"bersih/http"
)

Itu catatan package adalah untuk operasi terkait logging berdasarkan status otentikasi pengguna.

Implementasi Toko Cookie Sederhana

Anda akan memerlukan toko cookie untuk fungsi handler login dan logout Anda. Untuk toko cookie Anda, Anda memerlukan kunci rahasia untuk otentikasi.

Berikut adalah fungsi untuk implementasi cookie store.

// fungsi cookieStore membuat toko cookie dengan kunci rahasia pengguna
fungsitoko kue() *sesi.Toko Kue {
Kunci Rahasia := []byte("super-secret-SecretKey")
cookieStore := sesi. Toko Cookie Baru (Kunci Rahasia)

// fungsi mengembalikan cookie store sehingga fungsi lain dapat mengaksesnya
kembali toko kue
}

Dalam toko kue fungsi, variabel kunci rahasia yang dideklarasikan Kunci rahasia adalah contoh kunci rahasia. Dalam produksi, kunci rahasia Anda harus aman secara kriptografis, menggunakan paket kripto misalnya. Anda juga harus memuat rahasia dari file variabel lingkungan.

Fungsi mengembalikan nilai *sesi. Toko Kue jenis yang mewakili penyimpanan cookie yang diamankan dengan kunci rahasia. Anda akan menggunakan Toko Kue fungsi di Anda Gabung dan keluar penangan untuk mengotentikasi pengguna dan menetapkan sesi.

Fungsi Pengendali Masuk

Anda ingin memverifikasi apakah pengguna sudah masuk sebelum membuat sesi di fungsi pengendali masuk Anda. Anda dapat menggunakan Mendapatkan metode di cookie store untuk mengambil sesi dari cookie dan menambahkan sesi ke permintaan klien.

Itu Mendapatkan metode mengembalikan sesi dan kesalahan yang dapat Anda tangani. Jika Anda perlu mengautentikasi pengguna, Anda dapat mengautentikasi atau mengotorisasi di Gabung pawang

// pengendali login mengambil sesi dari toko cookie
fungsiGabung(penulis http. ResponseWriter, minta *http. Meminta) {
sesi, err := cookieStore().Get (permintaan, "Nama Cookie Dari Permintaan")

jika salah != nol {
catatan. Fataln (err)
}

// atur otentikasi pengguna Anda di sini berdasarkan operasi
sidang. Nilai["status auth"] = BENAR
err = sesi. Simpan (permintaan, penulis)

jika salah != nol {
kembali
}
}

Properti Values ​​menyimpan data terkait sesi di penyimpanan cookie:

Itu Menyimpan metode menyimpan sesi ke toko cookie. Di penangan Anda, Anda akan memerlukan tindakan autentikasi lain untuk keamanan yang lebih tinggi.

Memverifikasi Status Login Pengguna

Pengendali verifikasi Anda harus mengambil sesi dari cookie klien menggunakan toko cookie Mendapatkan metode. Kemudian Anda dapat mengambil sesi dan mengautentikasi pengguna.

fungsicekStatus Auth(penulis http. ResponseWriter, minta *http. Meminta) {
sesi, err := cookieStore().Get (permintaan, "Nama Cookie Dari Permintaan")

jika salah != nol {
catatan. Fataln (err)
}

diautentikasi := sesi. Nilai["status autentikasi"]

jika diautentikasi == BENAR {
penulis. WriteHeader (http. Status Oke) // tulis 200 kode status
kembali
} kalau tidak {
penulis. WriteHeader (http. Permintaan StatusBuruk) // tulis 400 kode status http
kembali
}
}

Itu diautentikasi variabel menggunakan Nilai properti untuk mengambil status dari toko cookie. Pernyataan if kemudian memverifikasi status otentikasi ini. Jika dievaluasi menjadi BENAR, klien menerima 200 Kode status HTTP. Jika status otentikasi tidak benar, klien menerima kode status 400 HTTP.

Pengendali Keluar Sesi

Fungsi handler logout Anda akan sangat mirip dengan fungsi handler login. Anda akan menghapus semua data yang terkait dengan sesi pengguna dari penyimpanan cookie dan membatalkan status otentikasi.

fungsikeluar(penulis http. ResponseWriter, minta *http. Meminta) {
sesi, err := cookieStore().Get (permintaan, "Nama Cookie Dari Permintaan")

jika salah != nol {
kembali
}

// batalkan sesi pengguna dari Toko cookie
sidang. Nilai["status auth"] = Salah
err = sesi. Simpan (permintaan, penulis)

jika salah != nol {
kembali
}
}

Itu keluar fungsi handler membatalkan status otentikasi sesi pengguna dan menyimpan status ke penyimpanan cookie.

Jangan Simpan Data Sensitif dalam Sesi

Sesi sangat bagus untuk menyimpan data, tetapi sebaiknya hindari menyimpan data sensitif di dalamnya. Penyerang dapat membajak sesi jika Anda menyimpan datanya dalam cookie dan mengirimkannya melalui HTTP biasa. Keamanan aplikasi Anda penting bagi pengguna Anda.

Sesi bersifat stateful dan ada banyak implementasi basis data dari penyimpanan cookie untuk paket Gorilla, baik untuk basis data SQL maupun NoSQL.