PHP code example of chuoke / laravel-user-identities
1. Go to this page and download the library: Download chuoke/laravel-user-identities library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
chuoke / laravel-user-identities example snippets
use Chuoke\UserIdentities\Auth\User as IdentityUser;
class User extends IdentityUser
{
// All traits are pre-configured with proper method resolution
}
use Chuoke\UserIdentities\Concerns\HasIdentities;
use Chuoke\UserIdentities\Concerns\HasIdentityAuth;
class User extends Authenticatable
{
use HasIdentities, HasIdentityAuth;
// HasIdentityAuth overrides getAuthPassword(), getRememberToken(), etc.
// to read/write from the identities table instead of user columns.
}
use Chuoke\UserIdentities\Fortify\Actions\ConfirmPassword;
use Laravel\Fortify\Fortify;
Fortify::confirmPasswordsUsing(app(ConfirmPassword::class));
use App\Models\User;
use Chuoke\UserIdentities\Actions\UserIdentityCreate;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rules\Password;
use Illuminate\Support\Facades\DB;
use Laravel\Fortify\Contracts\CreatesNewUsers;
class CreateNewUser implements CreatesNewUsers
{
public function create(array $input): User
{
Validator::make($input, [
'name' => ['username' => $input['username'],
]);
app(UserIdentityCreate::class)->execute(
$user,
type: 'email',
identifier: $input['email'],
credentials: $input['password'],
verified: false, //
// app/Models/User.php
use Chuoke\UserIdentities\Auth\MustVerifyEmail;
use Illuminate\Contracts\Auth\MustVerifyEmail as MustVerifyEmailContract;
class User extends Authenticatable implements MustVerifyEmailContract
{
use HasIdentities, HasIdentityAuth, MustVerifyEmail;
}
// In your email verification handler
use Chuoke\UserIdentities\Actions\UserIdentityVerify;
use Chuoke\UserIdentities\Actions\UserIdentityFindByAuthenticatable;
$identity = (new UserIdentityFindByAuthenticatable())->execute($user, 'email');
if ($identity) {
(new UserIdentityVerify())->execute($identity);
// Fires IdentityVerified event — hook in listeners as needed
}
use Chuoke\UserIdentities\Actions\UserIdentityPasswordUpdate;
use Chuoke\UserIdentities\Rules\CurrentPassword;
use Illuminate\Validation\Rules\Password;
Validator::make($input, [
'current_password' => ['
// app/Models/User.php
use Chuoke\UserIdentities\Auth\CanResetPassword;
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;
class User extends Authenticatable implements CanResetPasswordContract
{
use HasIdentities, HasIdentityAuth, MustVerifyEmail, CanResetPassword;
// CanResetPassword::getEmailForPasswordReset() delegates to MustVerifyEmail
}
use Chuoke\UserIdentities\Actions\UserIdentityPasswordUpdate;
use Illuminate\Validation\Rules\Password;
Validator::make($input, [
'password' => ['
use Chuoke\UserIdentities\Actions\UserIdentityFindByAuthenticatable;
use Chuoke\UserIdentities\Actions\UserIdentityUpdate;
use Chuoke\UserIdentities\Dtos\UserIdentityUpdateData;
$identity = (new UserIdentityFindByAuthenticatable())->execute($user, 'email');
if ($identity && $identity->identifier !== $input['email']) {
(new UserIdentityUpdate())->execute(
$identity,
UserIdentityUpdateData::forIdentifier($input['email'], false),
);
}
// app/Models/User.php
use Chuoke\UserIdentities\Concerns\HasTwoFactorIdentity;
use Laravel\Fortify\TwoFactorAuthenticatable;
class User extends Authenticatable
{
use HasIdentities, HasIdentityAuth, HasTwoFactorIdentity, TwoFactorAuthenticatable;
}
use Chuoke\UserIdentities\Fortify\Actions\ConfirmTwoFactorAuthentication as IdentityConfirmTwoFactorAuthentication;
use Chuoke\UserIdentities\Fortify\Actions\DisableTwoFactorAuthentication as IdentityDisableTwoFactorAuthentication;
use Chuoke\UserIdentities\Fortify\Actions\EnableTwoFactorAuthentication as IdentityEnableTwoFactorAuthentication;
use Chuoke\UserIdentities\Fortify\Actions\GenerateNewRecoveryCodes as IdentityGenerateNewRecoveryCodes;
use Laravel\Fortify\Actions\ConfirmTwoFactorAuthentication as FortifyConfirmTwoFactorAuthentication;
use Laravel\Fortify\Actions\DisableTwoFactorAuthentication as FortifyDisableTwoFactorAuthentication;
use Laravel\Fortify\Actions\EnableTwoFactorAuthentication as FortifyEnableTwoFactorAuthentication;
use Laravel\Fortify\Actions\GenerateNewRecoveryCodes as FortifyGenerateNewRecoveryCodes;
public function register(): void
{
$this->app->bind(FortifyEnableTwoFactorAuthentication::class, IdentityEnableTwoFactorAuthentication::class);
$this->app->bind(FortifyConfirmTwoFactorAuthentication::class, IdentityConfirmTwoFactorAuthentication::class);
$this->app->bind(FortifyDisableTwoFactorAuthentication::class, IdentityDisableTwoFactorAuthentication::class);
$this->app->bind(FortifyGenerateNewRecoveryCodes::class, IdentityGenerateNewRecoveryCodes::class);
}
use Chuoke\UserIdentities\Fortify\Actions\ConfirmTwoFactorAuthentication as IdentityConfirmTwoFactorAuthentication;
use Chuoke\UserIdentities\Fortify\Actions\DisableTwoFactorAuthentication as IdentityDisableTwoFactorAuthentication;
use Chuoke\UserIdentities\Fortify\Actions\EnableTwoFactorAuthentication as IdentityEnableTwoFactorAuthentication;
use Chuoke\UserIdentities\Fortify\Actions\GenerateNewRecoveryCodes as IdentityGenerateNewRecoveryCodes;
use Laravel\Fortify\Actions\ConfirmTwoFactorAuthentication as FortifyConfirmTwoFactorAuthentication;
use Laravel\Fortify\Actions\DisableTwoFactorAuthentication as FortifyDisableTwoFactorAuthentication;
use Laravel\Fortify\Actions\EnableTwoFactorAuthentication as FortifyEnableTwoFactorAuthentication;
use Laravel\Fortify\Actions\GenerateNewRecoveryCodes as FortifyGenerateNewRecoveryCodes;
public function register(): void
{
$this->app->bind(FortifyEnableTwoFactorAuthentication::class, IdentityEnableTwoFactorAuthentication::class);
$this->app->bind(FortifyConfirmTwoFactorAuthentication::class, IdentityConfirmTwoFactorAuthentication::class);
$this->app->bind(FortifyDisableTwoFactorAuthentication::class, IdentityDisableTwoFactorAuthentication::class);
$this->app->bind(FortifyGenerateNewRecoveryCodes::class, IdentityGenerateNewRecoveryCodes::class);
}
// app/Providers/FortifyServiceProvider.php
use Chuoke\UserIdentities\Fortify\Actions\ConfirmPassword;
use Laravel\Fortify\Fortify;
public function boot(): void
{
Fortify::confirmPasswordsUsing(app(ConfirmPassword::class));
}
use Chuoke\UserIdentities\Actions\UserIdentityFindOrCreateFromSocialite;
use Chuoke\UserIdentities\Actions\UserIdentitySocialiteBind;
use Chuoke\UserIdentities\Actions\AuthenticatableFindByIdentity;
// In your Socialite callback controller
public function handleCallback(string $provider)
{
$socialiteUser = Socialite::driver($provider)->user();
// Option 1: Find existing user or create new one
$action = new UserIdentityFindOrCreateFromSocialite();
[$user, $identity, $wasCreated] = $action->execute(
$provider,
$socialiteUser,
fn ($su) => User::create(['name' => $su->getName()])
);
Auth::login($user);
// Option 2: Bind to current authenticated user
$identity = (new UserIdentitySocialiteBind())->execute(Auth::user(), $provider, $socialiteUser);
// Option 3: Just look up existing user
$user = (new AuthenticatableFindByIdentity())->execute($provider, $socialiteUser->getId());
}
Schema::table('user_identities', function (Blueprint $table) {
$table->string('global_identifier', 231)
->nullable()
->storedAs(<<<'SQL'
case
when `type` in ('email', 'username', 'mobile', 'google', 'github')
then concat(`type`, ':', `identifier`)
else null
end
SQL);
$table->unique(
['authenticatable_type', 'global_identifier'],
'user_identities_global_unique',
);
});
Schema::table('users', function (Blueprint $table) {
$table->dropColumn(['password', 'remember_token']);
// Keep 'email' if you want it for display/search (see Hybrid Mode below)
});
// app/Models/User.php
use Chuoke\UserIdentities\Concerns\HasIdentities;
use Chuoke\UserIdentities\Concerns\HasIdentityAuth;
use Chuoke\UserIdentities\Concerns\SyncsIdentityFields;
class User extends Authenticatable
{
use HasIdentities, HasIdentityAuth, SyncsIdentityFields;
}
// config/user-identities.php
return [
// Custom table name
'table' => env('USER_IDENTITIES_TABLE', 'user_identities'),
// Register identity types
'types' => [
'email' => EmailIdentityType::class,
// ...
],
// Require verification before login
'' => 'username',
],
// Fallback to user model columns when identity not found (migration support)
'fallback_to_user_model' => env('USER_IDENTITIES_FALLBACK', false),
// Sync identity identifiers back to user model columns
'sync_to_user' => [
// 'email' => 'email',
],
];