AuthTokenGuardTest.php 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. <?php
  2. namespace Illuminate\Tests\Auth;
  3. use Illuminate\Auth\TokenGuard;
  4. use Illuminate\Contracts\Auth\UserProvider;
  5. use Illuminate\Http\Request;
  6. use Mockery as m;
  7. use PHPUnit\Framework\TestCase;
  8. class AuthTokenGuardTest extends TestCase
  9. {
  10. protected function tearDown(): void
  11. {
  12. m::close();
  13. }
  14. public function testUserCanBeRetrievedByQueryStringVariable()
  15. {
  16. $provider = m::mock(UserProvider::class);
  17. $user = new AuthTokenGuardTestUser;
  18. $user->id = 1;
  19. $provider->shouldReceive('retrieveByCredentials')->once()->with(['api_token' => 'foo'])->andReturn($user);
  20. $request = Request::create('/', 'GET', ['api_token' => 'foo']);
  21. $guard = new TokenGuard($provider, $request);
  22. $user = $guard->user();
  23. $this->assertSame(1, $user->id);
  24. $this->assertTrue($guard->check());
  25. $this->assertFalse($guard->guest());
  26. $this->assertSame(1, $guard->id());
  27. }
  28. public function testTokenCanBeHashed()
  29. {
  30. $provider = m::mock(UserProvider::class);
  31. $user = new AuthTokenGuardTestUser;
  32. $user->id = 1;
  33. $provider->shouldReceive('retrieveByCredentials')->once()->with(['api_token' => hash('sha256', 'foo')])->andReturn($user);
  34. $request = Request::create('/', 'GET', ['api_token' => 'foo']);
  35. $guard = new TokenGuard($provider, $request, 'api_token', 'api_token', $hash = true);
  36. $user = $guard->user();
  37. $this->assertSame(1, $user->id);
  38. $this->assertTrue($guard->check());
  39. $this->assertFalse($guard->guest());
  40. $this->assertSame(1, $guard->id());
  41. }
  42. public function testUserCanBeRetrievedByAuthHeaders()
  43. {
  44. $provider = m::mock(UserProvider::class);
  45. $provider->shouldReceive('retrieveByCredentials')->once()->with(['api_token' => 'foo'])->andReturn((object) ['id' => 1]);
  46. $request = Request::create('/', 'GET', [], [], [], ['PHP_AUTH_USER' => 'foo', 'PHP_AUTH_PW' => 'foo']);
  47. $guard = new TokenGuard($provider, $request);
  48. $user = $guard->user();
  49. $this->assertSame(1, $user->id);
  50. }
  51. public function testUserCanBeRetrievedByBearerToken()
  52. {
  53. $provider = m::mock(UserProvider::class);
  54. $provider->shouldReceive('retrieveByCredentials')->once()->with(['api_token' => 'foo'])->andReturn((object) ['id' => 1]);
  55. $request = Request::create('/', 'GET', [], [], [], ['HTTP_AUTHORIZATION' => 'Bearer foo']);
  56. $guard = new TokenGuard($provider, $request);
  57. $user = $guard->user();
  58. $this->assertSame(1, $user->id);
  59. }
  60. public function testValidateCanDetermineIfCredentialsAreValid()
  61. {
  62. $provider = m::mock(UserProvider::class);
  63. $user = new AuthTokenGuardTestUser;
  64. $user->id = 1;
  65. $provider->shouldReceive('retrieveByCredentials')->once()->with(['api_token' => 'foo'])->andReturn($user);
  66. $request = Request::create('/', 'GET', ['api_token' => 'foo']);
  67. $guard = new TokenGuard($provider, $request);
  68. $this->assertTrue($guard->validate(['api_token' => 'foo']));
  69. }
  70. public function testValidateCanDetermineIfCredentialsAreInvalid()
  71. {
  72. $provider = m::mock(UserProvider::class);
  73. $provider->shouldReceive('retrieveByCredentials')->once()->with(['api_token' => 'foo'])->andReturn(null);
  74. $request = Request::create('/', 'GET', ['api_token' => 'foo']);
  75. $guard = new TokenGuard($provider, $request);
  76. $this->assertFalse($guard->validate(['api_token' => 'foo']));
  77. }
  78. public function testValidateIfApiTokenIsEmpty()
  79. {
  80. $provider = m::mock(UserProvider::class);
  81. $request = Request::create('/', 'GET', ['api_token' => '']);
  82. $guard = new TokenGuard($provider, $request);
  83. $this->assertFalse($guard->validate(['api_token' => '']));
  84. }
  85. public function testItAllowsToPassCustomRequestInSetterAndUseItForValidation()
  86. {
  87. $provider = m::mock(UserProvider::class);
  88. $user = new AuthTokenGuardTestUser;
  89. $user->id = 1;
  90. $provider->shouldReceive('retrieveByCredentials')->once()->with(['api_token' => 'custom'])->andReturn($user);
  91. $request = Request::create('/', 'GET', ['api_token' => 'foo']);
  92. $guard = new TokenGuard($provider, $request);
  93. $guard->setRequest(Request::create('/', 'GET', ['api_token' => 'custom']));
  94. $user = $guard->user();
  95. $this->assertSame(1, $user->id);
  96. }
  97. public function testUserCanBeRetrievedByBearerTokenWithCustomKey()
  98. {
  99. $provider = m::mock(UserProvider::class);
  100. $provider->shouldReceive('retrieveByCredentials')->once()->with(['custom_token_field' => 'foo'])->andReturn((object) ['id' => 1]);
  101. $request = Request::create('/', 'GET', [], [], [], ['HTTP_AUTHORIZATION' => 'Bearer foo']);
  102. $guard = new TokenGuard($provider, $request, 'custom_token_field', 'custom_token_field');
  103. $user = $guard->user();
  104. $this->assertSame(1, $user->id);
  105. }
  106. public function testUserCanBeRetrievedByQueryStringVariableWithCustomKey()
  107. {
  108. $provider = m::mock(UserProvider::class);
  109. $user = new AuthTokenGuardTestUser;
  110. $user->id = 1;
  111. $provider->shouldReceive('retrieveByCredentials')->once()->with(['custom_token_field' => 'foo'])->andReturn($user);
  112. $request = Request::create('/', 'GET', ['custom_token_field' => 'foo']);
  113. $guard = new TokenGuard($provider, $request, 'custom_token_field', 'custom_token_field');
  114. $user = $guard->user();
  115. $this->assertSame(1, $user->id);
  116. $this->assertTrue($guard->check());
  117. $this->assertFalse($guard->guest());
  118. $this->assertSame(1, $guard->id());
  119. }
  120. public function testUserCanBeRetrievedByAuthHeadersWithCustomField()
  121. {
  122. $provider = m::mock(UserProvider::class);
  123. $provider->shouldReceive('retrieveByCredentials')->once()->with(['custom_token_field' => 'foo'])->andReturn((object) ['id' => 1]);
  124. $request = Request::create('/', 'GET', [], [], [], ['PHP_AUTH_USER' => 'foo', 'PHP_AUTH_PW' => 'foo']);
  125. $guard = new TokenGuard($provider, $request, 'custom_token_field', 'custom_token_field');
  126. $user = $guard->user();
  127. $this->assertSame(1, $user->id);
  128. }
  129. public function testValidateCanDetermineIfCredentialsAreValidWithCustomKey()
  130. {
  131. $provider = m::mock(UserProvider::class);
  132. $user = new AuthTokenGuardTestUser;
  133. $user->id = 1;
  134. $provider->shouldReceive('retrieveByCredentials')->once()->with(['custom_token_field' => 'foo'])->andReturn($user);
  135. $request = Request::create('/', 'GET', ['custom_token_field' => 'foo']);
  136. $guard = new TokenGuard($provider, $request, 'custom_token_field', 'custom_token_field');
  137. $this->assertTrue($guard->validate(['custom_token_field' => 'foo']));
  138. }
  139. public function testValidateCanDetermineIfCredentialsAreInvalidWithCustomKey()
  140. {
  141. $provider = m::mock(UserProvider::class);
  142. $provider->shouldReceive('retrieveByCredentials')->once()->with(['custom_token_field' => 'foo'])->andReturn(null);
  143. $request = Request::create('/', 'GET', ['custom_token_field' => 'foo']);
  144. $guard = new TokenGuard($provider, $request, 'custom_token_field', 'custom_token_field');
  145. $this->assertFalse($guard->validate(['custom_token_field' => 'foo']));
  146. }
  147. public function testValidateIfApiTokenIsEmptyWithCustomKey()
  148. {
  149. $provider = m::mock(UserProvider::class);
  150. $request = Request::create('/', 'GET', ['custom_token_field' => '']);
  151. $guard = new TokenGuard($provider, $request, 'custom_token_field', 'custom_token_field');
  152. $this->assertFalse($guard->validate(['custom_token_field' => '']));
  153. }
  154. }
  155. class AuthTokenGuardTestUser
  156. {
  157. public $id;
  158. public function getAuthIdentifier()
  159. {
  160. return $this->id;
  161. }
  162. }