@@ -104,7 +104,9 @@ public function test_users_may_be_retrieved_from_cookies()
104104 $ request ->headers ->set ('X-CSRF-TOKEN ' , 'token ' );
105105 $ request ->cookies ->set ('laravel_token ' ,
106106 $ encrypter ->encrypt (JWT ::encode ([
107- 'sub ' => 1 , 'csrf ' => 'token ' ,
107+ 'sub ' => 1 ,
108+ 'aud ' => 1 ,
109+ 'csrf ' => 'token ' ,
108110 'expiry ' => Carbon::now ()->addMinutes (10 )->getTimestamp (),
109111 ], str_repeat ('a ' , 16 )), false )
110112 );
@@ -130,7 +132,9 @@ public function test_cookie_xsrf_is_verified_against_header()
130132 $ request ->headers ->set ('X-CSRF-TOKEN ' , 'wrong_token ' );
131133 $ request ->cookies ->set ('laravel_token ' ,
132134 $ encrypter ->encrypt (JWT ::encode ([
133- 'sub ' => 1 , 'csrf ' => 'token ' ,
135+ 'sub ' => 1 ,
136+ 'aud ' => 1 ,
137+ 'csrf ' => 'token ' ,
134138 'expiry ' => Carbon::now ()->addMinutes (10 )->getTimestamp (),
135139 ], str_repeat ('a ' , 16 )))
136140 );
@@ -154,7 +158,9 @@ public function test_expired_cookies_may_not_be_used()
154158 $ request ->headers ->set ('X-CSRF-TOKEN ' , 'token ' );
155159 $ request ->cookies ->set ('laravel_token ' ,
156160 $ encrypter ->encrypt (JWT ::encode ([
157- 'sub ' => 1 , 'csrf ' => 'token ' ,
161+ 'sub ' => 1 ,
162+ 'aud ' => 1 ,
163+ 'csrf ' => 'token ' ,
158164 'expiry ' => Carbon::now ()->subMinutes (10 )->getTimestamp (),
159165 ], str_repeat ('a ' , 16 )))
160166 );
@@ -180,6 +186,7 @@ public function test_csrf_check_can_be_disabled()
180186 $ request ->cookies ->set ('laravel_token ' ,
181187 $ encrypter ->encrypt (JWT ::encode ([
182188 'sub ' => 1 ,
189+ 'aud ' => 1 ,
183190 'expiry ' => Carbon::now ()->addMinutes (10 )->getTimestamp (),
184191 ], str_repeat ('a ' , 16 )), false )
185192 );
@@ -190,9 +197,111 @@ public function test_csrf_check_can_be_disabled()
190197
191198 $ this ->assertEquals ($ expectedUser , $ user );
192199 }
200+
201+ public function test_client_can_be_pulled_via_bearer_token ()
202+ {
203+ $ resourceServer = Mockery::mock ('League\OAuth2\Server\ResourceServer ' );
204+ $ userProvider = Mockery::mock ('Illuminate\Contracts\Auth\UserProvider ' );
205+ $ tokens = Mockery::mock ('Laravel\Passport\TokenRepository ' );
206+ $ clients = Mockery::mock ('Laravel\Passport\ClientRepository ' );
207+ $ encrypter = Mockery::mock ('Illuminate\Contracts\Encryption\Encrypter ' );
208+
209+ $ guard = new TokenGuard ($ resourceServer , $ userProvider , $ tokens , $ clients , $ encrypter );
210+
211+ $ request = Request::create ('/ ' );
212+ $ request ->headers ->set ('Authorization ' , 'Bearer token ' );
213+
214+ $ resourceServer ->shouldReceive ('validateAuthenticatedRequest ' )->andReturn ($ psr = Mockery::mock ());
215+ $ psr ->shouldReceive ('getAttribute ' )->with ('oauth_client_id ' )->andReturn (1 );
216+ $ clients ->shouldReceive ('findActive ' )->with (1 )->andReturn (new TokenGuardTestClient );
217+
218+ $ client = $ guard ->client ($ request );
219+
220+ $ this ->assertInstanceOf ('TokenGuardTestClient ' , $ client );
221+ }
222+
223+ public function test_no_client_is_returned_when_oauth_throws_exception ()
224+ {
225+ $ container = new Container ;
226+ Container::setInstance ($ container );
227+ $ container ->instance ('Illuminate\Contracts\Debug\ExceptionHandler ' , $ handler = Mockery::mock ());
228+ $ handler ->shouldReceive ('report ' )->once ()->with (Mockery::type ('League\OAuth2\Server\Exception\OAuthServerException ' ));
229+
230+ $ resourceServer = Mockery::mock ('League\OAuth2\Server\ResourceServer ' );
231+ $ userProvider = Mockery::mock ('Illuminate\Contracts\Auth\UserProvider ' );
232+ $ tokens = Mockery::mock ('Laravel\Passport\TokenRepository ' );
233+ $ clients = Mockery::mock ('Laravel\Passport\ClientRepository ' );
234+ $ encrypter = Mockery::mock ('Illuminate\Contracts\Encryption\Encrypter ' );
235+
236+ $ guard = new TokenGuard ($ resourceServer , $ userProvider , $ tokens , $ clients , $ encrypter );
237+
238+ $ request = Request::create ('/ ' );
239+ $ request ->headers ->set ('Authorization ' , 'Bearer token ' );
240+
241+ $ resourceServer ->shouldReceive ('validateAuthenticatedRequest ' )->andThrow (
242+ new League \OAuth2 \Server \Exception \OAuthServerException ('message ' , 500 , 'error type ' )
243+ );
244+
245+ $ this ->assertNull ($ guard ->client ($ request ));
246+
247+ // Assert that `validateAuthenticatedRequest` isn't called twice on failure.
248+ $ this ->assertNull ($ guard ->client ($ request ));
249+ }
250+
251+ public function test_null_is_returned_if_no_client_is_found ()
252+ {
253+ $ resourceServer = Mockery::mock ('League\OAuth2\Server\ResourceServer ' );
254+ $ userProvider = Mockery::mock ('Illuminate\Contracts\Auth\UserProvider ' );
255+ $ tokens = Mockery::mock ('Laravel\Passport\TokenRepository ' );
256+ $ clients = Mockery::mock ('Laravel\Passport\ClientRepository ' );
257+ $ encrypter = Mockery::mock ('Illuminate\Contracts\Encryption\Encrypter ' );
258+
259+ $ guard = new TokenGuard ($ resourceServer , $ userProvider , $ tokens , $ clients , $ encrypter );
260+
261+ $ request = Request::create ('/ ' );
262+ $ request ->headers ->set ('Authorization ' , 'Bearer token ' );
263+
264+ $ resourceServer ->shouldReceive ('validateAuthenticatedRequest ' )->andReturn ($ psr = Mockery::mock ());
265+ $ psr ->shouldReceive ('getAttribute ' )->with ('oauth_client_id ' )->andReturn (1 );
266+ $ clients ->shouldReceive ('findActive ' )->with (1 )->andReturn (null );
267+
268+ $ this ->assertNull ($ guard ->client ($ request ));
269+ }
270+
271+ public function test_clients_may_be_retrieved_from_cookies ()
272+ {
273+ $ resourceServer = Mockery::mock ('League\OAuth2\Server\ResourceServer ' );
274+ $ userProvider = Mockery::mock ('Illuminate\Contracts\Auth\UserProvider ' );
275+ $ tokens = Mockery::mock ('Laravel\Passport\TokenRepository ' );
276+ $ clients = Mockery::mock ('Laravel\Passport\ClientRepository ' );
277+ $ encrypter = new Illuminate \Encryption \Encrypter (str_repeat ('a ' , 16 ));
278+
279+ $ guard = new TokenGuard ($ resourceServer , $ userProvider , $ tokens , $ clients , $ encrypter );
280+
281+ $ request = Request::create ('/ ' );
282+ $ request ->headers ->set ('X-CSRF-TOKEN ' , 'token ' );
283+ $ request ->cookies ->set ('laravel_token ' ,
284+ $ encrypter ->encrypt (JWT ::encode ([
285+ 'sub ' => 1 ,
286+ 'aud ' => 1 ,
287+ 'csrf ' => 'token ' ,
288+ 'expiry ' => Carbon::now ()->addMinutes (10 )->getTimestamp (),
289+ ], str_repeat ('a ' , 16 )), false )
290+ );
291+
292+ $ clients ->shouldReceive ('findActive ' )->with (1 )->andReturn ($ expectedClient = new TokenGuardTestClient );
293+
294+ $ client = $ guard ->client ($ request );
295+
296+ $ this ->assertEquals ($ expectedClient , $ client );
297+ }
193298}
194299
195300class TokenGuardTestUser
196301{
197302 use Laravel \Passport \HasApiTokens;
198303}
304+
305+ class TokenGuardTestClient
306+ {
307+ }
0 commit comments