DEV Community

Cover image for PHP HyperF -> Firebase JWT
Thiago Silva
Thiago Silva

Posted on

PHP HyperF -> Firebase JWT

HyperF - Project

Simple system to validate JWT tokens and ensure authenticity and integrity in authentication processes.

Create - Project

composer create-project hyperf/hyperf-skeleton "project"
Enter fullscreen mode Exit fullscreen mode

Install - Watcher

composer require hyperf/watcher --dev
Enter fullscreen mode Exit fullscreen mode

Install - Firebase JWT

composer require firebase/php-jwt
Enter fullscreen mode Exit fullscreen mode

Server - Start

cd project ;
php bin/hyperf.php server:watch ;
Enter fullscreen mode Exit fullscreen mode

HyperF - APP

APP - Environment

JWT_KEY="***"
Enter fullscreen mode Exit fullscreen mode

path: /project/.env

APP - Router

Router::addRoute(['GET', 'POST'], '/generate', 'App\Controller\ControllerJWT@generate');
Router::addRoute(['GET', 'POST'], '/decode', 'App\Controller\ControllerJWT@decode');
Enter fullscreen mode Exit fullscreen mode

path: /project/config/routes.php

APP - Controller

namespace App\Controller;

use Hyperf\Di\Annotation\Inject;
use Hyperf\HttpServer\Contract\RequestInterface;
use Hyperf\HttpServer\Contract\ResponseInterface;

use function Hyperf\Support\env;

use Ramsey\Uuid\Uuid;

use Firebase\JWT\JWT;
use Firebase\JWT\Key;

class ControllerJWT
{
    #[Inject]
    protected RequestInterface $request;

    #[Inject]
    protected ResponseInterface $response;

    protected $jwt_key;

    public function __construct()
    {
        $this->jwt_key=env('JWT_KEY', '***');
    }

    public function generate()
    {
        $payload=[
            'uuid'=>Uuid::uuid4()->toString(),
            'token'=>sha1(str_shuffle('0123456789abcdefghijklmnopqrstuvwxyz')),
        ];
        $token=JWT::encode($payload, $this->jwt_key, 'HS256');
        return [
            'payload'=>$payload,
            'token'=>$token,
        ];
    }

    public function decode()
    {
        $token=$this->request->getHeader('Authorization')[0] ?? '';
        $token=str_replace('Bearer ', '', $token);
        try {
            $decode=JWT::decode($token, new Key($this->jwt_key, 'HS256'));
        } catch (\Exception $e){
            return $this->response->withStatus(401)->json(['token'=>'invalid']);
        }
        return [
            'token'=>$token,
            'decode'=>$decode,
        ];
    }

}
Enter fullscreen mode Exit fullscreen mode

path: /project/app/Controller/ControllerJWT.php

Execute

GET - Generate Token

curl "http://127.0.0.1:9501/generate"

Response:
{
    "payload": {
        "uuid": "...0123",
        "token": "***"
    },
    "token": "***"
}
Enter fullscreen mode Exit fullscreen mode

GET - Decode Token

curl "http://127.0.0.1:9501/decode" -H "Authorization: Bearer %token%"

Response:
{
    "token": "***",
    "decode": {
        "uuid": "...0123",
        "token": "***"
    }
}
Enter fullscreen mode Exit fullscreen mode

https://github.com/thiagoeti/php-hyperf-firebase-jwt

Top comments (0)