ddruganov / yii2-api-auth
Authentication tools for yii2
Installs: 43
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 1
Forks: 0
Open Issues: 0
Type:yii2-extension
pkg:composer/ddruganov/yii2-api-auth
Requires
- ddruganov/yii2-api-essentials: ^1
- firebase/php-jwt: ^6.0
- yiisoft/yii2: ^2.0
Requires (Dev)
- codeception/codeception: ^4.1
- codeception/module-asserts: ^1.0.0
- codeception/module-phpbrowser: ^1.0.0
- fakerphp/faker: ^1.19
README
JWT auth server with rbac
Installation
composer require ddruganov/yii2-api-auth
How-to
- Add this to your app's main config:
... 'components' => [ AuthComponentInterface::class => AuthComponent::class, RbacComponentInterface::class => RbacComponent::class, AccessTokenProviderInterface::class => HeaderAccessTokenProvider::class ], 'controllerMap' => [ 'auth' => AuthController::class, 'app' => AppController::class, 'permission' => PermissionController::class, 'role' => PermissionController::class, 'user' => PermissionController::class ], ...
- Add this to your app's params:
... 'authentication' => [ 'masterPassword' => [ 'enabled' => false, 'value' => '' ], 'tokens' => [ 'secret' => '', 'access' => [ 'ttl' => 0, // seconds 'issuer' => '' ], 'refresh' => [ 'ttl' => 0 // seconds ] ], 'maxActiveSessions' => 3 ] ...
- Add migrations in you console config for rbac features:
... 'controllerMap' => [ 'migrate' => [ 'class' => MigrateController::class, 'migrationPath' => null, 'migrationNamespaces' => [ 'console\migrations', 'ddruganov\Yii2ApiAuth\migrations', ], ], ], ...
Auth
All methods require the authenticate permission;
POST auth/loginwith email and password to login into the default app and get a pair of tokensPOST auth/login-intowith an app id when already authenticated to get authenticated in another appPOST auth/refreshwith your refresh token to get a fresh pair of tokensPOST auth/logoutto logoutGET auth/current-userto get current user infoGET auth/verifyreserved; used byddruganov\yii2-api-auth-proxyPOST auth/check-permissionreserved; used byddruganov\yii2-api-auth-proxy- Use
Yii::$app->get(AuthComponentInterface::class)->getCurrentUser()to get the currently logged inddruganov\Yii2ApiEssentials\auth\models\User - Attach
AuthFilteras a behavior to yourApiControllerto only allow authenticated users to access the endpoints - Attach
RbacFilteras a behavior to yourApiControllerto only allow users with specific permissions to access the endpoints
Obviously, your User class is gonna have more than just simple fields like email and name so you'll have to return a different user type from the AuthComponent. Easiest way:
final class YourAuthComponent extends Yii2ApiAuthComponent { public function getCurrentUser(): ?YourUser { return YourUser::findOne($this->getPayloadValue('uid')); } }
YourUser has to extend ddruganov\Yii2ApiEssentials\auth\models\User
Apps
GET app/allto get a list of all available appsGET app/onewith an app uuid to get info about a single appPOST app/createto create an app; requires theapp.createpermissionPOST app/updateto update an app; requires theapp.updatepermissionPOST app/deleteto delete an app; requires theapp.deletepermission- Use
Yii::$app->get(AuthComponentInterface::class)->login($user, $app)to get a pair of tokens for the said app - Do not forget to create permissions for newly created apps
Be ware that you cannot create a default app, only change the existing one to fit your data
Permissions
GET permission/allto get a list of all available permissions; requires thepermission.viewpermissionGET permission/onewith a permission id to get full info about a permission; requires thepermission.viewpermissionPOST permission/createto create a permission; requires thepermission.createpermissionPOST permission/updateto update a permission; requires thepermission.updatepermissionPOST permission/deleteto delete a permission (also deletes role bindings); requires thepermission.deletepermission
Roles
GET role/allto get a list of all available roles; requires therole.viewpermissionGET role/onewith a role id to get full info about a role; requires therole.viewpermissionPOST role/createto create a role; requires therole.createpermissionPOST role/updateto update a role; requires therole.updatepermissionPOST role/deleteto delete a role (also deletes permission and user bindings); requires therole.deletepermission
Users
GET user/allto get a list of all available users; requires theuser.viewpermissionGET user/onewith a user id to get full info about a user; requires theuser.viewpermissionPOST user/createto create a user; requires theuser.createpermissionPOST user/updateto update a user; requires theuser.updatepermissionPOST user/deleteto delete a user (also deletes role bindings); requires theuser.deletepermission
Example of extending user controller, forms and collectors:
final class YourUpdateForm extends UpdateForm { public ?bool $isBanned = false; public function rules() { return ArrayHelper::merge(parent::rules(), [ [['isBanned'], 'required'] ]); } protected function setCustomAttributes(Model $model) { parent::setCustomAttributes($model); $model->setAttributes([ 'is_banned' => $this->isBanned ]); } }
final class YourUserAllCollector extends UserAllCollector { protected function _run(): ExecutionResult { $query = YourUser::find() ->newestFirst() ->limit($this->limit) ->page($this->page); return ExecutionResult::success([ 'totalPageCount' => (clone $query)->getPageCount(), 'users' => array_map( fn (User $user) => [ 'id' => $user->getId(), 'email' => $user->getEmail(), 'name' => $user->getName(), 'isBanned' => $user->isBanned(), 'createdAt' => $user->getCreatedAt(), ], (clone $query)->all() ) ]); } }
final class YourUserController extends UserController { public function actions() { return ArrayHelper::merge(parent::actions(),[ 'all' => YourAllUserCollector::class, 'update' => YourUpdateForm::class ]); } }
YourUser has to extend ddruganov\Yii2ApiEssentials\auth\models\User