Giữ người dùng đăng nhập bằng cách sử dụng phiên trong hoạt động
Phiên là một tùy chọn phổ biến để xác thực người dùng trên web. Phiên là khoảng thời gian mà người dùng tích cực tương tác với một ứng dụng. Thời gian tồn tại của phiên bắt đầu khi người dùng đăng nhập và kết thúc khi họ đăng xuất.
HTTP là một giao thức không trạng thái, vì vậy bạn thường cần theo dõi hoạt động của người dùng theo cách thủ công.
Ở phía máy chủ của ứng dụng, bạn có thể tạo một giá trị duy nhất, tốt nhất là một giá trị an toàn bằng mật mã. Sau đó, bạn có thể lưu trữ thông tin đó trong cookie mà khách hàng sẽ gửi đến ứng dụng của bạn theo các yêu cầu trong tương lai, tạo ra một dạng trạng thái.
Mục Lục
Phiên đang hoạt động
Bạn có thể sử dụng gói net / http để triển khai các phiên và có nhiều gói có sẵn đã thực hiện việc này. Phổ biến nhất là gói phiên Gorilla. Gói này cung cấp chức năng lưu trữ tệp và cookie cùng với cơ sở hạ tầng phụ trợ phiên tùy chỉnh.
Chạy lệnh này trên không gian làm việc Go của bạn để cài đặt gói phiên Gorilla.
go get github.com/gorilla/sessions
Trong hướng dẫn này, bạn sẽ sử dụng kho cookie cho các phiên. Bạn sẽ sử dụng gói net / http để khởi động một máy chủ web sẽ kiểm tra sự cố của người dùng và thu hồi phiên.
Đây là danh sách các lần nhập bạn sẽ cần làm theo hướng dẫn này.
import (
"github.com/gorilla/sessions"
"log"
"net/http"
)
Các khúc gỗ gói dành cho các hoạt động liên quan đến ghi nhật ký dựa trên trạng thái xác thực của người dùng.
Triển khai cửa hàng cookie đơn giản
Bạn sẽ cần một kho lưu trữ cookie cho các chức năng xử lý đăng nhập và đăng xuất của mình. Đối với kho lưu trữ cookie của bạn, bạn sẽ cần một khóa bí mật để xác thực.
Đây là một chức năng để triển khai cửa hàng cookie.
func cookieStore() *sessions.CookieStore {
SecretKey := []byte("super-secret-SecretKey")
cookieStore := sessions.NewCookieStore(SecretKey)
return cookieStore
}
bên trong cookieStore hàm, biến khóa bí mật đã khai báo Chìa khoá bí mật là một ví dụ về khóa bí mật. Trong quá trình sản xuất, khóa bí mật của bạn phải được bảo mật bằng mật mã, chẳng hạn như sử dụng gói tiền điện tử. Bạn cũng nên tải bí mật từ tệp biến môi trường.
Hàm trả về một giá trị của * session.CookieStore loại đại diện cho kho lưu trữ cookie được bảo mật bằng khóa bí mật. Bạn sẽ sử dụng CookieStore chức năng của bạn đăng nhập và đăng xuất trình xử lý để xác thực người dùng và chỉ định phiên.
Chức năng xử lý đăng nhập
Bạn sẽ muốn xác minh xem người dùng đã đăng nhập hay chưa trước khi tạo phiên trong chức năng xử lý đăng nhập của bạn. Bạn có thể dùng Lấy trên kho lưu trữ cookie để lấy một phiên từ cookie và thêm phiên đó vào yêu cầu của khách hàng.
Các Lấy phương thức trả về phiên và một lỗi bạn có thể xử lý. Nếu bạn cần xác thực người dùng, bạn có thể xác thực hoặc ủy quyền trong đăng nhập người xử lý.
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
}
}
Thuộc tính Giá trị giữ dữ liệu liên quan đến phiên trong kho lưu trữ cookie:
Các Tiết kiệm phương thức lưu phiên vào kho lưu trữ cookie. Trong trình xử lý của bạn, bạn sẽ cần các biện pháp xác thực khác để bảo mật cao hơn.
Xác minh Trạng thái Đăng nhập của Người dùng
Trình xử lý xác minh của bạn nên truy xuất phiên từ cookie của khách hàng bằng cách sử dụng cửa hàng cookie Lấy phương pháp. Sau đó, bạn có thể truy xuất phiên và xác thực người dùng.
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
}
}
Các chứng thực biến sử dụng Giá trị thuộc tính để truy xuất trạng thái từ kho cookie. Sau đó câu lệnh if xác minh trạng thái xác thực này. Nếu nó đánh giá là thật, máy khách nhận được mã trạng thái HTTP 200. Nếu trạng thái xác thực không đúng, máy khách sẽ nhận được mã trạng thái HTTP 400.
Trình xử lý đăng xuất phiên
Chức năng xử lý đăng xuất của bạn sẽ rất giống với chức năng xử lý đăng nhập. Bạn sẽ xóa tất cả dữ liệu liên quan đến phiên của người dùng khỏi kho cookie và vô hiệu hóa trạng thái xác thực.
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
}
}
Các đăng xuất hàm xử lý vô hiệu trạng thái xác thực phiên của người dùng và lưu trạng thái vào kho lưu trữ cookie.
Không lưu trữ dữ liệu nhạy cảm trong phiên
Phiên rất tốt để lưu trữ dữ liệu, nhưng tốt nhất bạn nên tránh lưu trữ dữ liệu nhạy cảm trong đó. Kẻ tấn công có thể chiếm quyền điều khiển một phiên nếu bạn lưu trữ dữ liệu của nó trong cookie và gửi nó qua HTTP thuần túy. Tính bảo mật của ứng dụng rất quan trọng đối với người dùng của bạn.
Các phiên là trạng thái và có nhiều triển khai cơ sở dữ liệu của kho cookie cho gói Gorilla, cho cả cơ sở dữ liệu SQL và NoSQL.