PHPackages                             officialozioma/otp-generator - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. officialozioma/otp-generator

ActiveLibrary

officialozioma/otp-generator
============================

Laravel OTP generator and validation

v1.0.0(4y ago)241MITPHPPHP ^5.5.9|^7.0|^8.0

Since Apr 2Pushed 4y ago1 watchersCompare

[ Source](https://github.com/OfficialOzioma/otp-generator)[ Packagist](https://packagist.org/packages/officialozioma/otp-generator)[ Docs](https://github.com/officialOzioma/OTP-generator)[ RSS](/packages/officialozioma-otp-generator/feed)WikiDiscussions master Synced 1mo ago

READMEChangelog (1)Dependencies (1)Versions (2)Used By (0)

OTP Generator
=============

[](#otp-generator)

Introduction
------------

[](#introduction)

This is Laravel package for generation One Time Password (OTP) generator and validation. This is done on the cache it supported all the laravel cache drivers: "apc", "array", "database", "file", "memcached", "redis"

Installation
------------

[](#installation)

### Install via composer

[](#install-via-composer)

```
composer require officalozioma/otp-generator
```

Add Service Provider &amp; Facade
---------------------------------

[](#add-service-provider--facade)

**For Laravel 5.5+**

Once the package is added, the service provider and facade will be auto discovered.

**For Laravel 5.2 / 5.3 / 5.4**

Add the ServiceProvider to the providers array in `config/app.php`:

```
Ozioma\Otp\OtpServiceProvider::class
```

Add the Facade to the aliases array in `config/app.php`:

```
'Otp' => Ozioma\Otp\OtpFacade::class
```

Configuration
-------------

[](#configuration)

Publish config and language file

```
php artisan vendor:publish --provider="Ozioma\Otp\OtpServiceProvider"
```

This package publishes an `otp.php` file inside your applications's config folder which contains the settings for this package. Most of the variables are bound to environment variables, you may add Key-Value pair to the `.env` file in the Laravel application.

```
OTP_FORMAT=numeric
OTP_LENGTH=6
OTP_SENSITIVE=false
OTP_EXPIRES_TIME=15
OTP_ATTEMPT_TIMES=5
OTP_REPEATED=true
OTP_DEMO=false

```

Usage
-----

[](#usage)

### Generate OTP

[](#generate-otp)

```
Otp::generate(string $identifier)
```

- `$identifier`: The identity that will be tied to the OTP.

#### Sample

[](#sample)

```
use OTP;

// in controller

$password = Otp::generate('name@domain.com');
```

This will generate a OTP that will be valid for 15 minutes.

### Validate OTP

[](#validate-otp)

```
Otp::validate(string $identifier, string $password)
```

- `$identifier`: The identity that is tied to the OTP.
- `$password`: The password tied to the identity.

#### Sample

[](#sample-1)

```
use OTP;

// in controller

$result = Otp::validate('name@domain.com', '123456');
```

#### Responses

[](#responses)

**On Success**

```
{
  "status": true
}

```

**Invalid OTP**

```
{
  "status": false,
  "error": "invalid"
}

```

**Expired**

```
{
  "status": false,
  "error": "expired"
}

```

**Max attempt**

```
{
  "status": false,
  "error": "max_attempt"
}

```

- Reached the maximum allowed attempts, default 10 times with each identifier

### Validate OTP by Laravel Validation

[](#validate-otp-by-laravel-validation)

```
// in a `FormRequest`

use Ozioma\Otp\Rules\OtpValidate;

public function rules()
{
    return [
        'code' => ['required', new OtpValidate('change-email:name@domain.com')]
    ];
}

// in a controller

$request->validate([
    'code' => ['required', new OtpValidate('change-email:name@domain.com')]
]);
```

### Validate OTP by session id

[](#validate-otp-by-session-id)

```
// Otp class

$result = Otp::validate('123456');

// in a `FormRequest`

use Ozioma\Otp\Rules\OtpValidate;

public function rules()
{
    return [
        'code' => ['required', new OtpValidate()]
    ];
}

// in a controller

$request->validate([
    'code' => ['required', new OtpValidate()]
]);
```

- The setting without identifier will automatically use the session ID as the default, and the OTP generation and verification will be completed in same session (browser's cookies).

Advanced Usage
--------------

[](#advanced-usage)

### Generate OTP with options

[](#generate-otp-with-options)

```
$password = Otp::setLength(8)->setFormat('string')->setExpires(60)->setRepeated(false)->generate('identifier-key-here');

// or array option

$password = Otp::generate('identifier-key-here', [
    'length' => 8,
    'format' => 'string',
    'expires' => 60,
    'repeated' => false
]);
```

- `setLength($length)`: The length of the password. Default: 6
- `setFormat($format)`: The format option allows you to decide which generator implementation to be used when generating new passwords. Options: 'string','numeric','numeric-no-zero','customize'. Default: "numeric"
- `setExpires($minutes)`: The expiry time of the password in minutes. Default: 15
- `setRepeated($boolean)`: The repeated of the password. The previous password is valid when new password generated until either one password used or itself expired. Default: true

### Generate OTP with customize password

[](#generate-otp-with-customize-password)

```
$password = Otp::setCustomize('12345678ABC@#$')->generate('identifier-key-here');
```

- `setCustomize($string)`: Random letter from the customize string

### Validate OTP with specific attempt times

[](#validate-otp-with-specific-attempt-times)

```
$password = Otp::setAttempts(3)->validate('identifier-key-here', 'password-here');
```

- `setAttempts($times)`: The number of incorrect password attempts. Default: 5

### Validate OTP with case sensitive

[](#validate-otp-with-case-sensitive)

```
$password = Otp::setSensitive(true)->generate('identifier-key-here');

// validate

$result = Otp::setSensitive(true)->validate('identifier-key-here', 'password-here');

// in controller

use Ozioma\Otp\Rules\OtpValidate;

$request->validate([
    'code' => ['required', new OtpValidate('identifier-key-here', ['sensitive' => true])]
]);
```

- `setSensitive($boolean)`: Requiring correct input of uppercase and lowercase letters. Default: true

### Generate OTP with seperate password

[](#generate-otp-with-seperate-password)

```
$password = Otp::setLength([4,3,4])->setSeparator(':')->generate('identifier-key-here');
```

**Sample password**

```
3526:126:3697

```

- `setLength($array)`: The length of the password, use array to separate each length.
- `setSeparator($string)`: The separator of the password. Default: "-"

### Validate OTP with extra data

[](#validate-otp-with-extra-data)

```
$password = Otp::setData(['user_id' => auth()->id()])->generate('login-confirmation');
```

- `setData($var)`: Allows you to get the extra data of OTP.

```
// validate

$result = Otp::setDisposable(false)->validate('login-confirmation', 'password-here');

// in controller

use Ozioma\Otp\Rules\OtpValidate;

$request->validate([
    'code' => ['required', new OtpValidate('login-confirmation', ['disposable' => false])]
]);
```

- `setDisposable($boolean)`: The disposable of the Otp identifier, the different password is not valid when same identifier password used. Default: true

**On Success Response**

```
{
  "status": true,
  "data": [
    "user_id": 10
  ]
}

```

- When you set disposable to `false`, you are able support different password with different extra data for different user in the same identifier key of the OTP.

### Validate OTP with skip using

[](#validate-otp-with-skip-using)

```
// validate

$result = Otp::setSkip(true)->validate('identifier-key-here', 'password-here');

// in controller

use Ozioma\Otp\Rules\OtpValidate;

$request->validate([
    'code' => ['required', new OtpValidate('identifier-key-here', ['skip' => true])]
]);
```

- `setSkip($boolean)`: Skip using the password when validate, which means you can reuse the password again. Default: false
- When there is an error response to the form request, it will skip using the password, but remember to `OTP::validate(...)` in controller.

### Delete OTP

[](#delete-otp)

```
Otp::forget('identifier-key-here');
```

- Delete all password with this specific identifier

### Delete specific password

[](#delete-specific-password)

```
Otp::forget('identifier-key-here', 'password-here');
```

### Reset attempt times

[](#reset-attempt-times)

```
Otp::resetAttempt('identifier-key-here');
```

### Demo password

[](#demo-password)

Add the following Key-Value pair to the `.env` file in the Laravel application.

```
OTP_DEMO=true

```

- Demo mode for development purposes, no need to use real password to validate.
- Default demo password: "1234", "123456", "12345678"

Contribution
------------

[](#contribution)

All contributions are welcome! 😄

License
-------

[](#license)

The MIT License (MIT).

###  Health Score

24

—

LowBetter than 32% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity7

Limited adoption so far

Community8

Small or concentrated contributor base

Maturity53

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

1501d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/241972ab36f0db04cdeb07af0efac7edbe7a69e731298f98204a5435242aad02?d=identicon)[officialozioma](/maintainers/officialozioma)

---

Top Contributors

[![OfficialOzioma](https://avatars.githubusercontent.com/u/28990981?v=4)](https://github.com/OfficialOzioma "OfficialOzioma (6 commits)")

---

Tags

laravelotpone time passwordsone time pin

### Embed Badge

![Health badge](/badges/officialozioma-otp-generator/health.svg)

```
[![Health](https://phpackages.com/badges/officialozioma-otp-generator/health.svg)](https://phpackages.com/packages/officialozioma-otp-generator)
```

###  Alternatives

[erdemkeren/laravel-otp

Secure your laravel routes with otps. (one time passwords)

1608.5k](/packages/erdemkeren-laravel-otp)[teckwei1993/laravel-otp

Laravel OTP generator and validation

5556.0k](/packages/teckwei1993-laravel-otp)[tzsk/otp

A secure, database-free One-Time Password (OTP) generator and verifier for PHP and Laravel.

241641.4k1](/packages/tzsk-otp)[craftsys/msg91-laravel

Laravel service provider for Msg91 apis to Send OTPs, Verify OTPs, Resend OTPs, Send SMS (Short Message) etc

1295.8k1](/packages/craftsys-msg91-laravel)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
