diff --git a/src/Contracts/AuthenticatableInterface.php b/src/Contracts/AuthenticatableInterface.php index edb1069..6b24c19 100644 --- a/src/Contracts/AuthenticatableInterface.php +++ b/src/Contracts/AuthenticatableInterface.php @@ -4,6 +4,7 @@ use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\Relations\HasMany; use LaravelAuthPro\Contracts\Base\HasBuilderInterface; use LaravelAuthPro\Enums\AuthIdentifierType; @@ -37,4 +38,6 @@ public function getId(): string; * @return array */ public static function getIdentifierMapper(): array; + + public function authProviders(): HasMany; } diff --git a/src/Contracts/Credentials/GoogleCredentialInterface.php b/src/Contracts/Credentials/OAuthCredentialInterface.php similarity index 63% rename from src/Contracts/Credentials/GoogleCredentialInterface.php rename to src/Contracts/Credentials/OAuthCredentialInterface.php index a1d100e..eb72463 100644 --- a/src/Contracts/Credentials/GoogleCredentialInterface.php +++ b/src/Contracts/Credentials/OAuthCredentialInterface.php @@ -5,7 +5,9 @@ use LaravelAuthPro\Contracts\AuthCredentialInterface; use LaravelAuthPro\Contracts\Credentials\Base\HasEmailInterface; -interface GoogleCredentialInterface extends AuthCredentialInterface, HasEmailInterface +interface OAuthCredentialInterface extends AuthCredentialInterface, HasEmailInterface { public function getIdToken(): string; + + public function getDriver(): string; } diff --git a/src/Contracts/Providers/GoogleProviderInterface.php b/src/Contracts/Providers/OAuthProviderInterface.php similarity index 50% rename from src/Contracts/Providers/GoogleProviderInterface.php rename to src/Contracts/Providers/OAuthProviderInterface.php index 4e79e68..6efe236 100644 --- a/src/Contracts/Providers/GoogleProviderInterface.php +++ b/src/Contracts/Providers/OAuthProviderInterface.php @@ -5,7 +5,7 @@ use LaravelAuthPro\Contracts\AuthenticatableInterface; use LaravelAuthPro\Contracts\AuthProviderInterface; -interface GoogleProviderInterface extends AuthProviderInterface +interface OAuthProviderInterface extends AuthProviderInterface { - public function createUserWithGoogleIdToken(string $idToken): AuthenticatableInterface; + public function createUserWithIdToken(string $driver, string $idToken): AuthenticatableInterface; } diff --git a/src/Credentials/OAuthCredential.php b/src/Credentials/OAuthCredential.php new file mode 100644 index 0000000..433ba45 --- /dev/null +++ b/src/Credentials/OAuthCredential.php @@ -0,0 +1,33 @@ +email; + } + + public function getIdToken(): string + { + return $this->idToken; + } + + public function getDriver(): string + { + return $this->driver; + } +} diff --git a/src/Model/UserAuthProvider.php b/src/Model/UserAuthProvider.php new file mode 100644 index 0000000..172cabd --- /dev/null +++ b/src/Model/UserAuthProvider.php @@ -0,0 +1,12 @@ + 'json' + ]; +} diff --git a/src/Providers/GoogleProvider.php b/src/Providers/GoogleProvider.php deleted file mode 100644 index 2e4f2c1..0000000 --- a/src/Providers/GoogleProvider.php +++ /dev/null @@ -1,26 +0,0 @@ -userFromToken($idToken); + + $authenticatable = $this->createAuthenticatable($user->getEmail()); + + $authenticatable->authProviders() + ->create([ + 'provider_type' => static::TYPE, + 'provider_id' => static::ID . '.' . $driver, + 'payload' => [ + 'id' => $user->getId(), + 'extra' => $user->getRaw() + ] + ]); + + return $authenticatable; + } +} diff --git a/src/SignInMethods/OAuthSignInMethod.php b/src/SignInMethods/OAuthSignInMethod.php index c2cf045..861264b 100644 --- a/src/SignInMethods/OAuthSignInMethod.php +++ b/src/SignInMethods/OAuthSignInMethod.php @@ -3,30 +3,26 @@ namespace LaravelAuthPro\SignInMethods; use Laravel\Socialite\Facades\Socialite; -use Laravel\Socialite\Two\GoogleProvider; use LaravelAuthPro\Contracts\AuthCredentialInterface; use LaravelAuthPro\Contracts\AuthenticatableInterface; use LaravelAuthPro\Contracts\AuthSignInMethodInterface; -use LaravelAuthPro\Contracts\Credentials\GoogleCredentialInterface; +use LaravelAuthPro\Contracts\Credentials\OAuthCredentialInterface; use LaravelAuthPro\Contracts\Exceptions\AuthException; class OAuthSignInMethod implements AuthSignInMethodInterface { /** * @param AuthenticatableInterface $user - * @param GoogleCredentialInterface $credential + * @param OAuthCredentialInterface|AuthCredentialInterface $credential * @return AuthenticatableInterface * @throws AuthException */ - public function __invoke(AuthenticatableInterface $user, GoogleCredentialInterface|AuthCredentialInterface $credential): AuthenticatableInterface + public function __invoke(AuthenticatableInterface $user, OAuthCredentialInterface|AuthCredentialInterface $credential): AuthenticatableInterface { try { - /** - * @var GoogleProvider $socialite - */ - $socialite = Socialite::driver($credential->getProviderId()); + $oauthUser = Socialite::driver($credential->getDriver())->userFromToken($credential->getIdToken()); - $oauthUser = $socialite->userFromToken($credential->getIdToken()); + dump($user, $oauthUser); throw new \Exception('not implemented'); } catch (\Exception $e) { diff --git a/src/Traits/AuthProAuthenticatable.php b/src/Traits/AuthProAuthenticatable.php index db28320..5261cb8 100644 --- a/src/Traits/AuthProAuthenticatable.php +++ b/src/Traits/AuthProAuthenticatable.php @@ -4,10 +4,12 @@ use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\Relations\HasMany; use LaravelAuthPro\Contracts\AuthenticatableInterface; use LaravelAuthPro\Contracts\AuthIdentifierInterface; use LaravelAuthPro\Enums\AuthIdentifierType; use LaravelAuthPro\Model\Builder\AuthenticatableBuilder; +use LaravelAuthPro\Model\UserAuthProvider; /** * @mixin AuthenticatableInterface @@ -49,4 +51,9 @@ public function getIdentifierMapper(): array 'mobile' => AuthIdentifierType::MOBILE, ]; } + + public function authProviders(): HasMany + { + return $this->hasMany(UserAuthProvider::class, 'user_id'); + } } diff --git a/src/Traits/AuthProviderTrait.php b/src/Traits/AuthProviderTrait.php deleted file mode 100644 index e222cfb..0000000 --- a/src/Traits/AuthProviderTrait.php +++ /dev/null @@ -1,44 +0,0 @@ -provider_id; - } - - /** - * @inheritDoc - */ - public function getProviderPayload(): array - { - return $this->payload; - } - - /** - * @inheritDoc - */ - public function setProviderPayload(array $payload): void - { - $this->payload = $payload; - } - - public function getVerifiedAt(): ?CarbonImmutable - { - return $this->verified_at; - } - - public function setVerifiedAt(CarbonInterface $datetime): void - { - $this->verified_at = $datetime->toImmutable(); - } -}