Quy trình làm mới mã thông báo JWT


129

Tôi đang xây dựng một ứng dụng di động và đang sử dụng JWT để xác thực.

Có vẻ như cách tốt nhất để làm điều này là ghép nối mã thông báo truy cập JWT với mã thông báo làm mới để tôi có thể hết hạn mã thông báo truy cập thường xuyên như tôi muốn.

  1. Mã thông báo làm mới trông như thế nào? Nó có phải là một chuỗi ngẫu nhiên không? Chuỗi đó có được mã hóa không? Nó có phải là một JWT khác không?
  2. Mã làm mới sẽ được lưu trữ trong cơ sở dữ liệu trên mô hình người dùng để truy cập, đúng không? Có vẻ như nó phải được mã hóa trong trường hợp này
  3. Tôi có gửi lại mã thông báo làm mới sau khi người dùng đăng nhập và sau đó yêu cầu khách hàng truy cập vào một tuyến đường riêng để lấy mã thông báo truy cập không?

3
Lưu ý, nếu bạn đang sử dụng mã thông báo làm mới, bạn nên cung cấp khả năng để người dùng vô hiệu hóa chúng trên giao diện người dùng. Nó cũng được khuyến nghị để chúng tự động hết hạn nếu chúng không được sử dụng trong một tháng.
Vilmantas Baranauskas

1
@jtmarmon: làm cách nào để bạn lưu trữ mã thông báo làm mới ở phía máy khách? Ý tôi là thiết bị Android có an toàn không?
j10

Câu trả lời:


39

Giả sử rằng đây là về OAuth 2.0 vì nó là về JWT và làm mới mã thông báo ...:

  1. giống như mã thông báo truy cập, về nguyên tắc, mã thông báo làm mới có thể là bất kỳ thứ gì bao gồm tất cả các tùy chọn bạn mô tả; JWT có thể được sử dụng khi Máy chủ Cấp quyền muốn không có trạng thái hoặc muốn thực thi một số loại ngữ nghĩa "bằng chứng sở hữu" đối với máy khách trình bày nó; lưu ý rằng mã thông báo làm mới khác với mã thông báo truy cập ở chỗ nó không được hiển thị cho Máy chủ tài nguyên mà chỉ cho Máy chủ cấp phép đã phát hành nó ngay từ đầu, vì vậy, tối ưu hóa xác thực độc lập cho mã thông báo JWTs-as-access- không giữ để làm mới mã thông báo

  2. điều đó phụ thuộc vào tính bảo mật / quyền truy cập của cơ sở dữ liệu; nếu cơ sở dữ liệu có thể được truy cập bởi các bên / máy chủ / ứng dụng / người dùng khác, thì có (nhưng số dặm của bạn có thể thay đổi tùy theo vị trí và cách bạn lưu trữ khóa mã hóa ...)

  3. Máy chủ Ủy quyền có thể phát hành đồng thời cả mã thông báo truy cập và mã làm mới, tùy thuộc vào khoản tài trợ được khách hàng sử dụng để lấy chúng; thông số kỹ thuật chứa các chi tiết và tùy chọn trên mỗi khoản trợ cấp được tiêu chuẩn hóa


31
2. Bạn nên lưu trữ một băm của mã làm mới trong cơ sở dữ liệu của mình và sau đó so sánh băm của mã làm mới của người dùng với mã băm đã lưu trữ của bạn. Quy tắc "không lưu trữ mật khẩu văn bản thuần túy trong cơ sở dữ liệu của bạn" sau đây. Hãy coi một mã thông báo giống như một mật khẩu ngẫu nhiên mà bạn đã tạo cho người dùng.
Rohmer

2
Ngoài ra, nếu bạn muốn cung cấp thêm bảo mật, hãy thực hiện quay vòng mã thông báo làm mới. Tầm quan trọng của điều này đã được đề cập trong ITEF RFC 6749 . Nếu được triển khai đúng cách, điều này cũng có thể giúp xác định tình huống đánh cắp mã thông báo, tức là mã thông báo làm mới đã bị kẻ tấn công đánh cắp. Nếu bạn đang tìm kiếm một lời giải thích tốt hơn, hãy truy cập liên kết
Bhumil Sarvaiya vào

82

Dưới đây là các bước để thu hồi mã thông báo truy cập JWT của bạn:

  1. Khi bạn đăng nhập, hãy gửi 2 mã thông báo (Mã thông báo truy cập, Mã thông báo làm mới) để phản hồi cho khách hàng.
  2. Mã thông báo truy cập sẽ có thời gian hết hạn ít hơn và Làm mới sẽ có thời gian hết hạn dài.
  3. Máy khách (Giao diện người dùng) sẽ lưu trữ mã thông báo làm mới trong bộ nhớ cục bộ và mã thông báo truy cập trong cookie.
  4. Máy khách sẽ sử dụng mã thông báo truy cập để gọi các API. Nhưng khi nó hết hạn, hãy chọn mã làm mới từ bộ nhớ cục bộ và gọi API máy chủ auth để nhận mã mới.
  5. Máy chủ xác thực của bạn sẽ có một API được tiết lộ sẽ chấp nhận mã thông báo làm mới và kiểm tra tính hợp lệ của nó và trả lại mã thông báo truy cập mới.
  6. Khi mã thông báo làm mới hết hạn, Người dùng sẽ bị đăng xuất.

Vui lòng cho tôi biết nếu bạn cần thêm chi tiết, tôi có thể chia sẻ mã (Java + Spring boot).

Đối với câu hỏi của bạn:

Q1: Đó là một JWT khác với ít yêu cầu hơn với thời gian hết hạn dài.

Câu hỏi 2: Nó sẽ không có trong cơ sở dữ liệu. Phần phụ trợ sẽ không lưu trữ ở bất kỳ đâu. Họ sẽ chỉ giải mã mã thông báo bằng khóa riêng tư / công khai và xác thực nó với thời gian hết hạn của nó.

Q3: Có, đúng


28
Tôi nghĩ rằng JWT nên được lưu trữ trong localStoragerefreshTokennên được lưu trữ trong a httpOnly. Có refreshToeknthể được sử dụng để có một JWT mới vì vậy nó phải được xử lý cẩn thận hơn.
Tnc Andrei

2
Cảm ơn bạn có nghĩa là gì khi lưu trữ trong httpOnly? Tại sao không lưu trữ cả hai trong localStorage?
Jay

8
Tôi đang thiếu các lợi ích của việc sử dụng mã thông báo làm mới, sẽ không giống nhau để mở rộng hiệu lực của mã thông báo truy cập?
user2010955

3
@Jay Theo Mạng nhà phát triển của Microsoft, HttpOnly là một cờ bổ sung được bao gồm trong tiêu đề phản hồi Set-Cookie HTTP. Sử dụng cờ HttpOnly khi tạo cookie giúp giảm thiểu rủi ro tập lệnh phía máy khách truy cập vào cookie được bảo vệ (nếu trình duyệt hỗ trợ nó).
shadow0359

23
# 2 là rất không chính xác. Một mã thông báo làm mới CÓ được lưu trữ ở phía máy chủ. Bạn không nên tận dụng thuộc tính "độc lập" của JWT để làm mới mã thông báo. Làm như vậy khiến bạn không có cách nào để thu hồi mã thông báo làm mới ngoài việc thay đổi khóa riêng tư của mình.
Jai Sharma

26

Dựa trên triển khai này với Node.js của JWT với mã thông báo làm mới :

1) Trong trường hợp này, họ sử dụng uid và nó không phải là JWT. Khi họ làm mới mã thông báo, họ sẽ gửi mã làm mới và người dùng. Nếu bạn triển khai nó dưới dạng JWT, bạn không cần phải gửi người dùng, vì nó sẽ ở bên trong JWT.

2) Họ thực hiện điều này trong một tài liệu (bảng) riêng biệt. Điều đó có ý nghĩa với tôi vì người dùng có thể đăng nhập vào các ứng dụng khách khác nhau và nó có thể có mã thông báo làm mới theo ứng dụng. Nếu người dùng bị mất thiết bị đã cài đặt một ứng dụng, mã làm mới của thiết bị đó có thể bị vô hiệu mà không ảnh hưởng đến các thiết bị đã đăng nhập khác.

3) Trong triển khai này, nó phản hồi với phương pháp đăng nhập bằng cả hai, mã thông báo truy cập và mã thông báo làm mới. Nó nối chính xác với tôi.


Bằng cách nói "1) Trong trường hợp này họ sử dụng uid ..." nghĩa là bạn có UUID?
ozanmuyes

Còn về thực hiện đơn giản hơn này - Issue JWT - gửi JWT cũ khi bạn muốn làm mới - (bạn có thể kiểm tra iatvới cửa sổ) - cấp lại một cái mới dựa trên một trước
adonese

@adonese bằng cách chỉ gửi JWTý bạn là có refresh_tokenbên trong nó? Nếu vậy, OAuth RFC 6749 thông báo rõ ràng là không gửi refresh_tokenđến máy chủ tài nguyên (và JWTđược gửi đến máy chủ tài nguyên): tools.ietf.org/html/rfc6749#section-1.5
Brenno Costa
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.