CORS (Cross-Origin Resource Sharing) support for Laravel and Lumen

Overview

Project Management Scrutinizer Code Quality Code Coverage Build Status License

Description

This package adds Cross-Origin Resource Sharing (CORS) support to your Laravel application.

The package is based on Framework agnostic (PSR-7) CORS implementation.

The current version V3 is designed for Laravel 6 or higher. If you use lower Laravel version please use V2.

Install

1 Composer

composer require neomerx/cors-illuminate

2.1 Laravel

For Lumen skip this step and see step 2.2

Create a config file by executing

php artisan vendor:publish --provider="Neomerx\CorsIlluminate\Providers\LaravelServiceProvider"

it will create config/cors-illuminate.php file in you application.

Add CORS middleware to your HTTP stack at app/Http/Kernel.php file. The middleware should be added to $middleware list which is executed for all routes (even non declared in your routes file). Preferably before 'heavy' middleware for performance reasons.

class Kernel extends HttpKernel
{
    ...

    protected $middleware = [
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
        \Neomerx\CorsIlluminate\CorsMiddleware::class, // <== add this line
        
        ...
    ];
    
    ...
}

Next see step 3

2.2 Lumen

For Laravel skip this step

In bootstrap/app.php add CORS to global middleware list

$app->middleware([
    ...
    \Neomerx\CorsIlluminate\CorsMiddleware::class,
]);

and register CORS provider

$app->register(\Neomerx\CorsIlluminate\Providers\LumenServiceProvider::class);

As Lumen does not support vendor:publish command file vendor/neomerx/cors-illuminate/config/cors-illuminate.php have to be manually copied to config/cors-illuminate.php.

Next see step 3

3 Configuration

Configuration file is extensively commented so it will be easy for you to set up it for your needs. First settings you need to configure are server origin (URL) and allowed origins

    ...
    
    /**
     * Could be string or array. If specified as array (recommended for
     * better performance) it should be in parse_url() result format.
     */
    Settings::KEY_SERVER_ORIGIN => [
        'scheme' => 'http',
        'host'   => 'localhost',
        'port'   => 1337,
    ],

    /**
     * A list of allowed request origins (no trail slashes).
     * If value is not on the list it is considered as not allowed.
     * If you want to allow all origins remove/comment this section.
     */
    Settings::KEY_ALLOWED_ORIGINS => [
        'http://localhost:4200',
    ],
    
    ...

Exceptions and CORS headers

When exceptions are thrown and responses are created in Laravel/Lumen exception handlers middleware will be excluded from handling responses. It means CORS middleware will not add its CORS headers to responses. For this reason CORS results (including headers) are registered in Laravel/Lumen Container and made accessible from any part of your application including exception handlers.

Code sample for reading CORS headers

use Neomerx\Cors\Contracts\AnalysisResultInterface;

$corsHeaders = [];
if (app()->resolved(AnalysisResultInterface::class) === true) {
    /** @var AnalysisResultInterface $result */
    $result = app(AnalysisResultInterface::class);
    $corsHeaders = $result->getResponseHeaders();
}

Customization

This package provides a number of ways how its behaviour could be customized.

The following methods of class CorsMiddleware could be replaced in descendant classes

  • getResponseOnError You can override this method in order to customize error reply.
  • getCorsAnalysis You can override this method to modify how CORS analysis result is saved to Illuminate Container.
  • getRequestAdapter You can override this method to replace IlluminateRequestToPsr7 adapter with another one.

Additionally a custom AnalysisStrategyInterface could be injected by

  • overriding getCreateAnalysisStrategyClosure method in ServiceProvider for Laravel/Lumen
  • using Laravel/Lumen Container binding for interface AnalysisStrategyInterface

Also custom AnalyzerInterface could be injected by

Testing

composer test

Contributing

Pull requests for documentation and code improvements (PSR-2, tests) are welcome.

Versioning

This package is using Semantic Versioning.

License

Apache License (Version 2.0). Please see License File for more information.

Comments
  • Configuration question

    Configuration question

    Hello @neomerx,

    I am trying your wonderful package, but it isn't working till now.

    I have followed your instructions by the point and don't understand why I have trouble.

    I have a fresh installation of Laravel 5.2.22 and a fresh installation of cors-illuminate here:

    https://github.com/LoveAndHappiness/cors-illuminate-example

    But, though I configured everything to my liking, I just don't get any headers in my responses, though I added cors to my global middleware.

    If you want to reproduce it, just

    1. Clone the repository
    2. php artisan migrate, to migrate a BooksTable
    3. php artisan db:seed, to seed 10 books into the BooksTable
    4. php artisan serve to boot server
    5. Goto route http://localhost:8000/api/books and check the headers of the response.

    Any suggestions?

    question 
    opened by LoveAndHappiness 17
  • Origin as 'file://'. Support for multiple origins in config?

    Origin as 'file://'. Support for multiple origins in config?

    Hello! Please, can anybody give an idea, what's wrong. I use Lumen on http://lumen.app URL on my local machine and get this error:

    [2016-03-18 10:09:54] lumen.ERROR: exception 'InvalidArgumentException' with message 'url' in /home/vagrant/Code/lumen/vendor/neomerx/cors-psr7/src/Http/ParsedUrl.php:70
    Stack trace:
    #0 /home/vagrant/Code/lumen/vendor/neomerx/cors-psr7/src/Factory/Factory.php(51): Neomerx\Cors\Http\ParsedUrl->__construct('file://')
    #1 /home/vagrant/Code/lumen/vendor/neomerx/cors-psr7/src/Analyzer.php(363): Neomerx\Cors\Factory\Factory->createParsedUrl('file://')
    #2 /home/vagrant/Code/lumen/vendor/neomerx/cors-psr7/src/Analyzer.php(144): Neomerx\Cors\Analyzer->getOrigin(Object(Neomerx\CorsIlluminate\Adapters\IlluminateRequestToPsr7))
    #3 /home/vagrant/Code/lumen/vendor/neomerx/cors-psr7/src/Analyzer.php(114): Neomerx\Cors\Analyzer->analyzeImplementation(Object(Neomerx\CorsIlluminate\Adapters\IlluminateRequestToPsr7))
    #4 /home/vagrant/Code/lumen/vendor/neomerx/cors-illuminate/src/CorsMiddleware.php(116): Neomerx\Cors\Analyzer->analyze(Object(Neomerx\CorsIlluminate\Adapters\IlluminateRequestToPsr7))
    #5 /home/vagrant/Code/lumen/vendor/neomerx/cors-illuminate/src/CorsMiddleware.php(63): Neomerx\CorsIlluminate\CorsMiddleware->getCorsAnalysis(Object(Illuminate\Http\Request))
    #6 [internal function]: Neomerx\CorsIlluminate\CorsMiddleware->handle(Object(Illuminate\Http\Request), Object(Closure))
    #7 /home/vagrant/Code/lumen/vendor/illuminate/pipeline/Pipeline.php(124): call_user_func_array(Array, Array)
    #8 [internal function]: Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
    #9 /home/vagrant/Code/lumen/vendor/illuminate/pipeline/Pipeline.php(103): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
    #10 /home/vagrant/Code/lumen/vendor/laravel/lumen-framework/src/Application.php(1439): Illuminate\Pipeline\Pipeline->then(Object(Closure))
    #11 /home/vagrant/Code/lumen/vendor/laravel/lumen-framework/src/Application.php(1213): Laravel\Lumen\Application->sendThroughPipeline(Array, Object(Closure))
    #12 /home/vagrant/Code/lumen/vendor/laravel/lumen-framework/src/Application.php(1153): Laravel\Lumen\Application->dispatch(NULL)
    #13 /home/vagrant/Code/lumen/public/index.php(28): Laravel\Lumen\Application->run()
    #14 {main}
    

    It appears only on POST requests (in Postman).

    My config file has:

    S::KEY_SERVER_ORIGIN => [
            'scheme' => 'http',
            'host'   => 'lumen.app',
            'port'   => 8080
        ],
    

    I'm not sure it's correct, but I can't find more documentation for this package. So I don't fully understand why should I specify this parameter.

    By the way, how can I specify several hosts in the config file? For production server, for example? Can it automatically detect current origin?

    enhancement question 
    opened by chimit 14
  • Configuration question

    Configuration question

    I tried to use the package in lumen as:

    \bootstrap\app.php

    $app->routeMiddleware([
        'cors' => \Neomerx\CorsIlluminate\CorsMiddleware::class,
    ]);
    

    in config/cors-illuminate.php :

    Settings::KEY_SERVER_ORIGIN => [
            'scheme' => 'http',
            'host'   => '192.168.99.100',
            'port'   => 9900,
        ],
    
        /**
         * A list of allowed request origins (lower-cased, no trail slashes).
         * Value `true` enables and value `null` disables origin.
         * If value is not on the list it is considered as not allowed.
         * Environment variables could be used for enabling/disabling certain hosts.
         */
        Settings::KEY_ALLOWED_ORIGINS => [
            'http://192.168.99.100:9900'         => true,
        ],
    

    But I got error if I visit the route at the same host of the app:

    Class path.config does not exist

    So, what I am missing?

    question 
    opened by hopewise 11
  • Lumen 5.2?

    Lumen 5.2?

    I just upgrade to the latest version of lumen and when i use postman to test my work i get this error:

    [2016-04-26 12:39:41] lumen.DEBUG: CORS analysis for request started.  
    [2016-04-26 12:39:41] lumen.ERROR: exception 'ErrorException' with message 'Undefined offset: 9' in /share/vendor/neomerx/cors-psr7/src/Strategies/Settings.php:344
    Stack trace:
    #0 /share/vendor/neomerx/cors-psr7/src/Strategies/Settings.php(344): Laravel\Lumen\Application->Laravel\Lumen\Concerns\{closure}(8, 'Undefined offse...', '/share/vendor/n...', 344, Array)
    #1 /share/vendor/neomerx/cors-psr7/src/Analyzer.php(132): Neomerx\Cors\Strategies\Settings->isCheckHost()
    #2 /share/vendor/neomerx/cors-psr7/src/Analyzer.php(115): Neomerx\Cors\Analyzer->analyzeImplementation(Object(Neomerx\CorsIlluminate\Adapters\IlluminateRequestToPsr7))
    #3 /share/vendor/neomerx/cors-illuminate/src/CorsMiddleware.php(116): Neomerx\Cors\Analyzer->analyze(Object(Neomerx\CorsIlluminate\Adapters\IlluminateRequestToPsr7))
    #4 /share/vendor/neomerx/cors-illuminate/src/CorsMiddleware.php(63): Neomerx\CorsIlluminate\CorsMiddleware->getCorsAnalysis(Object(Illuminate\Http\Request))
    #5 [internal function]: Neomerx\CorsIlluminate\CorsMiddleware->handle(Object(Illuminate\Http\Request), Object(Closure))
    #6 /share/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(136): call_user_func_array(Array, Array)
    #7 [internal function]: Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
    #8 /share/vendor/laravel/lumen-framework/src/Routing/Pipeline.php(32): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
    #9 [internal function]: Laravel\Lumen\Routing\Pipeline->Laravel\Lumen\Routing\{closure}(Object(Illuminate\Http\Request))
    #10 /share/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(103): call_user_func(Object(Closure), Object(Illuminate\Http\Request))
    #11 /share/vendor/laravel/lumen-framework/src/Concerns/RoutesRequests.php(626): Illuminate\Pipeline\Pipeline->then(Object(Closure))
    #12 /share/vendor/laravel/lumen-framework/src/Concerns/RoutesRequests.php(382): Laravel\Lumen\Application->sendThroughPipeline(Array, Object(Closure))
    #13 /share/vendor/laravel/lumen-framework/src/Concerns/RoutesRequests.php(327): Laravel\Lumen\Application->dispatch(NULL)
    #14 /share/public/index.php(28): Laravel\Lumen\Application->run()
    #15 /share/vendor/mlntn/lumen-artisan-serve/src/server.php(21): require_once('/share/public/i...')
    #16 {main}  
    
    

    does cors-illuminate support lumen 5.2?

    bug question 
    opened by Malraoosh 8
  • When i do get Request it works but when i do Post Request it gives error

    When i do get Request it works but when i do Post Request it gives error

    Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://domain1.react.pma' is therefore not allowed access. The response had HTTP status code 400.

    question 
    opened by khanakia 6
  • Android?

    Android?

    As I am trying to access my API server from Android, I started to get errors:

    [2016-08-24 09:44:06] lumen.DEBUG: CORS analysis for request started.  
    [2016-08-24 09:44:06] lumen.DEBUG: Request is not CORS (request origin is empty or equals to server one). Check config settings for Server Origin. {"request":null,"server":"[object] (Neomerx\\Cors\\Http\\ParsedUrl: http://192.168.1.34:9907)"} 
    [2016-08-24 09:44:06] lumen.DEBUG: CORS analysis for request completed.  
    

    Although I set this in my settings:

    S::KEY_ALLOWED_ORIGINS => [S::VALUE_ALLOW_ORIGIN_ALL => true],
    

    But I keep getting the same error, please advice.

    question 
    opened by hopewise 5
  • Configure allowed origins

    Configure allowed origins

    If a preflight "options" requests is done it still give's me "Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource."

    what am i doing wrong i just cant figure it out... even added "options" to Settings::key_ALLOWED_METHODS didnt fix it

    question 
    opened by psopacua 5
  • Global middleware breaking passport route in chrome and safari

    Global middleware breaking passport route in chrome and safari

    Hi, placing the middleware globally is causing issues with requests related to web routes, specifically the built-in Passport web route POST /password/email, it's returning a 400 error in chrome and safari (but not firefox). If I remove the middleware from my global middleware list this route starts working again for chrome/safari, but obviously breaks cors for the rest of my api-specific requests. Is there any way around this?

    question 
    opened by deadlysyntax 4
  • Configuration Question: KEY_CHECK_HOST_HEADER

    Configuration Question: KEY_CHECK_HOST_HEADER

    Hello, just curious if the KEY_CHECK_HOST_HEADER should be included in the published cors-illuminate config file.

    Without this key, I get an exception 'ErrorException' with message 'Undefined offset: 9'.

    It took some time tracing through the package src before finding this config option. After I add this key to my config file, the ErrorException goes away and everything appears to be in working order.

    I searched the closed issues and could not find any reference to KEY_CHECK_HOST_HEADER

    Thanks!

    bug question 
    opened by righter 3
  • OPTIONS request fails without Accept header

    OPTIONS request fails without Accept header

    It looks like the OPTIONS request prior to the backend request fails with 400: Bad Request when no Accept header is present in the OPTIONS request.

    This is a problem, because the Accept header included with OPTIONS doesn't seem to be standardized and cannot be modified by JavaScript.

    • Chrome sends Accept: */*
    • Firefox sends: Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    • Safari does not send Accept - instead it asks, if it would be okay to send Accept: Access-Control-Request-Headers accept, origin, authorization

    Since the spec ( https://www.w3.org/TR/cors/ ) doesn't mention Accept header in OPTIONS request, I think it would be best to ignore the Accept header.

    question 
    opened by mphasize 2
  • Travis-CI error

    Travis-CI error

    While building on Travis-CI it fails. Can't reproduce locally.

    UPD Maybe it's Laravel/Travis problem. Other Travis rebuild gave another error (below)

    Log from Travis

    > php artisan clear-compiled
    PHP Fatal error:  Call to a member function set() on a non-object in /home/travis/build/neomerx/limoncello-collins/vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/LoadConfiguration.php on line 56
    PHP Stack trace:
    PHP   1. {main}() /home/travis/build/neomerx/limoncello-collins/artisan:0
    PHP   2. Illuminate\Foundation\Console\Kernel->handle() /home/travis/build/neomerx/limoncello-collins/artisan:36
    PHP   3. Illuminate\Foundation\Console\Kernel->bootstrap() /home/travis/build/neomerx/limoncello-collins/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php:98
    PHP   4. Illuminate\Foundation\Application->bootstrapWith() /home/travis/build/neomerx/limoncello-collins/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php:206
    PHP   5. Illuminate\Foundation\Bootstrap\LoadConfiguration->bootstrap() /home/travis/build/neomerx/limoncello-collins/vendor/laravel/framework/src/Illuminate/Foundation/Application.php:203
    PHP   6. Illuminate\Foundation\Bootstrap\LoadConfiguration->loadConfigurationFiles() /home/travis/build/neomerx/limoncello-collins/vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/LoadConfiguration.php:38
    

    Another log on for the same source code

    > php artisan clear-compiled
    Fatal error: Uncaught exception 'ReflectionException' with message 'Class log does not exist' in :
    Stack trace:
    #0 /home/travis/build/neomerx/limoncello-collins/vendor/laravel/framework/src/Illuminate/Container/Container.php(736): ReflectionClass->__construct()
    #1 /home/travis/build/neomerx/limoncello-collins/vendor/laravel/framework/src/Illuminate/Container/Container.php(626): Illuminate\Container\Container->build()
    #2 /home/travis/build/neomerx/limoncello-collins/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(674): Illuminate\Container\Container->make()
    #3 /home/travis/build/neomerx/limoncello-collins/vendor/laravel/framework/src/Illuminate/Container/Container.php(837): Illuminate\Foundation\Application->make()
    #4 /home/travis/build/neomerx/limoncello-collins/vendor/laravel/framework/src/Illuminate/Container/Container.php(800): Illuminate\Container\Container->resolveClass()
    #5 /home/travis/build/neomerx/limoncello-collins/vendor/laravel/framework/src/Illuminate/Container/Container.php(771): Illuminate\Container\Container->getDependencies()
    #6 /home/travis/build/neomerx/limoncello-collins/vendor/laravel/framework/src/Illuminate/Container/Container.php(626): Illuminate\Container\Container->build()
    #7 /home/travis/build/neomerx/limoncello-collins/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(674): Illuminate\Container\Container->make()
    #8 /home/travis/build/neomerx/limoncello-collins/vendor/laravel/framework/src/Illuminate/Container/Container.php(216): Illuminate\Foundation\Application->make()
    #9 /home/travis/build/neomerx/limoncello-collins/vendor/laravel/framework/src/Illuminate/Container/Container.php(733): {closure}()
    #10 /home/travis/build/neomerx/limoncello-collins/vendor/laravel/framework/src/Illuminate/Container/Container.php(626): Illuminate\Container\Container->build()
    #11 /home/travis/build/neomerx/limoncello-collins/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(674): Illuminate\Container\Container->make()
    #12 /home/travis/build/neomerx/limoncello-collins/vendor/laravel/framework/src/Illuminate/Container/Container.php(1157): Illuminate\Foundation\Application->make()
    #13 /home/travis/build/neomerx/limoncello-collins/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(245): Illuminate\Container\Container->offsetGet()
    #14 /home/travis/build/neomerx/limoncello-collins/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(102): Illuminate\Foundation\Console\Kernel->reportException()
    #15 /home/travis/build/neomerx/limoncello-collins/artisan(36): Illuminate\Foundation\Console\Kernel->handle()
    #16 {main}
    
    bug question 
    opened by neomerx 2
  • Laravel v8 Support

    Laravel v8 Support

    cors-illuminate doesn't work with Laravel 8, because of a change in behaviour in symfony/http-foundation. I will put a PR together to fix the issue 😄

    opened by Toyinster 0
Releases(v3.0.0)
Owner
null
Trait for multilingual resource file support

⚡ Usage This library supports MultilingualResourceTrait which can be used in PluginBase. Multilingual support of resource files is possible using this

PocketMine-MP projects of PresentKim 1 Jun 7, 2022
📦 Adds Laravel Packages Support to Lumen and Vendor Publish Artisan Command.

Laravel Package Support for Lumen: Makes Lumen compatible with Laravel Packages. You can use any Laravel Packages in Lumen by installing Larasupport Package.

Irfaq Syed 127 Dec 17, 2022
Symfony bundle that provides Cross Site Request Forgery (CSRF or XSRF) protection for client-side applications

CSRF Cookie Bundle This Symfony bundle provides Cross Site Request Forgery (CSRF or XSRF) protection for client-side applications requesting endpoints

David Neustadt 8 Nov 28, 2022
PHP components - collection of cross-project PHP classes

PHP components Collection of cross-project PHP classes. Install: $ composer require ansas/php-component Ansas\Component\Convert\ConvertPrice Convert "

null 1 Jan 5, 2022
Lightweight JSON:API resource for Laravel

JSON:API Resource for Laravel A lightweight Laravel implementation of JSON:API. This is a WIP project currently being built out via livestream on my Y

Tim MacDonald 241 Jan 5, 2023
⚙️Laravel Nova Resource for a simple key/value typed setting

Laravel Nova Resource for a simple key/value typed setting Administer your Laravel Simple Setting in Nova Pre-requisites This Nova resource package re

elipZis 5 Nov 7, 2022
This package provides a Filament resource to view all Laravel sent emails.

This package provides a Filament resource to view all Laravel outgoing emails. It also provides a Model for the database stored emails. Installation Y

Ramón E. Zayas 22 Jan 2, 2023
Simply define the permission in the filament resource.

Simply define the permissions in the filament resource. Easily define permissions for Filament Resources & Relation Managers Installation You can inst

Ziyaan 8 Nov 16, 2022
Laravel-FCM is an easy to use package working with both Laravel and Lumen for sending push notification with Firebase Cloud Messaging (FCM).

Laravel-FCM Introduction Laravel-FCM is an easy to use package working with both Laravel and Lumen for sending push notification with Firebase Cloud M

Rahul Thapa 2 Oct 16, 2022
Laravel Responder - a package for building API responses, integrating Fractal into Laravel and Lumen

A Laravel Fractal package for building API responses, giving you the power of Fractal with Laravel's elegancy.

Alexander Tømmerås 776 Dec 25, 2022
A collection of generators for Lumen and Laravel 5.

Lumen generators A collection of generators for Lumen and Laravel 5. Contents Why ? Installation Quick Usage Detailed Usage Model Generator Migration

Amine Ben hammou 349 Mar 24, 2022
A Laravel and Lumen Badges Generator

Laravel and Lumen Badge Generator That package is a easy wrapper to Badges/Poser. #Installing composer require vluzrmos/laravel-badge-poser Laravel co

Vagner Luz do Carmo 6 Jun 10, 2020
Laravel and Lumen Auto Hard Deleter

Laravel Auto Hard Deleter This package deletes soft deleted rows automatically after a time interval that you define. For Laravel and Lumen 6, 7, 8 In

Siavash Bamshadnia 38 Dec 28, 2022
Cascade delete and restore when using the Laravel or Lumen SoftDeletes feature.

Cascade delete and restore when using the Laravel or Lumen SoftDeletes feature.

Asked.io 669 Nov 30, 2022
Public API for the project coding.events. Made in PHP 8.0 with Lumen 8, PHP-FPM, NGINX and MySQL 8.

coding.events API Uma API feita apenas para passar o tempo, montando uma API para o site <coding.events>. Sinta-se livre para usar esse código como es

Kaique Garcia 3 Oct 9, 2022
Provides a Eloquent query builder for Laravel or Lumen

This package provides an advanced filter for Laravel or Lumen model based on incoming requets.

M.Fouladgar 484 Jan 4, 2023
Laravel Lumen service provider for Understand.io

The service provider is deprecated - it does not support error grouping. Laravel Lumen service provider for Understand.io You may also be interested i

null 6 May 30, 2019
🔐 JSON Web Token Authentication for Laravel & Lumen

Documentation Documentation for 1.* here For version 0.5.* See the WIKI for documentation. Supported by Auth0 If you want to easily add secure authent

Sean Tymon 10.7k Jan 3, 2023
Simple Video is a automated H264 encryption system built on Lumen Laravel Framework

Simple Video is a automated H264 encryption system built on Lumen Laravel Framework

Azril Nazli Alias 4 Oct 5, 2022