PHPackages                             ianm/twofactor - 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. [Authentication &amp; Authorization](/categories/authentication)
4. /
5. ianm/twofactor

ActiveFlarum-extension[Authentication &amp; Authorization](/categories/authentication)

ianm/twofactor
==============

2FA for Flarum

1.2.2(1mo ago)59.3k↑28.6%2[9 issues](https://github.com/imorland/flarum-ext-twofactor/issues)MITPHPPHP ^8.1CI passing

Since Sep 10Pushed 1mo ago1 watchersCompare

[ Source](https://github.com/imorland/flarum-ext-twofactor)[ Packagist](https://packagist.org/packages/ianm/twofactor)[ Fund](https://www.buymeacoffee.com/ianm1)[ RSS](/packages/ianm-twofactor/feed)WikiDiscussions 2.x Synced 1mo ago

READMEChangelog (10)Dependencies (20)Versions (29)Used By (0)

2FA
===

[](#2fa)

[![License](https://camo.githubusercontent.com/7013272bd27ece47364536a221edb554cd69683b68a46fc0ee96881174c4214c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d626c75652e737667)](https://camo.githubusercontent.com/7013272bd27ece47364536a221edb554cd69683b68a46fc0ee96881174c4214c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d626c75652e737667) [![Latest Stable Version](https://camo.githubusercontent.com/abd8d84447a6ff2f786b6b4c880f5ef81df12016295a1515bcadfeeccdf95865/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f69616e6d2f74776f666163746f722e737667)](https://packagist.org/packages/ianm/twofactor) [![Total Downloads](https://camo.githubusercontent.com/e33b97f5ff7d5d1e1eb258537583347870d89585f6d285e2f5a016e3b88bdf18/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f69616e6d2f74776f666163746f722e737667)](https://packagist.org/packages/ianm/twofactor)

A [Flarum](http://flarum.org) extension. 2FA for Flarum

Requirements
------------

[](#requirements)

This extension requires a minimum of PHP 8.1, due to a 3rd party library constraint.

Features
--------

[](#features)

- Enforces `admin` accounts to have 2FA enabled for increased security
- Configure which additional user groups should also be enforced
- Supports all common authentication apps
- Protects `login`, `forgot password` endpoints
- Integrates with `fof/oauth` to protect OAuth logins to protected accounts
- 2FA Enabled/Disabled notifications
- 2FA Status page
- Backup/recovery codes
- Option to revoke dormant access tokens after X days of no usage

Permissions
-----------

[](#permissions)

This extension provides the ability to view the status of 2FA of other users (intended for admin and/or moderator use). In order for this to function correctly, you must also set the permission `Moderate Access Tokens` to at least the same group as you require for `View 2FA status of other users`.

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

[](#installation)

Install with composer:

```
composer require ianm/twofactor:"*"
```

Updating
--------

[](#updating)

```
composer update ianm/twofactor
php flarum migrate
php flarum cache:clear
```

Usage
-----

[](#usage)

### CLI

[](#cli)

Independantly of the setting, you may remove dormant access tokens using the CLI. The days setting defaults to 30 days, and the CLI will still respect this value from the extension settings, as well as the developer token setting:

```
php flarum twofactor:kill-inactive-tokens
```

[![cli](https://private-user-images.githubusercontent.com/16573496/339968512-ef914d1e-cc65-4621-9484-4b8eeb7642f9.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MTg0NDE1ODQsIm5iZiI6MTcxODQ0MTI4NCwicGF0aCI6Ii8xNjU3MzQ5Ni8zMzk5Njg1MTItZWY5MTRkMWUtY2M2NS00NjIxLTk0ODQtNGI4ZWViNzY0MmY5LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA2MTUlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNjE1VDA4NDgwNFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTYyMjA5NmMzMzg1ZjJhMzdjMDRmNGI1ZGQyNDVjM2U4NjRlYjIxZWE3NDQ2ODI5NDkyNzk0ZjE4YjE4NWI0ZTMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.Bb8Wgml7ohvCF7m89EXhRhNBS7zo95tDx777g5gj8vg)](https://private-user-images.githubusercontent.com/16573496/339968512-ef914d1e-cc65-4621-9484-4b8eeb7642f9.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MTg0NDE1ODQsIm5iZiI6MTcxODQ0MTI4NCwicGF0aCI6Ii8xNjU3MzQ5Ni8zMzk5Njg1MTItZWY5MTRkMWUtY2M2NS00NjIxLTk0ODQtNGI4ZWViNzY0MmY5LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA2MTUlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNjE1VDA4NDgwNFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTYyMjA5NmMzMzg1ZjJhMzdjMDRmNGI1ZGQyNDVjM2U4NjRlYjIxZWE3NDQ2ODI5NDkyNzk0ZjE4YjE4NWI0ZTMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.Bb8Wgml7ohvCF7m89EXhRhNBS7zo95tDx777g5gj8vg)

TODO

Screenshots
-----------

[](#screenshots)

##### QR Code setup

[](#qr-code-setup)

[![qr-code-setup](https://private-user-images.githubusercontent.com/16573496/266848904-dbf6c4d1-ac1f-4de9-b966-0065529e8edf.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzUzNjQwOTAsIm5iZiI6MTc3NTM2Mzc5MCwicGF0aCI6Ii8xNjU3MzQ5Ni8yNjY4NDg5MDQtZGJmNmM0ZDEtYWMxZi00ZGU5LWI5NjYtMDA2NTUyOWU4ZWRmLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjA0MDUlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwNDA1VDA0MzYzMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWQ5YjIwZjBkYTkzYjI4MGJiOGFlZGQ4NjYxYjM1MjhkMGM4N2ZhNGJmYjc2YmMzMTc3YjZiZmUxOGE5ZGFkM2YmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.vMldrN3MpiT6JapfGGrOHmkO3KDCMev65RVVVslJJbQ)](https://private-user-images.githubusercontent.com/16573496/266848904-dbf6c4d1-ac1f-4de9-b966-0065529e8edf.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzUzNjQwOTAsIm5iZiI6MTc3NTM2Mzc5MCwicGF0aCI6Ii8xNjU3MzQ5Ni8yNjY4NDg5MDQtZGJmNmM0ZDEtYWMxZi00ZGU5LWI5NjYtMDA2NTUyOWU4ZWRmLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjA0MDUlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwNDA1VDA0MzYzMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWQ5YjIwZjBkYTkzYjI4MGJiOGFlZGQ4NjYxYjM1MjhkMGM4N2ZhNGJmYjc2YmMzMTc3YjZiZmUxOGE5ZGFkM2YmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.vMldrN3MpiT6JapfGGrOHmkO3KDCMev65RVVVslJJbQ)

##### Manual setup

[](#manual-setup)

[![manual setup](https://private-user-images.githubusercontent.com/16573496/266557853-555078cc-041d-4ac3-a0c9-b3ed87ca181b.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzUzNjQwOTAsIm5iZiI6MTc3NTM2Mzc5MCwicGF0aCI6Ii8xNjU3MzQ5Ni8yNjY1NTc4NTMtNTU1MDc4Y2MtMDQxZC00YWMzLWEwYzktYjNlZDg3Y2ExODFiLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjA0MDUlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwNDA1VDA0MzYzMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTQzNmM0MDViNGJlMDVmMWE5YWVmOGM5YWUxNzgwYmE3ZGFjZDNlZGU0MTM5ZTFiOGFhOWZhYTZjNzg0OWNkNzUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.1iiMUNylVyy7M6dE6HnDNNseITDiYTBgT4nel__cSGU)](https://private-user-images.githubusercontent.com/16573496/266557853-555078cc-041d-4ac3-a0c9-b3ed87ca181b.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzUzNjQwOTAsIm5iZiI6MTc3NTM2Mzc5MCwicGF0aCI6Ii8xNjU3MzQ5Ni8yNjY1NTc4NTMtNTU1MDc4Y2MtMDQxZC00YWMzLWEwYzktYjNlZDg3Y2ExODFiLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjA0MDUlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwNDA1VDA0MzYzMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTQzNmM0MDViNGJlMDVmMWE5YWVmOGM5YWUxNzgwYmE3ZGFjZDNlZGU0MTM5ZTFiOGFhOWZhYTZjNzg0OWNkNzUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.1iiMUNylVyy7M6dE6HnDNNseITDiYTBgT4nel__cSGU)

##### Security tab integration

[](#security-tab-integration)

[![security tab integration](https://private-user-images.githubusercontent.com/16573496/266554993-f0247afe-16f4-4ccf-b09c-0637d7b9c783.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzUzNjQwOTAsIm5iZiI6MTc3NTM2Mzc5MCwicGF0aCI6Ii8xNjU3MzQ5Ni8yNjY1NTQ5OTMtZjAyNDdhZmUtMTZmNC00Y2NmLWIwOWMtMDYzN2Q3YjljNzgzLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjA0MDUlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwNDA1VDA0MzYzMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTUxMDEzYzlmMjMxMmYwOTM1NzIyMzUxYzk3MmIxYmE1NDhmNDg0OGU0MGZhZWY2OTA0ZTNmNzAxMGZhYTA0OGEmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.SFR3ToFDBJUVYcIttWoT0DCU0gFzv6FqiMrVgC67kgw)](https://private-user-images.githubusercontent.com/16573496/266554993-f0247afe-16f4-4ccf-b09c-0637d7b9c783.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzUzNjQwOTAsIm5iZiI6MTc3NTM2Mzc5MCwicGF0aCI6Ii8xNjU3MzQ5Ni8yNjY1NTQ5OTMtZjAyNDdhZmUtMTZmNC00Y2NmLWIwOWMtMDYzN2Q3YjljNzgzLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjA0MDUlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwNDA1VDA0MzYzMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTUxMDEzYzlmMjMxMmYwOTM1NzIyMzUxYzk3MmIxYmE1NDhmNDg0OGU0MGZhZWY2OTA0ZTNmNzAxMGZhYTA0OGEmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.SFR3ToFDBJUVYcIttWoT0DCU0gFzv6FqiMrVgC67kgw)

##### Enabled/Disabled notifications

[](#enableddisabled-notifications)

[![notifications](https://private-user-images.githubusercontent.com/16573496/266555727-d5c052e2-bb08-4c3a-a24d-ac8c4b9e3f57.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzUzNjQwOTAsIm5iZiI6MTc3NTM2Mzc5MCwicGF0aCI6Ii8xNjU3MzQ5Ni8yNjY1NTU3MjctZDVjMDUyZTItYmIwOC00YzNhLWEyNGQtYWM4YzRiOWUzZjU3LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjA0MDUlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwNDA1VDA0MzYzMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWE2YTk1NDRjYzVlMzJjZGE2NDk5NjFiM2QxN2FmNzhjNWZmZmY2MjRhMzkzMjNiMzgwYTZlMWJlZmY0MGVhYzcmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.3sCxe5FdgOzLODDA8oSb16YcZ4FAW1FK66abLMrVohM)](https://private-user-images.githubusercontent.com/16573496/266555727-d5c052e2-bb08-4c3a-a24d-ac8c4b9e3f57.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzUzNjQwOTAsIm5iZiI6MTc3NTM2Mzc5MCwicGF0aCI6Ii8xNjU3MzQ5Ni8yNjY1NTU3MjctZDVjMDUyZTItYmIwOC00YzNhLWEyNGQtYWM4YzRiOWUzZjU3LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjA0MDUlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwNDA1VDA0MzYzMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWE2YTk1NDRjYzVlMzJjZGE2NDk5NjFiM2QxN2FmNzhjNWZmZmY2MjRhMzkzMjNiMzgwYTZlMWJlZmY0MGVhYzcmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.3sCxe5FdgOzLODDA8oSb16YcZ4FAW1FK66abLMrVohM)

##### Admin user list status icon

[](#admin-user-list-status-icon)

[![userlist](https://private-user-images.githubusercontent.com/16573496/266556150-9c1a58c9-919b-4552-ad1f-f022a5240f17.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzUzNjQwOTAsIm5iZiI6MTc3NTM2Mzc5MCwicGF0aCI6Ii8xNjU3MzQ5Ni8yNjY1NTYxNTAtOWMxYTU4YzktOTE5Yi00NTUyLWFkMWYtZjAyMmE1MjQwZjE3LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjA0MDUlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwNDA1VDA0MzYzMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTBmNDI0N2E1NjVkZWM5ODIxYjcxNzYxNzdlNmJlOWM3N2JhNjRmMjljMGNmZTBlY2NjMGJjOGU5YmUzZmE2NzgmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.hoTB1UiqJ2S8bwEobDACwPtvsWt5ygoyclZDEkHksLo)](https://private-user-images.githubusercontent.com/16573496/266556150-9c1a58c9-919b-4552-ad1f-f022a5240f17.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzUzNjQwOTAsIm5iZiI6MTc3NTM2Mzc5MCwicGF0aCI6Ii8xNjU3MzQ5Ni8yNjY1NTYxNTAtOWMxYTU4YzktOTE5Yi00NTUyLWFkMWYtZjAyMmE1MjQwZjE3LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjA0MDUlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwNDA1VDA0MzYzMFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTBmNDI0N2E1NjVkZWM5ODIxYjcxNzYxNzdlNmJlOWM3N2JhNjRmMjljMGNmZTBlY2NjMGJjOGU5YmUzZmE2NzgmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.hoTB1UiqJ2S8bwEobDACwPtvsWt5ygoyclZDEkHksLo)

Extensibility
-------------

[](#extensibility)

### Disabling 2FA for specific OAuth providers

[](#disabling-2fa-for-specific-oauth-providers)

If you are building an extension that integrates with `fof/oauth` and want certain providers to bypass the 2FA challenge entirely, use the `TwoFactor` extender in your extension's `extend.php`. Wrap it in a `Conditional` so it only activates when `ianm/twofactor` is enabled:

```
use Flarum\Extend\Conditional;
use IanM\TwoFactor\Extend\TwoFactor;

return [
    // ...
    (new Conditional())
        ->whenExtensionEnabled('ianm-twofactor', fn () => [
            (new TwoFactor())->disable('my-oauth-provider'),
        ]),
];
```

The provider name must match the string identifier used when registering the provider with `fof/oauth` (e.g. `'github'`, `'google'`, `'discord'`). Multiple providers can be chained:

```
(new Conditional())
    ->whenExtensionEnabled('ianm-twofactor', fn () => [
        (new TwoFactor())
            ->disable('github')
            ->disable('google'),
    ]),
```

> **Note:** This only bypasses the OAuth 2FA interception. Users who log in directly (username + password) are unaffected and will still be required to complete 2FA if it is enabled on their account.

Links
-----

[](#links)

- [Packagist](https://packagist.org/packages/ianm/twofactor)
- [GitHub](https://github.com/imorland/flarum-ext-twofactor)
- [Discuss](https://discuss.flarum.org/d/33339)

Support
-------

[](#support)

Please consider supporting my extension development and maintenance work.

[![Buy Me A Coffee](https://camo.githubusercontent.com/9a769e616ce78645bf51d12e4179cfbfd72fb413722b284e0be3ec3c75a86010/68747470733a2f2f63646e2e6275796d6561636f666665652e636f6d2f627574746f6e732f64656661756c742d6f72616e67652e706e67)](https://www.buymeacoffee.com/ianm1)

###  Health Score

48

—

FairBetter than 95% of packages

Maintenance70

Regular maintenance activity

Popularity31

Limited adoption so far

Community14

Small or concentrated contributor base

Maturity62

Established project with proven stability

 Bus Factor1

Top contributor holds 59.2% 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

Every ~37 days

Recently: every ~7 days

Total

26

Last Release

55d ago

Major Versions

1.2.0 → 2.0.0-beta.12025-11-04

1.2.1 → 2.0.0-beta.22025-12-01

PHP version history (3 changes)1.0.0PHP ^8.0

1.0.8PHP ^8.1

2.0.0-beta.1PHP ^8.2

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/16573496?v=4)[IanM](/maintainers/imorland)[@imorland](https://github.com/imorland)

---

Top Contributors

[![imorland](https://avatars.githubusercontent.com/u/16573496?v=4)](https://github.com/imorland "imorland (42 commits)")[![flarum-bot](https://avatars.githubusercontent.com/u/39334649?v=4)](https://github.com/flarum-bot "flarum-bot (20 commits)")[![StyleCIBot](https://avatars.githubusercontent.com/u/11048387?v=4)](https://github.com/StyleCIBot "StyleCIBot (4 commits)")[![datlechin](https://avatars.githubusercontent.com/u/56961917?v=4)](https://github.com/datlechin "datlechin (3 commits)")[![rafaucau](https://avatars.githubusercontent.com/u/25438601?v=4)](https://github.com/rafaucau "rafaucau (2 commits)")

---

Tags

flarum

### Embed Badge

![Health badge](/badges/ianm-twofactor/health.svg)

```
[![Health](https://phpackages.com/badges/ianm-twofactor/health.svg)](https://phpackages.com/packages/ianm-twofactor)
```

###  Alternatives

[fof/oauth

Allow users to log in with GitHub, Facebook, Google, Discord, GitLab, LinkedIn, and more!

50118.7k41](/packages/fof-oauth)[fof/doorman

Create invite codes for users to sign up and be assigned to a group

2537.2k2](/packages/fof-doorman)[maicol07/flarum-ext-sso

SSO for Flarum

468.3k](/packages/maicol07-flarum-ext-sso)[fof/terms

Ask users to accept terms of use before using the forum

1367.8k1](/packages/fof-terms)[fof/passport

The OAuth2 (and Laravel passport) compatible oauth extension

3013.3k](/packages/fof-passport)[foskym/flarum-oauth-center

Allow user to authorize the third clients

221.4k](/packages/foskym-flarum-oauth-center)

PHPackages © 2026

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