2013-01-31 20 views
14

Cách phát xác thực cookie?
Chơi khung làm cách nào các phiên và cookie hoạt động?

  • tôi nhận thấy rằng sau khi tôi khởi động lại máy chủ tôi vẫn đăng nhập mặc dù tôi không presist bất kỳ dữ liệu phiên trong cơ sở dữ liệu.
  • Tôi cũng nhận thấy rằng tôi có thể thiết lập ngày trên máy chủ để được lớn rằng ngày exipry cookie và vẫn Tôi đã đăng nhập.
  • Tôi đăng xuất khỏi (lưu cookie để một văn bản và trình duyệt đã mất cookie. Sau đó, tôi tạo lại cookie từ tệp văn bản và tôi đã đăng nhập lại.

Cookie trông như thế này:

PLAY_SESSION = e6443c88da7xxxxxxxxxxxxxxxxxxxxxxxxxxxxx-userid% 3A1

// My logout code 
def logout() = Action { 
    Ok("").withNewSession 
} 

From the documentation
Việc huỷ toàn bộ phiên
Có hoạt động đặc biệt mà loại bỏ cả phiên:

Ok("Bye").withNewSession 

Trả lời

5

Tôi tìm thấy câu trả lời đọc kỹ hơn và kết hợp các phần khác nhau.

Không có thời gian chờ kỹ thuật cho Phiên. Nó hết hạn khi người dùng đóng trình duyệt web. Nếu bạn cần thời gian chờ chức năng cho ứng dụng cụ thể , chỉ cần lưu dấu thời gian vào phiên Người dùng và sử dụng ứng dụng đó theo nhu cầu của bạn (ví dụ: tối đa thời lượng, thời lượng không hoạt động tối đa, v.v.).


Điều quan trọng là phải hiểu rằng phiên và Flash dữ liệu không được lưu trữ bởi máy chủ nhưng được thêm vào mỗi yêu cầu HTTP tiếp theo, sử dụng cơ chế cookie. Điều này có nghĩa rằng kích thước dữ liệu là rất có giới hạn (tối đa 4 KB) và bạn chỉ có thể lưu trữ các giá trị chuỗi.


Vì vậy, đó là những gì tôi lo sợ rằng nếu cookie bị lạc bất cứ ai có thể đăng nhập vào máy chủ cho tất cả trong tương lai.

Những gì tôi phải làm gì để đảm bảo điều này là thêm một uỷ quyền timestamp tự thực hiện (lưu dấu thời gian trong cookie và xác nhận bên sever)

+0

"nếu cookie bị mất bất kỳ ai cũng có thể đăng nhập vào máy chủ cho tất cả trong tương lai", điều đó có nghĩa là gì? Nếu không có cookie, không có quyền truy cập, đó là tất cả phía máy khách, Play chỉ đảm bảo rằng cookie (đã ký) chính nó đã không bị giả mạo. – virtualeyes

+1

Đừng nghĩ rằng bị mất như void nhưng như đi lạc lối. – Farmor

+1

Trong tương lai, hãy liên kết với các tài liệu có liên quan để cho phép người đọc câu trả lời của bạn điều tra thêm. – Cheeso

10

Bạn không nói rõ làm thế nào để bạn xác thực người dùng, vì vậy tôi chỉ cần đoán, rằng bạn, tái sử dụng mẫu đơn giản đó là ... đơn giản.

Nó sử dụng id của người dùng để xác định người dùng và kiểm tra xem cookie phiên đã được ký chưa được xử lý hay chưa, do đó nếu bạn tạo lại cookie có chữ ký thích hợp thì nó vẫn hợp lệ.

Bạn nên tạo một số khu vực cho khóa của phiên trên nghĩa là phía máy chủ. trong DB hoặc trong bộ nhớ cache (Sẽ nhanh hơn DB). Khóa của nó sẽ được tạo ngẫu nhiên (và khá dài) cho mỗi hành động đăng nhập thành công và cũng nên chứa dữ liệu để xác định người dùng, ngày hết hạn, v.v. Tiếp theo, bạn nên đặt ngẫu nhiên sess_key này vào phiên của phiên thay thế địa chỉ email của người dùng đã đăng nhập hoặc id của hàng của mình trong DB, và sau khi đăng xuất và/hoặc ngày hết hạn, nó sẽ được loại bỏ. Trong trường hợp như vậy ngay cả khi bạn sẽ mất cookie sau khi đăng xuất, bạn sẽ không thể đăng nhập đúng cách với không esixting sess_key.

Bộ nhớ cache tiêu chuẩn AFAIR sẽ bị xóa ở mọi lần khởi động lại ứng dụng, để đảm bảo rằng tất cả sess_keys từ DB cũng sẽ bị xóa, bạn có thể sử dụng Global object và cắt bảng theo phương pháp onStart(...).

+0

Có công bằng tại thời điểm này để chỉ đơn giản là ở lại trong hệ thống sinh thái phiên của Play (như xa như xác thực đi)? Tôi đang nghĩ đến việc sử dụng redis cho bộ nhớ cache bán bền để quản lý id sesh và sử dụng riêng các phiên của Play để lưu trữ dữ liệu phiên công khai. Âm thanh này giống như một kế hoạch tốt? –