2015-02-23 18 views
10

Tôi đã xây dựng một API tạo ra một mã thông báo xác thực cho người dùng đăng nhập. Tại thời điểm này tôi cũng có một ứng dụng khách được viết bằng Node.JS.
Khi tôi thực hiện yêu cầu với thông tin xác thực người dùng từ ứng dụng khách đến API, tôi nhận được mã thông báo xác thực: tôi nên lưu trữ nó như thế nào trong ứng dụng khách? Tôi không phải yêu cầu mã thông báo mỗi lần tôi muốn yêu cầu API, đúng không?
Tôi đã nghĩ đến việc đặt mã thông báo trong Cookie, nhưng tôi không nghĩ đó là giải pháp tốt nhất. Bạn sẽ đề xuất điều gì?Tôi nên lưu trữ mã thông báo được tạo bởi API RESTful như thế nào?

+0

là ứng dụng khách của bạn, máy chủ node.js, sử dụng bất kỳ kho dữ liệu nào? –

+0

Tôi đang sử dụng MongoDB – IgorSousaPT

+0

bạn có thể tạo kho dữ liệu trong bộ nhớ như redis để lưu trữ mã thông báo và sử dụng nó để yêu cầu thêm. Sử dụng lưu trữ phiên với kết nối-redis là một giải pháp khả thi. –

Trả lời

5

Khi đăng nhập thành công, mã thông báo duy nhất, một lần sử dụng sẽ được tạo phía máy chủ và được lưu trữ trong cơ sở dữ liệu dựa vào id người dùng và dấu thời gian. Bạn lưu trữ mã thông báo ở phía máy khách cookie. Sau đó, bạn chuyển mã thông báo lên cho mọi lệnh gọi API tiếp theo. Các máy chủ sau đó nên kiểm tra mã thông báo là hợp lệ (tức là không hết hạn, nói phát hành hoặc cập nhật ít hơn sau đó nói 30 phút trước). Nếu nó hợp lệ, bạn có thể truy xuất các chi tiết người dùng được lưu trữ với mã thông báo đó và thực hiện bất kỳ chức năng phụ trợ nào bạn cần (khi người dùng được xác thực). Sau đó, bạn cập nhật dấu thời gian cho mã thông báo đó (làm mới phiên khi bạn muốn đăng nhập hết thời gian chờ sau khi nói 30 phút không tương tác với người dùng). Nếu mã thông báo hết hạn hoặc không tồn tại khi bạn nhận được cuộc gọi API, hãy chuyển hướng đến trang đăng nhập. Ngoài ra, bạn có thể đã biết điều này, nhưng hãy đảm bảo mã thông báo là duy nhất và không thể đoán được, tôi có xu hướng tạo GUID ngẫu nhiên mới và mã hóa chúng, không sử dụng id liên tiếp hoặc bất kỳ thứ gì tương tự.

+0

Vâng, tôi biết về phần độc đáo và không thể đoán được, nhưng cảm ơn bạn đã chỉ ra nó. Câu hỏi của tôi về phương pháp cookie là an toàn không? Không phải là nó có thể ăn cắp giá trị cookie và truy cập thông tin cá nhân người dùng khác? – IgorSousaPT

+0

Giả sử bạn đang sử dụng SSL, sẽ rất khó để đoán trước giá trị bằng cách sử dụng một cuộc tấn công trung gian. Sử dụng mã thông báo hết hạn duy nhất sẽ hiển thị mã thông báo vô dụng sau khi sử dụng, vì vậy tương đối an toàn. Bạn cũng có thể ip xác thực đối với các mã thông báo giả sử người dùng giữ cùng một ip cho thời gian của phiên (có khả năng). Nhưng có, có thể có mã độc trên máy khách tải lên tất cả thông tin cookie đến trang web thứ 3, nhưng tôi muốn nói rằng việc sử dụng cookie đủ an toàn cho hầu hết các ứng dụng web nếu được triển khai chính xác. HOẶC, bạn có thể xem xét OAuth, đây là một nhức đầu khác, nhưng phương pháp xác thực được sử dụng rộng rãi. –

+0

Thực ra, tôi đang sử dụng OAuth2.0 để xác thực thông tin xác thực và tạo mã thông báo. Nhưng tôi vẫn cần lưu trữ mã thông báo ở phía máy khách. Trừ khi, tôi nhận được sai lầm khủng khiếp này! – IgorSousaPT

1

Tôi nghĩ rằng liên kết này có thể giúp bạn:

Trong thực tế, bạn nên có một mã thông báo với ngày hết hạn, vì vậy bạn không phải nhận mã thông báo mới mỗi lần trước khi gửi yêu cầu. Khi mã thông báo hết hạn, bạn chỉ cần nhận mã thông báo mới từ "mã thông báo làm mới" của dịch vụ.

Về câu hỏi về cách lưu trữ mã thông báo trong ứng dụng khách, tôi nghĩ rằng bạn có thể giữ nó trong bộ nhớ (bản đồ hoặc cơ sở dữ liệu nhúng).

Nếu không kết thúc, tôi không nghĩ rằng bạn nên sử dụng cookie trong trường hợp sử dụng như vậy.

Hy vọng nó sẽ giúp bạn. Thierry

1

Chúng tôi đang làm việc trên một ứng dụng sử dụng cách tiếp cận rất giống nhau. Ứng dụng máy khách là một ứng dụng đơn trang HTML5/JS tĩnh (không có thế hệ phía máy chủ nào) và giao tiếp với máy chủ API.

Cách tiếp cận tốt nhất là lưu trữ mã thông báo phiên trong bộ nhớ: nghĩa là, bên trong một biến trong mã JS. Nếu ứng dụng khách của bạn là một trang duy nhất, nó không phải là một vấn đề.
Ngoài ra, chúng tôi cũng giữ mã thông báo phiên trong sessionStorage để bảo vệ nó trong trường hợp người dùng làm mới trang. Để duy trì mã thông báo khi các tab mới được tạo (sessionStorage cụ thể cho cửa sổ trình duyệt), chúng tôi cũng lưu trữ nó trong localStorage khi trang bị đóng, cùng với bộ đếm cho các tab đang mở (khi tất cả các tab của ứng dụng được đóng, chúng tôi xóa mã thông báo.

// Handle page reloads using sessionStorage 
var sess = sessionStorage.getItem('session-token') 
if(sess && sess !== 'null') { // Sometimes empty values are a string "null" 
    localStorage.setItem('session-token', sess) 
} 

// Set a counter to check when all pages/tabs of the application are closed 
var counter = parseInt(localStorage.getItem('session-counter') || 0, 10) 
counter++ 
localStorage.setItem('session-counter', counter) 

// Event fired when the page/tab is closing 
window.onbeforeunload = function() { 
    var counter = parseInt(localStorage.getItem('session-counter') || 0, 10) 
    counter-- 
    localStorage.setItem('session-counter', counter) 

    // All pages are closed: remove the session token 
    if(counter <= 0) { 
     // Handle page reloads using sessionStorage 
     sessionStorage.setItem('session-token', localStorage.getItem('session-token')) 

     localStorage.removeItem('session-token') 
    } 
} 

Để biết thêm thông tin về localStorage và sessionStorage: https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API

Tại sao không cookie? Cookie không hợp lệ vì hai lý do: 1. Chúng thường bền bỉ hơn, được chia sẻ trên các cửa sổ trình duyệt và tab và chúng có thể tồn tại ngay cả sau khi trình duyệt bị đóng. 2. Quan trọng nhất, tuy nhiên, theo thông số kỹ thuật HTTP, chúng phải được gửi đến máy chủ web mỗi khi có yêu cầu. Nếu bạn đang thiết kế một ứng dụng mà máy khách hoàn toàn tách biệt khỏi máy chủ API, bạn không muốn máy chủ của khách hàng thấy (hoặc đăng nhập!) Mã thông báo phiên trong mọi trường hợp.

Một số lời khuyên thêm:

  1. tokens phiên phải hết hạn. Bạn có thể đạt được điều đó bằng cách lưu trữ mã thông báo phiên trong cơ sở dữ liệu trên máy chủ và xác minh chúng trên mọi yêu cầu và/hoặc "ký" chúng (thêm dấu thời gian vào mã thông báo trong văn bản thuần túy, sau đó thêm phần đã ký, ví dụ như mã băm HMAC, với dấu thời gian được mã hóa bằng khóa bí mật mà bạn chỉ biết).
  2. Thẻ có thể được sử dụng lại nhiều lần trong suốt cuộc đời của chúng. Tuy nhiên, sau một số giây nhất định, bạn có thể muốn máy chủ của mình làm mới mã thông báo, làm mất hiệu lực mã thông báo cũ và gửi mã thông báo mới đến máy khách.
Các vấn đề liên quan