How to use JWT in the neoan3 PHP framework
Tags: php, lamp, tutorial
Published: 2021-11-11 01:46:35

{% youtube 4h1JMpAx0cE %}
## The code to the video

I am trying out a new format of supplementing my videos with the relevant code-pieces and publishing them as an article. Please let me know if this is helpful or annoying. TY

## UserModel.php

### changes to the default outgoing method

```php
   /**
     * @param array $transactionResult
     * @return array
     */
    private static function outgoing(array $transactionResult): array
    {

        if(isset($transactionResult['password'])){
            unset($transactionResult['password']);
        } elseif (!empty($transactionResult)){
            foreach ($transactionResult as $i => $single){
                $transactionResult[$i] = self::outgoing($single);
            }

        }
        return $transactionResult;
    }
```

### changes to the default incoming method

```php
   /**
     * @param array $transactionResult
     * @return array
     */
    private static function outgoing(array $transactionResult): array
    {

        if(isset($transactionResult['password'])){
            unset($transactionResult['password']);
        } elseif (!empty($transactionResult)){
            foreach ($transactionResult as $i => $single){
                $transactionResult[$i] = self::outgoing($single);
            }

        }
        return $transactionResult;
    }

```

### the login method

```php
   /**
     * @throws RouteException
     */
    static function login($credentials)
    {
        $foundUser = self::$db->easy('user.id user.password',['email'=>$credentials['email']]);
        if(empty($foundUser) || !password_verify($credentials['password'],$foundUser[0]['password'])){
            throw new RouteException('Unauthorized', 401);
        }
        return self::get($foundUser[0]['id']);

    }

```## AuthController.php

The final version of our authorization controller.

**NOTE**: In the video, I forgot to address how my IDE automatically includes use-commands. Make sure you include those.

```php
<?php

namespace Neoan3\Component\Auth;

use Neoan3\Core\RouteException;
use Neoan3\Frame\Demo;
use Neoan3\Model\User\UserModel;
use Neoan3\Model\User\UserModelWrapper;
use Neoan3\Provider\Auth\Authorization;
use Neoan3\Provider\Model\InitModel;

/**
 * Class AuthController
 * @package Neoan3\Component\Auth
 *
 * Generated by neoan3-cli for neoan3 v3.*
 */

class AuthController extends Demo{

    /**
    * GET: api.v1/auth
    * GET: api.v1/auth/{id}
    * GET: api.v1/auth?{query-string}
    * @return array
    */
    #[Authorization('restrict',['admin'])]
    function getAuth(): array
    {
        return $this->authObject->getPayload();
    }

    /**
     * POST: api.v1/auth
     * @param string $mode
     * @param array $body
     * @return array
     * @throws \Neoan3\Core\RouteException
     */
    #[InitModel(UserModel::class)]
    function postAuth(string $mode="Login", array $body =[]): array
    {

        if($mode === 'Register'){
            // create user
            $newUser = new UserModelWrapper($body);
            try{
                $newUser->store()->rehydrate();
                $user = $newUser->toArray();
            }catch (\Exception $e) {
                throw new RouteException('Malformed input', 406);
            }
        } else {
            // try login
            $user = UserModel::login($body);
        }
        $authObject = $this->Auth->assign($user['id'], ['all'], ['email'=>$user['email']]);
        return ['token' => $authObject->getToken()];
    }
}
```