WebAuthnManageControllerTest.php 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. <?php
  2. namespace Tests\Feature\Http\Auth;
  3. use App\Models\User;
  4. use Illuminate\Foundation\Testing\WithoutMiddleware;
  5. use Illuminate\Support\Facades\DB;
  6. use Tests\FeatureTestCase;
  7. /**
  8. * @covers \App\Http\Controllers\Auth\WebAuthnManageController
  9. * @covers \App\Http\Middleware\RejectIfReverseProxy
  10. * @covers \App\Models\Traits\WebAuthnManageCredentials
  11. */
  12. class WebAuthnManageControllerTest extends FeatureTestCase
  13. {
  14. // use WithoutMiddleware;
  15. /**
  16. * @var \App\Models\User
  17. */
  18. protected $user;
  19. public const CREDENTIAL_ID = '-VOLFKPY-_FuMI_sJ7gMllK76L3VoRUINj6lL_Z3qDg';
  20. public const CREDENTIAL_ID_RAW = '+VOLFKPY+/FuMI/sJ7gMllK76L3VoRUINj6lL/Z3qDg=';
  21. /**
  22. * @test
  23. */
  24. public function setUp(): void
  25. {
  26. parent::setUp();
  27. $this->user = User::factory()->create();
  28. }
  29. /**
  30. * @test
  31. */
  32. public function test_index_returns_success_with_credentials()
  33. {
  34. DB::table('webauthn_credentials')->insert([
  35. 'id' => self::CREDENTIAL_ID,
  36. 'authenticatable_type' => \App\Models\User::class,
  37. 'authenticatable_id' => $this->user->id,
  38. 'user_id' => 'e8af6f703f8042aa91c30cf72289aa07',
  39. 'counter' => 0,
  40. 'rp_id' => 'http://localhost',
  41. 'origin' => 'http://localhost',
  42. 'aaguid' => '00000000-0000-0000-0000-000000000000',
  43. 'attestation_format' => 'none',
  44. 'public_key' => 'eyJpdiI6Imp0U0NVeFNNbW45KzEvMXpad2p2SUE9PSIsInZhbHVlIjoic0VxZ2I1WnlHM2lJakhkWHVkK2kzMWtibk1IN2ZlaExGT01qOElXMDdRTjhnVlR0TDgwOHk1S0xQUy9BQ1JCWHRLNzRtenNsMml1dVQydWtERjFEU0h0bkJGT2RwUXE1M1JCcVpablE2Y2VGV2YvVEE2RGFIRUE5L0x1K0JIQXhLVE1aNVNmN3AxeHdjRUo2V0hwREZSRTJYaThNNnB1VnozMlVXZEVPajhBL3d3ODlkTVN3bW54RTEwSG0ybzRQZFFNNEFrVytUYThub2IvMFRtUlBZamoyZElWKzR1bStZQ1IwU3FXbkYvSm1FU2FlMTFXYUo0SG9kc1BDME9CNUNKeE9IelE5d2dmNFNJRXBKNUdlVzJ3VHUrQWJZRFluK0hib0xvVTdWQ0ZISjZmOWF3by83aVJES1dxbU9Zd1lhRTlLVmhZSUdlWmlBOUFtcTM2ZVBaRWNKNEFSQUhENk5EaC9hN3REdnVFbm16WkRxekRWOXd4cVcvZFdKa2tlWWJqZWlmZnZLS0F1VEVCZEZQcXJkTExiNWRyQmxsZWtaSDRlT3VVS0ZBSXFBRG1JMjRUMnBKRXZxOUFUa2xxMjg2TEplUzdscVo2UytoVU5SdXk1OE1lcFN6aU05ZkVXTkdIM2tKM3Q5bmx1TGtYb1F5bGxxQVR3K3BVUVlia1VybDFKRm9lZDViNzYraGJRdmtUb2FNTEVGZmZYZ3lYRDRiOUVjRnJpcTVvWVExOHJHSTJpMnVBZ3E0TmljbUlKUUtXY2lSWDh1dE5MVDNRUzVRSkQrTjVJUU8rSGhpeFhRRjJvSEdQYjBoVT0iLCJtYWMiOiI5MTdmNWRkZGE5OTEwNzQ3MjhkYWVhYjRlNjk0MWZlMmI5OTQ4YzlmZWI1M2I4OGVkMjE1MjMxNjUwOWRmZTU2IiwidGFnIjoiIn0=',
  45. 'updated_at' => now(),
  46. 'created_at' => now(),
  47. ]);
  48. $response = $this->actingAs($this->user, 'web-guard')
  49. ->json('GET', '/webauthn/credentials')
  50. ->assertStatus(200)
  51. ->assertJsonStructure([
  52. '*' => [
  53. 'id',
  54. 'alias',
  55. ],
  56. ]);
  57. }
  58. /**
  59. * @test
  60. */
  61. public function test_rename_returns_success_with_new_name()
  62. {
  63. DB::table('webauthn_credentials')->insert([
  64. 'id' => self::CREDENTIAL_ID,
  65. 'authenticatable_type' => \App\Models\User::class,
  66. 'authenticatable_id' => $this->user->id,
  67. 'user_id' => 'e8af6f703f8042aa91c30cf72289aa07',
  68. 'alias' => 'MyNewCredential',
  69. 'counter' => 0,
  70. 'rp_id' => 'http://localhost',
  71. 'origin' => 'http://localhost',
  72. 'aaguid' => '00000000-0000-0000-0000-000000000000',
  73. 'attestation_format' => 'none',
  74. 'public_key' => 'eyJpdiI6Imp0U0NVeFNNbW45KzEvMXpad2p2SUE9PSIsInZhbHVlIjoic0VxZ2I1WnlHM2lJakhkWHVkK2kzMWtibk1IN2ZlaExGT01qOElXMDdRTjhnVlR0TDgwOHk1S0xQUy9BQ1JCWHRLNzRtenNsMml1dVQydWtERjFEU0h0bkJGT2RwUXE1M1JCcVpablE2Y2VGV2YvVEE2RGFIRUE5L0x1K0JIQXhLVE1aNVNmN3AxeHdjRUo2V0hwREZSRTJYaThNNnB1VnozMlVXZEVPajhBL3d3ODlkTVN3bW54RTEwSG0ybzRQZFFNNEFrVytUYThub2IvMFRtUlBZamoyZElWKzR1bStZQ1IwU3FXbkYvSm1FU2FlMTFXYUo0SG9kc1BDME9CNUNKeE9IelE5d2dmNFNJRXBKNUdlVzJ3VHUrQWJZRFluK0hib0xvVTdWQ0ZISjZmOWF3by83aVJES1dxbU9Zd1lhRTlLVmhZSUdlWmlBOUFtcTM2ZVBaRWNKNEFSQUhENk5EaC9hN3REdnVFbm16WkRxekRWOXd4cVcvZFdKa2tlWWJqZWlmZnZLS0F1VEVCZEZQcXJkTExiNWRyQmxsZWtaSDRlT3VVS0ZBSXFBRG1JMjRUMnBKRXZxOUFUa2xxMjg2TEplUzdscVo2UytoVU5SdXk1OE1lcFN6aU05ZkVXTkdIM2tKM3Q5bmx1TGtYb1F5bGxxQVR3K3BVUVlia1VybDFKRm9lZDViNzYraGJRdmtUb2FNTEVGZmZYZ3lYRDRiOUVjRnJpcTVvWVExOHJHSTJpMnVBZ3E0TmljbUlKUUtXY2lSWDh1dE5MVDNRUzVRSkQrTjVJUU8rSGhpeFhRRjJvSEdQYjBoVT0iLCJtYWMiOiI5MTdmNWRkZGE5OTEwNzQ3MjhkYWVhYjRlNjk0MWZlMmI5OTQ4YzlmZWI1M2I4OGVkMjE1MjMxNjUwOWRmZTU2IiwidGFnIjoiIn0=',
  75. 'updated_at' => now(),
  76. 'created_at' => now(),
  77. ]);
  78. $response = $this->actingAs($this->user, 'web-guard')
  79. ->json('PATCH', '/webauthn/credentials/' . self::CREDENTIAL_ID . '/name', [
  80. 'name' => 'MyNewCredential',
  81. ])
  82. ->assertStatus(200)
  83. ->assertExactJson([
  84. 'name' => 'MyNewCredential',
  85. ]);
  86. }
  87. /**
  88. * @test
  89. */
  90. public function test_rename_invalid_data_returns_validation_error()
  91. {
  92. $response = $this->actingAs($this->user, 'web-guard')
  93. ->json('PATCH', '/webauthn/credentials/' . self::CREDENTIAL_ID . '/name', [
  94. 'name' => null,
  95. ])
  96. ->assertStatus(422);
  97. }
  98. /**
  99. * @test
  100. */
  101. public function test_rename_missing_credential_returns_not_found()
  102. {
  103. $response = $this->actingAs($this->user, 'web-guard')
  104. ->json('PATCH', '/webauthn/credentials/unknown/name', [
  105. 'name' => 'MyNewCredential',
  106. ])
  107. ->assertNotFound()
  108. ->assertJsonStructure([
  109. 'message',
  110. ]);
  111. }
  112. /**
  113. * @test
  114. */
  115. public function test_index_as_reverse_proxy_returns_error()
  116. {
  117. $response = $this->actingAs($this->user, 'reverse-proxy-guard')
  118. ->json('GET', '/webauthn/credentials')
  119. ->assertStatus(400);
  120. }
  121. /**
  122. * @test
  123. */
  124. public function test_rename_as_reverse_proxy_returns_error()
  125. {
  126. $response = $this->actingAs($this->user, 'reverse-proxy-guard')
  127. ->json('PATCH', '/webauthn/credentials/fqsdfqsdf/name')
  128. ->assertStatus(400);
  129. }
  130. /**
  131. * @test
  132. */
  133. public function test_delete_as_reverse_proxy_returns_error()
  134. {
  135. $response = $this->actingAs($this->user, 'reverse-proxy-guard')
  136. ->json('DELETE', '/webauthn/credentials/dcnskldjnkljsrn')
  137. ->assertStatus(400);
  138. }
  139. /**
  140. * @test
  141. */
  142. public function test_delete_returns_no_content()
  143. {
  144. $response = $this->actingAs($this->user, 'web-guard')
  145. ->json('DELETE', '/webauthn/credentials/sdCKktnsdK')
  146. ->assertNoContent();
  147. }
  148. }