Skip to content

Commit 2162e04

Browse files
[6.x] Fix creating passkeys (#13566)
1 parent a3a1b39 commit 2162e04

File tree

10 files changed

+38
-38
lines changed

10 files changed

+38
-38
lines changed

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
"symfony/yaml": "^7.0.3",
3939
"ueberdosis/tiptap-php": "^2.0",
4040
"voku/portable-ascii": "^2.0.2",
41-
"web-auth/webauthn-lib": "^5.2",
41+
"web-auth/webauthn-lib": "^5.3@dev",
4242
"wilderborn/partyline": "^1.0"
4343
},
4444
"require-dev": {

src/Auth/WebAuthn/Passkey.php

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@
77
use Statamic\Contracts\Auth\Passkey as Contract;
88
use Statamic\Contracts\Auth\User as UserContract;
99
use Statamic\Facades\User;
10-
use Webauthn\PublicKeyCredentialSource;
10+
use Webauthn\CredentialRecord;
1111

1212
abstract class Passkey implements Contract
1313
{
1414
private string $name;
1515
private string $user;
16-
private PublicKeyCredentialSource $credential;
16+
private CredentialRecord $credential;
1717
private ?Carbon $lastLogin = null;
1818

1919
public function id(): string
@@ -45,14 +45,14 @@ public function user(): ?UserContract
4545
return User::find($this->user);
4646
}
4747

48-
public function credential(): PublicKeyCredentialSource
48+
public function credential(): CredentialRecord
4949
{
5050
return $this->credential;
5151
}
5252

53-
public function setCredential(array|PublicKeyCredentialSource $credential): Contract
53+
public function setCredential(array|CredentialRecord $credential): Contract
5454
{
55-
$this->credential = $credential instanceof PublicKeyCredentialSource
55+
$this->credential = $credential instanceof CredentialRecord
5656
? $credential
5757
: $this->credentialFromArray($credential);
5858

@@ -95,15 +95,15 @@ public function __unserialize(array $data): void
9595
$this->lastLogin = $data['last_login'] ? Carbon::createFromTimestamp($data['last_login']) : null;
9696
}
9797

98-
private function credentialToArray(PublicKeyCredentialSource $credential): array
98+
private function credentialToArray(CredentialRecord $credential): array
9999
{
100100
$json = app(Serializer::class)->serialize($credential, 'json');
101101

102102
return json_decode($json, true);
103103
}
104104

105-
private function credentialFromArray(array $array): PublicKeyCredentialSource
105+
private function credentialFromArray(array $array): CredentialRecord
106106
{
107-
return app(Serializer::class)->deserialize(json_encode($array), PublicKeyCredentialSource::class, 'json');
107+
return app(Serializer::class)->deserialize(json_encode($array), CredentialRecord::class, 'json');
108108
}
109109
}

src/Auth/WebAuthn/WebAuthn.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public function validateAssertion(User $user, array $credentials): bool
4444

4545
$options = $this->getRequestOptions(session()->pull('webauthn.challenge'));
4646

47-
$publicKeyCredentialSource = $this->assertionResponseValidator->check(
47+
$credentialRecord = $this->assertionResponseValidator->check(
4848
$passkey->credential(),
4949
$publicKeyCredential->response,
5050
$options,
@@ -53,7 +53,7 @@ public function validateAssertion(User $user, array $credentials): bool
5353
);
5454

5555
$passkey
56-
->setCredential($publicKeyCredentialSource)
56+
->setCredential($credentialRecord)
5757
->setLastLogin(now())
5858
->save();
5959

@@ -94,7 +94,7 @@ public function validateAttestation(User $user, array $credentials, string $name
9494

9595
$options = $this->getCreationOptions($user, session()->pull('webauthn.challenge'));
9696

97-
$publicKeyCredentialSource = $this->attestationResponseValidator->check(
97+
$credentialRecord = $this->attestationResponseValidator->check(
9898
$publicKeyCredential->response,
9999
$options,
100100
request()->getHost()
@@ -103,7 +103,7 @@ public function validateAttestation(User $user, array $credentials, string $name
103103
$passkey = app(Passkey::class)
104104
->setUser($user)
105105
->setName($name)
106-
->setCredential($publicKeyCredentialSource);
106+
->setCredential($credentialRecord);
107107

108108
$passkey->save();
109109

src/Contracts/Auth/Passkey.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
namespace Statamic\Contracts\Auth;
44

55
use Carbon\Carbon;
6-
use Webauthn\PublicKeyCredentialSource;
6+
use Webauthn\CredentialRecord;
77

88
interface Passkey
99
{
@@ -17,9 +17,9 @@ public function user(): ?User;
1717

1818
public function setUser(string|User $user): self;
1919

20-
public function credential(): PublicKeyCredentialSource;
20+
public function credential(): CredentialRecord;
2121

22-
public function setCredential(array|PublicKeyCredentialSource $credential): self;
22+
public function setCredential(array|CredentialRecord $credential): self;
2323

2424
public function lastLogin(): ?Carbon;
2525

tests/Auth/Eloquent/EloquentUserTest.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
use Tests\Auth\UserContractTests;
2424
use Tests\Preferences\HasPreferencesTests;
2525
use Tests\TestCase;
26-
use Webauthn\PublicKeyCredentialSource;
26+
use Webauthn\CredentialRecord;
2727

2828
#[Group('2fa')]
2929
class EloquentUserTest extends TestCase
@@ -342,11 +342,11 @@ public function it_gets_passkeys()
342342
$user = $this->user();
343343
$this->assertCount(0, $user->passkeys());
344344

345-
$mockCredentialA = \Mockery::mock(PublicKeyCredentialSource::class);
345+
$mockCredentialA = \Mockery::mock(CredentialRecord::class);
346346
$mockCredentialA->publicKeyCredentialId = 'key-a';
347-
$mockCredentialB = \Mockery::mock(PublicKeyCredentialSource::class);
347+
$mockCredentialB = \Mockery::mock(CredentialRecord::class);
348348
$mockCredentialB->publicKeyCredentialId = 'key-b';
349-
$mockCredentialC = \Mockery::mock(PublicKeyCredentialSource::class);
349+
$mockCredentialC = \Mockery::mock(CredentialRecord::class);
350350
$mockCredentialC->publicKeyCredentialId = 'key-c';
351351

352352
app()->instance(Serializer::class, new class($mockCredentialA, $mockCredentialB, $mockCredentialC)

tests/Auth/FileUserTest.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
use Statamic\Support\Arr;
1818
use Tests\PreventSavingStacheItemsToDisk;
1919
use Tests\TestCase;
20-
use Webauthn\PublicKeyCredentialSource;
20+
use Webauthn\CredentialRecord;
2121

2222
#[Group('user')]
2323
#[Group('2fa')]
@@ -198,9 +198,9 @@ public function it_gets_passkeys()
198198
$user = $this->user();
199199
$this->assertCount(0, $user->passkeys());
200200

201-
$mockCredentialA = \Mockery::mock(PublicKeyCredentialSource::class);
201+
$mockCredentialA = \Mockery::mock(CredentialRecord::class);
202202
$mockCredentialA->publicKeyCredentialId = 'key-a';
203-
$mockCredentialB = \Mockery::mock(PublicKeyCredentialSource::class);
203+
$mockCredentialB = \Mockery::mock(CredentialRecord::class);
204204
$mockCredentialB->publicKeyCredentialId = 'key-b';
205205

206206
$user->setPasskeys(collect([

tests/Auth/WebAuthn/EloquentPasskeyTest.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
use Statamic\Facades\User;
1414
use Symfony\Component\Uid\Uuid;
1515
use Tests\TestCase;
16-
use Webauthn\PublicKeyCredentialSource;
16+
use Webauthn\CredentialRecord;
1717
use Webauthn\TrustPath\EmptyTrustPath;
1818

1919
#[Group('passkeys')]
@@ -66,9 +66,9 @@ public static function tearDownAfterClass(): void
6666
parent::tearDownAfterClass();
6767
}
6868

69-
private function createTestCredential(string $id = 'test-credential-id-123'): PublicKeyCredentialSource
69+
private function createTestCredential(string $id = 'test-credential-id-123'): CredentialRecord
7070
{
71-
return PublicKeyCredentialSource::create(
71+
return CredentialRecord::create(
7272
publicKeyCredentialId: $id,
7373
type: 'public-key',
7474
transports: ['usb', 'nfc'],

tests/Auth/WebAuthn/FilePasskeyTest.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,17 @@
1010
use Symfony\Component\Uid\Uuid;
1111
use Tests\PreventSavingStacheItemsToDisk;
1212
use Tests\TestCase;
13-
use Webauthn\PublicKeyCredentialSource;
13+
use Webauthn\CredentialRecord;
1414
use Webauthn\TrustPath\EmptyTrustPath;
1515

1616
#[Group('passkeys')]
1717
class FilePasskeyTest extends TestCase
1818
{
1919
use PreventSavingStacheItemsToDisk;
2020

21-
private function createTestCredential(string $id = 'test-credential-id-123'): PublicKeyCredentialSource
21+
private function createTestCredential(string $id = 'test-credential-id-123'): CredentialRecord
2222
{
23-
return PublicKeyCredentialSource::create(
23+
return CredentialRecord::create(
2424
publicKeyCredentialId: $id,
2525
type: 'public-key',
2626
transports: ['usb', 'nfc'],

tests/Auth/WebAuthn/PasskeyTest.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,17 @@
1111
use Symfony\Component\Uid\Uuid;
1212
use Tests\PreventSavingStacheItemsToDisk;
1313
use Tests\TestCase;
14-
use Webauthn\PublicKeyCredentialSource;
14+
use Webauthn\CredentialRecord;
1515
use Webauthn\TrustPath\EmptyTrustPath;
1616

1717
#[Group('passkeys')]
1818
class PasskeyTest extends TestCase
1919
{
2020
use PreventSavingStacheItemsToDisk;
2121

22-
private function createTestCredential(): PublicKeyCredentialSource
22+
private function createTestCredential(): CredentialRecord
2323
{
24-
return PublicKeyCredentialSource::create(
24+
return CredentialRecord::create(
2525
publicKeyCredentialId: 'test-credential-id-123',
2626
type: 'public-key',
2727
transports: ['usb', 'nfc'],
@@ -45,7 +45,7 @@ public function it_gets_credential()
4545
->setUser($user)
4646
->setCredential($credential);
4747

48-
$this->assertInstanceOf(PublicKeyCredentialSource::class, $passkey->credential());
48+
$this->assertInstanceOf(CredentialRecord::class, $passkey->credential());
4949
$this->assertEquals('test-credential-id-123', $passkey->credential()->publicKeyCredentialId);
5050
$this->assertEquals('public-key', $passkey->credential()->type);
5151
}
@@ -183,7 +183,7 @@ public function it_unserializes()
183183
$this->assertInstanceOf(Passkey::class, $unserialized);
184184
$this->assertEquals('My Passkey', $unserialized->name());
185185
$this->assertEquals('test-user', $unserialized->user()->id());
186-
$this->assertInstanceOf(PublicKeyCredentialSource::class, $unserialized->credential());
186+
$this->assertInstanceOf(CredentialRecord::class, $unserialized->credential());
187187
$this->assertEquals('test-credential-id-123', $unserialized->credential()->publicKeyCredentialId);
188188
$this->assertEquals('2024-01-15 10:30:00', $unserialized->lastLogin()->format('Y-m-d H:i:s'));
189189
}

tests/Auth/WebAuthn/WebAuthnTest.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@
1515
use Webauthn\AuthenticatorAttestationResponseValidator;
1616
use Webauthn\AuthenticatorData;
1717
use Webauthn\CollectedClientData;
18+
use Webauthn\CredentialRecord;
1819
use Webauthn\PublicKeyCredential;
1920
use Webauthn\PublicKeyCredentialRequestOptions;
2021
use Webauthn\PublicKeyCredentialRpEntity;
21-
use Webauthn\PublicKeyCredentialSource;
2222

2323
#[Group('passkeys')]
2424
class WebAuthnTest extends TestCase
@@ -195,7 +195,7 @@ public function it_validates_assertion_successfully()
195195
);
196196

197197
// Mock the passkey
198-
$mockPasskeyCredential = Mockery::mock(PublicKeyCredentialSource::class);
198+
$mockPasskeyCredential = Mockery::mock(CredentialRecord::class);
199199
$mockPasskeyCredential->publicKeyCredentialId = 'test-raw-id';
200200

201201
$mockPasskey = Mockery::mock(Passkey::class);
@@ -209,7 +209,7 @@ public function it_validates_assertion_successfully()
209209
$mockUser->shouldReceive('id')->andReturn('test-user');
210210
$mockUser->shouldReceive('passkeys->first')->andReturn($mockPasskey);
211211

212-
$updatedCredentialSource = Mockery::mock(PublicKeyCredentialSource::class);
212+
$updatedCredentialRecord = Mockery::mock(CredentialRecord::class);
213213

214214
$this->mockSerializer
215215
->shouldReceive('deserialize')
@@ -219,7 +219,7 @@ public function it_validates_assertion_successfully()
219219
$this->mockAssertionValidator
220220
->shouldReceive('check')
221221
->once()
222-
->andReturn($updatedCredentialSource);
222+
->andReturn($updatedCredentialRecord);
223223

224224
$result = $this->webauthn->validateAssertion($mockUser, $credentials);
225225

0 commit comments

Comments
 (0)