2015-10-24 18 views
8

Tôi hơi bị bối rối bởi cái này. Tôi đang cố thiết lập JWT hợp lệ. Tôi đang sử dụng node.js với phần mềm trung gian jsonwebtoken. Tôi đã theo các tài liệu nằm trên repo (located here), nhưng tôi tiếp tục nhận được Exp và Iat sai. Rõ ràng tôi muốn có được quyền này để tôi không cho phép JWT đã hết hạn.Không thể đặt Exp và Iat cho JWT chính xác

Là một thử nghiệm tôi có đoạn mã sau:

var token = jwt.sign({"id": user._id}, configGeneral.JWT, { expiresIn: '1h' }); 

var decoded = jwt.decode(token, configGeneral.JWT); 

var d1 = new Date(decoded.exp); 
var d2 = new Date(decoded.iat); 

console.log(decoded); 
console.log(d1); 
console.log(d2); 

Kết quả của việc này là:

{ id: '56253091fe0397c80133f3e4', 
    iat: 1445714161, 
    exp: 1445717761 } 
Sat Jan 17 1970 19:35:17 GMT+0200 (South Africa Standard Time) 
Sat Jan 17 1970 19:35:14 GMT+0200 (South Africa Standard Time) 

Làm thế nào để tôi nhận được dấu thời gian để không phản ánh thời đại javascript, nhưng thay vì thời gian 1 giờ kể từ bây giờ? (Cho cả iat và exp.)

Trả lời

2

Dựa trên những gì Krzysztof Sztompka được đăng, tôi có thể nhận được Ext đến hiển thị ngày hết hạn chính xác. (Yêu cầu ban đầu của tôi là trong vòng 1 tiếng đồng hồ trong tương lai)

Để theo dõi sự thay đổi so với trước sai lầm, tôi sẽ không cập nhật các mã trên, vì vậy đây là những gì tôi đã thay đổi:

var d = new Date(); 

var calculatedExpiresIn = (((d.getTime()) + (60 * 60 * 1000)) - (d.getTime() - d.getMilliseconds())/1000); 

var token = jwt.sign({"id": user._id}, configGeneral.JWT, { expiresIn: calculatedExpiresIn }); 

Các console.log của bây giờ sẽ cho thấy rằng Ext là như tôi muốn nó, bây giờ + 1 giờ.

Để làm cho Iat hiển thị đúng ngày (sau khi cài đặt nó trong chức năng sign và sau đó kiểm tra tính năng trong chức năng decode), tôi phải đặt nó làm một phần của tải trọng.Tôi có câu trả lời của tôi here

Vì vậy, cuối cùng để có được những IAT để hiển thị một cách chính xác tôi đã thêm nó vào tải trọng như ở đây:

var token = jwt.sign({"id": user._id, "iat": (new Date().getTime())}, configGeneral.JWT, { expiresIn: calculatedExpiresIn }); 

này đưa ra một sản lượng:

{ id: '56253091fe0397c80133f3e4', 
    iat: 1445763099706, 
    exp: 1445766699705 } 
Sun Oct 25 2015 11:51:39 GMT+0200 (South Africa Standard Time) 
Sun Oct 25 2015 10:51:39 GMT+0200 (South Africa Standard Time) 

Đây là JWT chưa được mã hóa mà tôi sẽ chuyển lại cho người dùng khi họ đã đăng nhập thành công và sẽ cho phép tôi kiểm tra xem JWT họ có phải vượt qua vì mọi yêu cầu trong tương lai vẫn hợp lệ và chưa hết hạn hay chưa.

10

này:

new Date().getTime() 

cung cấp cho bạn thời gian theo mili giây. Nhưng lần trong JWT token (iat, exp) được chỉ trong vài giây, do đó chúng ta phải phân chia kết quả bằng 1000.

var actualTimeInSeconds = new Date().getTime()/1000; 

Làm thế nào để có được một số thời gian trong vài giây từ bây giờ:

(new Date().getTime() + someTimeInSeconds * 1000)/1000 

Nếu bạn cần 1 giờ từ bây giờ:

(new Date().getTime() + 60 * 60 * 1000)/1000 

vì 1h = 60min * 60 s

Và tại thời điểm này bạn có thời gian trong Secon ds từ mã thông báo jwt và thời gian tính bằng giây. Bạn chỉ nên so sánh các giá trị này.

Chính xác trong trường hợp của bạn, bạn nên so sánh thời gian mã thông báo jwt với thời gian thực tế của bạn tính bằng giây. Nếu thời gian hết hạn mã thông báo jwt lớn hơn thì thời gian thực tế có nghĩa là thời gian hết hạn hợp lệ. Từ tài liệu của JWT mã thông báo:

Việc xử lý yêu cầu bồi thường exp đòi hỏi ngày hiện tại/giờ PHẢI trước ngày hết hạn/thời gian liệt kê trong tuyên bố exp.

Edit:

Để có được ngày coorect từ iat, giá trị nhân với 1000 và thêm vào ngày constructor mới:

new Date(iat*1000) 
+0

nếu tôi lấy ví dụ mã thứ 4 của bạn và nạp nó vào hết hạnTrong thời gian đó, tôi nhận được thời đại và một vài ngày (3 Feb 1970). Tuy nhiên, nếu tôi xóa số chia cho 1000, tôi sẽ có ngày hôm nay + 17 ngày và vài giờ của thời đại. Tôi chơi xung quanh một chút nhưng có Ext để hiển thị ngày hết hạn chính xác (xem cập nhật câu hỏi của tôi). Tuy nhiên, điều này vẫn còn lại cho tôi với một Iat không chính xác. – Ebbs

+1

Tôi đã đăng giải pháp mà tôi đã đưa ra vì nó thực sự giải quyết được vấn đề mà tôi không nhận được Ext và Iat chính xác vào JWT. Tôi có lẽ đã không giải thích rõ phần đó và tôi nghĩ bạn có thể đã hiểu lầm yêu cầu đó vì điều đó. Tuy nhiên, đầu vào của bạn chắc chắn đã giúp tôi có được câu trả lời đúng, cảm ơn người đàn ông! :) Bạn đang quire ngay rằng tôi sẽ phải giải mã các JWT và sau đó so sánh các giây của Ext với thời gian hiện tại của tôi để có thể xác định nếu JWT đã hết hạn hay không. – Ebbs

+0

Tôi thích 'ngày mới(). GetTime()/1000 + 60 * 60' – ChrLipp

Các vấn đề liên quan