@@ -56,6 +56,56 @@ public function testDeleteToken()
56
56
$ provider ->loadTokenBySeries ('someSeries ' );
57
57
}
58
58
59
+ public function testVerifyOutdatedTokenAfterParallelRequest ()
60
+ {
61
+ $ provider = $ this ->bootstrapProvider ();
62
+ $ series = base64_encode (random_bytes (64 ));
63
+ $ oldValue = 'oldValue ' ;
64
+ $ newValue = 'newValue ' ;
65
+
66
+ // setup existing token
67
+ $ token = new PersistentToken ('someClass ' , 'someUser ' , $ series , $ oldValue , new \DateTime ('2013-01-26T18:23:51 ' ));
68
+ $ provider ->createNewToken ($ token );
69
+
70
+ // new request comes in requiring remember-me auth, which updates the token
71
+ $ provider ->updateExistingToken ($ token , $ newValue , new \DateTime ('-5 seconds ' ));
72
+ $ provider ->updateToken ($ series , $ newValue , new \DateTime ('-5 seconds ' ));
73
+
74
+ // parallel request comes in with the old remember-me cookie and session, which also requires reauth
75
+ $ token = $ provider ->loadTokenBySeries ($ series );
76
+ $ this ->assertEquals ($ newValue , $ token ->getTokenValue ());
77
+
78
+ // new token is valid
79
+ $ this ->assertTrue ($ provider ->verifyToken ($ token , $ newValue ));
80
+ // old token is still valid
81
+ $ this ->assertTrue ($ provider ->verifyToken ($ token , $ oldValue ));
82
+ }
83
+
84
+ public function testVerifyOutdatedTokenAfterParallelRequestFailsAfter60Seconds ()
85
+ {
86
+ $ provider = $ this ->bootstrapProvider ();
87
+ $ series = base64_encode (random_bytes (64 ));
88
+ $ oldValue = 'oldValue ' ;
89
+ $ newValue = 'newValue ' ;
90
+
91
+ // setup existing token
92
+ $ token = new PersistentToken ('someClass ' , 'someUser ' , $ series , $ oldValue , new \DateTime ('2013-01-26T18:23:51 ' ));
93
+ $ provider ->createNewToken ($ token );
94
+
95
+ // new request comes in requiring remember-me auth, which updates the token
96
+ $ provider ->updateExistingToken ($ token , $ newValue , new \DateTime ('-61 seconds ' ));
97
+ $ provider ->updateToken ($ series , $ newValue , new \DateTime ('-5 seconds ' ));
98
+
99
+ // parallel request comes in with the old remember-me cookie and session, which also requires reauth
100
+ $ token = $ provider ->loadTokenBySeries ($ series );
101
+ $ this ->assertEquals ($ newValue , $ token ->getTokenValue ());
102
+
103
+ // new token is valid
104
+ $ this ->assertTrue ($ provider ->verifyToken ($ token , $ newValue ));
105
+ // old token is not valid anymore after 60 seconds
106
+ $ this ->assertFalse ($ provider ->verifyToken ($ token , $ oldValue ));
107
+ }
108
+
59
109
/**
60
110
* @return DoctrineTokenProvider
61
111
*/
0 commit comments