Buat Pengguna Tetap Masuk Menggunakan Sesi di Go

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.

go get 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.

import (
"github.com/gorilla/sessions"
"log"
"net/http"
)

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

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.


func cookieStore() *sessions.CookieStore {
SecretKey := []byte("super-secret-SecretKey")
cookieStore := sessions.NewCookieStore(SecretKey)


return cookieStore
}

See also  7 Kerangka Kerja Python Teratas untuk Menyesuaikan GUI Anda

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 *sessions.CookieStore 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 akan ingin memverifikasi apakah pengguna sudah masuk sebelum membuat sesi di fungsi pengendali masuk Anda. Anda dapat menggunakan Mendapatkan metode di toko cookie 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


func login(writer http.ResponseWriter, request *http.Request) {
session, err := cookieStore().Get(request, "Cookie Name From Request")

if err != nil {
log.Fatalln(err)
}


session.Values["auth status"] = true
err = session.Save(request, writer)

if err != nil {
return
}
}

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.


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)
return
} else {
writer.WriteHeader(http.StatusBadRequest)
return
}
}

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 HTTP 400.

See also  Menggunakan Sistem Kontrol Versi Subversion di Server

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.

func logout(writer http.ResponseWriter, request *http.Request) {
session, err := cookieStore().Get(request, "Cookie Name From Request")

if err != nil {
return
}


session.Values["auth status"] = false
err = session.Save(request, writer)

if err != nil {
return
}
}

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.