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

Image of Datadog

Create and maintain end-to-end frontend tests

Learn best practices on creating frontend tests, testing on-premise apps, integrating tests into your CI/CD pipeline, and using Datadog’s testing tunnel.

Download The Guide

Top comments (0)

Image of Docusign

🛠️ Bring your solution into Docusign. Reach over 1.6M customers.

Docusign is now extensible. Overcome challenges with disconnected products and inaccessible data by bringing your solutions into Docusign and publishing to 1.6M customers in the App Center.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay