├── .gitignore ├── src ├── config.php ├── Guard.php ├── FirebaseAuthServiceProvider.php ├── User.php └── Middleware │ └── JWTAuth.php ├── composer.json ├── LICENSE ├── README.md └── composer.lock /.gitignore: -------------------------------------------------------------------------------- 1 | /vendor -------------------------------------------------------------------------------- /src/config.php: -------------------------------------------------------------------------------- 1 | env('FIREBASE_PROJECT_ID'), 5 | ]; -------------------------------------------------------------------------------- /src/Guard.php: -------------------------------------------------------------------------------- 1 | verifier = $verifier; 14 | } 15 | 16 | public function user($request) 17 | { 18 | $token = $request->bearerToken(); 19 | try { 20 | $token = $this->verifier->verifyIdToken($token); 21 | return new User($token->getClaims()); 22 | } 23 | catch (\Exception $e) { 24 | return; 25 | } 26 | } 27 | } -------------------------------------------------------------------------------- /src/FirebaseAuthServiceProvider.php: -------------------------------------------------------------------------------- 1 | publishes([ 18 | __DIR__ . '/config.php' => config_path('firebase.php'), 19 | ]); 20 | } 21 | 22 | /** 23 | * Register bindings in the container. 24 | * 25 | * @return void 26 | */ 27 | public function register() 28 | { 29 | $this->app->singleton(Verifier::class, function ($app) { 30 | return new Verifier(config('firebase.project_id')); 31 | }); 32 | } 33 | 34 | } -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "csrui/laravel-firebase-auth", 3 | "description": "Secure your laravel API with Google Firebase Auth", 4 | "license": "MIT", 5 | "type": "library", 6 | "authors": [ 7 | { 8 | "name": "Rui Sardinha", 9 | "email": "mail@ruisardinha.com" 10 | } 11 | ], 12 | "minimum-stability": "stable", 13 | "require": { 14 | "php": ">=7.0", 15 | "kreait/firebase-tokens": "^1.7", 16 | "illuminate/support": "^5.7", 17 | "illuminate/contracts": "^5.7" 18 | }, 19 | "require-dev": { 20 | }, 21 | "autoload": { 22 | "psr-4": { 23 | "csrui\\LaravelFirebaseAuth\\": "src/" 24 | } 25 | }, 26 | "autoload-dev": { 27 | "psr-4": { 28 | "csrui\\LaravelFirebaseAuth\\Test\\": "tests/" 29 | } 30 | }, 31 | "extra": { 32 | "laravel": { 33 | "providers": [ 34 | "csrui\\LaravelFirebaseAuth\\FirebaseAuthServiceProvider" 35 | ] 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Rui Sardinha 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # laravel-firebase-auth 2 | Secure your laravel API with Google Firebase Auth 3 | 4 | Adding the *Middleware* to your API will ensure that access is granted only using a valid Bearer Token issues by Goggle Firebase Auth. 5 | 6 | ## Install 7 | 8 | ```bash 9 | composer require csrui/laravel-firebase-auth 10 | ``` 11 | 12 | Publish the package's config. 13 | 14 | ```bash 15 | php artisan vendor:publish 16 | ``` 17 | 18 | This will add a firebase.php config file where you need to add you Firebase **Project ID**. 19 | 20 | ## How to use 21 | 22 | There are two ways to use this. 23 | 24 | ### 1. Lock access without JWT token 25 | 26 | Add the *Middleware* on your *Kernel.php* file. 27 | 28 | ```php 29 | \csrui\LaravelFirebaseAuth\Middleware\JWTAuth::class, 30 | ``` 31 | 32 | ### 2. Lock access and identify the client requester 33 | 34 | Add the Service Provider to your config/app.php 35 | 36 | ```php 37 | csrui\LaravelFirebaseAuth\FirebaseAuthServiceProvider::class, 38 | ``` 39 | 40 | Register your new Guard on you AuthServiceProvider.php 41 | 42 | ```php 43 | $this->app['auth']->viaRequest('firebase', function ($request) { 44 | return app(\csrui\LaravelFirebaseAuth\Guard::class)->user($request); 45 | }); 46 | ``` 47 | 48 | Now on you auth.php configure you Guard driver to 'firebase'. 49 | 50 | ```php 51 | 'providers' => [ 52 | 'users' => [ 53 | 'driver' => 'firebase', 54 | 'model' => \csrui\LaravelFirebaseAuth\User::class, 55 | ], 56 | ], 57 | ``` 58 | 59 | TODO: Improve examples 60 | 61 | ## Support 62 | 63 | Feel free to open issues and provide feedback. -------------------------------------------------------------------------------- /src/User.php: -------------------------------------------------------------------------------- 1 | claims = $claims; 22 | } 23 | 24 | /** 25 | * Get the name of the unique identifier for the user. 26 | * 27 | * @return string 28 | */ 29 | public function getAuthIdentifierName() 30 | { 31 | return 'sub'; 32 | } 33 | 34 | /** 35 | * Get the unique identifier for the user. 36 | * 37 | * @return mixed 38 | */ 39 | public function getAuthIdentifier() 40 | { 41 | return (string) $this->claims['sub']; 42 | } 43 | 44 | /** 45 | * Get the password for the user. 46 | * 47 | * @return string 48 | */ 49 | public function getAuthPassword() 50 | { 51 | throw new \Exception('No password for Firebase User'); 52 | } 53 | 54 | /** 55 | * Get the token value for the "remember me" session. 56 | * 57 | * @return string 58 | */ 59 | public function getRememberToken() 60 | { 61 | throw new \Exception('No remember token for Firebase User'); 62 | } 63 | 64 | /** 65 | * Set the token value for the "remember me" session. 66 | * 67 | * @param string $value 68 | * 69 | * @return void 70 | */ 71 | public function setRememberToken($value) 72 | { 73 | throw new \Exception('No remember token for Firebase User'); 74 | } 75 | 76 | /** 77 | * Get the column name for the "remember me" token. 78 | * 79 | * @return string 80 | */ 81 | public function getRememberTokenName() 82 | { 83 | throw new \Exception('No remember token for Firebase User'); 84 | } 85 | } -------------------------------------------------------------------------------- /src/Middleware/JWTAuth.php: -------------------------------------------------------------------------------- 1 | hasHeader('Authorization')) { 20 | return response()->json('Authorization Header not found', 401); 21 | } 22 | 23 | $token = $request->bearerToken(); 24 | 25 | if($request->header('Authorization') == null || $token == null) { 26 | return response()->json('No token provided', 401); 27 | } 28 | 29 | $validation = $this->retrieveAndValidateToken($token); 30 | 31 | if ($validation !== true) 32 | { 33 | return $validation; 34 | } 35 | 36 | return $next($request); 37 | } 38 | 39 | public function retrieveAndValidateToken($token) 40 | { 41 | 42 | // TODO: Check the sintax on the config retreival 43 | $project_id = config('firebase.project_id'); 44 | 45 | if (empty($project_id)) 46 | { 47 | throw new \Exception('Missing FIREBASE_PROJECT_ID', 1); 48 | } 49 | 50 | $verifier = new Verifier($project_id); 51 | 52 | try { 53 | $verifiedIdToken = $verifier->verifyIdToken($token); 54 | return true; 55 | } catch (\Firebase\Auth\Token\Exception\UnknownKey $e) { 56 | return response()->json($e->getMessage(), 401); 57 | } catch (\Firebase\Auth\Token\Exception\ExpiredToken $e) { 58 | return response()->json($e->getMessage(), 401); 59 | } catch (\Firebase\Auth\Token\Exception\IssuedInTheFuture $e) { 60 | return response()->json($e->getMessage(), 401); 61 | } catch (\Firebase\Auth\Token\Exception\InvalidToken $e) { 62 | return response()->json($e->getMessage(), 401); 63 | } 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", 5 | "This file is @generated automatically" 6 | ], 7 | "content-hash": "0bcbf133321d4b6f931d0b86cfb9319a", 8 | "packages": [ 9 | { 10 | "name": "doctrine/inflector", 11 | "version": "v1.3.0", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/doctrine/inflector.git", 15 | "reference": "5527a48b7313d15261292c149e55e26eae771b0a" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/doctrine/inflector/zipball/5527a48b7313d15261292c149e55e26eae771b0a", 20 | "reference": "5527a48b7313d15261292c149e55e26eae771b0a", 21 | "shasum": "" 22 | }, 23 | "require": { 24 | "php": "^7.1" 25 | }, 26 | "require-dev": { 27 | "phpunit/phpunit": "^6.2" 28 | }, 29 | "type": "library", 30 | "extra": { 31 | "branch-alias": { 32 | "dev-master": "1.3.x-dev" 33 | } 34 | }, 35 | "autoload": { 36 | "psr-4": { 37 | "Doctrine\\Common\\Inflector\\": "lib/Doctrine/Common/Inflector" 38 | } 39 | }, 40 | "notification-url": "https://packagist.org/downloads/", 41 | "license": [ 42 | "MIT" 43 | ], 44 | "authors": [ 45 | { 46 | "name": "Roman Borschel", 47 | "email": "roman@code-factory.org" 48 | }, 49 | { 50 | "name": "Benjamin Eberlei", 51 | "email": "kontakt@beberlei.de" 52 | }, 53 | { 54 | "name": "Guilherme Blanco", 55 | "email": "guilhermeblanco@gmail.com" 56 | }, 57 | { 58 | "name": "Jonathan Wage", 59 | "email": "jonwage@gmail.com" 60 | }, 61 | { 62 | "name": "Johannes Schmitt", 63 | "email": "schmittjoh@gmail.com" 64 | } 65 | ], 66 | "description": "Common String Manipulations with regard to casing and singular/plural rules.", 67 | "homepage": "http://www.doctrine-project.org", 68 | "keywords": [ 69 | "inflection", 70 | "pluralize", 71 | "singularize", 72 | "string" 73 | ], 74 | "time": "2018-01-09T20:05:19+00:00" 75 | }, 76 | { 77 | "name": "fig/http-message-util", 78 | "version": "1.1.3", 79 | "source": { 80 | "type": "git", 81 | "url": "https://github.com/php-fig/http-message-util.git", 82 | "reference": "35b19404371b31b3a43823c755398c48c9966db4" 83 | }, 84 | "dist": { 85 | "type": "zip", 86 | "url": "https://api.github.com/repos/php-fig/http-message-util/zipball/35b19404371b31b3a43823c755398c48c9966db4", 87 | "reference": "35b19404371b31b3a43823c755398c48c9966db4", 88 | "shasum": "" 89 | }, 90 | "require": { 91 | "php": "^5.3 || ^7.0", 92 | "psr/http-message": "^1.0" 93 | }, 94 | "type": "library", 95 | "extra": { 96 | "branch-alias": { 97 | "dev-master": "1.1.x-dev" 98 | } 99 | }, 100 | "autoload": { 101 | "psr-4": { 102 | "Fig\\Http\\Message\\": "src/" 103 | } 104 | }, 105 | "notification-url": "https://packagist.org/downloads/", 106 | "license": [ 107 | "MIT" 108 | ], 109 | "authors": [ 110 | { 111 | "name": "PHP-FIG", 112 | "homepage": "http://www.php-fig.org/" 113 | } 114 | ], 115 | "description": "Utility classes and constants for use with PSR-7 (psr/http-message)", 116 | "keywords": [ 117 | "http", 118 | "http-message", 119 | "psr", 120 | "psr-7", 121 | "request", 122 | "response" 123 | ], 124 | "time": "2018-11-19T16:19:58+00:00" 125 | }, 126 | { 127 | "name": "guzzlehttp/guzzle", 128 | "version": "6.3.3", 129 | "source": { 130 | "type": "git", 131 | "url": "https://github.com/guzzle/guzzle.git", 132 | "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba" 133 | }, 134 | "dist": { 135 | "type": "zip", 136 | "url": "https://api.github.com/repos/guzzle/guzzle/zipball/407b0cb880ace85c9b63c5f9551db498cb2d50ba", 137 | "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba", 138 | "shasum": "" 139 | }, 140 | "require": { 141 | "guzzlehttp/promises": "^1.0", 142 | "guzzlehttp/psr7": "^1.4", 143 | "php": ">=5.5" 144 | }, 145 | "require-dev": { 146 | "ext-curl": "*", 147 | "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", 148 | "psr/log": "^1.0" 149 | }, 150 | "suggest": { 151 | "psr/log": "Required for using the Log middleware" 152 | }, 153 | "type": "library", 154 | "extra": { 155 | "branch-alias": { 156 | "dev-master": "6.3-dev" 157 | } 158 | }, 159 | "autoload": { 160 | "files": [ 161 | "src/functions_include.php" 162 | ], 163 | "psr-4": { 164 | "GuzzleHttp\\": "src/" 165 | } 166 | }, 167 | "notification-url": "https://packagist.org/downloads/", 168 | "license": [ 169 | "MIT" 170 | ], 171 | "authors": [ 172 | { 173 | "name": "Michael Dowling", 174 | "email": "mtdowling@gmail.com", 175 | "homepage": "https://github.com/mtdowling" 176 | } 177 | ], 178 | "description": "Guzzle is a PHP HTTP client library", 179 | "homepage": "http://guzzlephp.org/", 180 | "keywords": [ 181 | "client", 182 | "curl", 183 | "framework", 184 | "http", 185 | "http client", 186 | "rest", 187 | "web service" 188 | ], 189 | "time": "2018-04-22T15:46:56+00:00" 190 | }, 191 | { 192 | "name": "guzzlehttp/promises", 193 | "version": "v1.3.1", 194 | "source": { 195 | "type": "git", 196 | "url": "https://github.com/guzzle/promises.git", 197 | "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646" 198 | }, 199 | "dist": { 200 | "type": "zip", 201 | "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646", 202 | "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646", 203 | "shasum": "" 204 | }, 205 | "require": { 206 | "php": ">=5.5.0" 207 | }, 208 | "require-dev": { 209 | "phpunit/phpunit": "^4.0" 210 | }, 211 | "type": "library", 212 | "extra": { 213 | "branch-alias": { 214 | "dev-master": "1.4-dev" 215 | } 216 | }, 217 | "autoload": { 218 | "psr-4": { 219 | "GuzzleHttp\\Promise\\": "src/" 220 | }, 221 | "files": [ 222 | "src/functions_include.php" 223 | ] 224 | }, 225 | "notification-url": "https://packagist.org/downloads/", 226 | "license": [ 227 | "MIT" 228 | ], 229 | "authors": [ 230 | { 231 | "name": "Michael Dowling", 232 | "email": "mtdowling@gmail.com", 233 | "homepage": "https://github.com/mtdowling" 234 | } 235 | ], 236 | "description": "Guzzle promises library", 237 | "keywords": [ 238 | "promise" 239 | ], 240 | "time": "2016-12-20T10:07:11+00:00" 241 | }, 242 | { 243 | "name": "guzzlehttp/psr7", 244 | "version": "1.5.2", 245 | "source": { 246 | "type": "git", 247 | "url": "https://github.com/guzzle/psr7.git", 248 | "reference": "9f83dded91781a01c63574e387eaa769be769115" 249 | }, 250 | "dist": { 251 | "type": "zip", 252 | "url": "https://api.github.com/repos/guzzle/psr7/zipball/9f83dded91781a01c63574e387eaa769be769115", 253 | "reference": "9f83dded91781a01c63574e387eaa769be769115", 254 | "shasum": "" 255 | }, 256 | "require": { 257 | "php": ">=5.4.0", 258 | "psr/http-message": "~1.0", 259 | "ralouphie/getallheaders": "^2.0.5" 260 | }, 261 | "provide": { 262 | "psr/http-message-implementation": "1.0" 263 | }, 264 | "require-dev": { 265 | "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8" 266 | }, 267 | "type": "library", 268 | "extra": { 269 | "branch-alias": { 270 | "dev-master": "1.5-dev" 271 | } 272 | }, 273 | "autoload": { 274 | "psr-4": { 275 | "GuzzleHttp\\Psr7\\": "src/" 276 | }, 277 | "files": [ 278 | "src/functions_include.php" 279 | ] 280 | }, 281 | "notification-url": "https://packagist.org/downloads/", 282 | "license": [ 283 | "MIT" 284 | ], 285 | "authors": [ 286 | { 287 | "name": "Michael Dowling", 288 | "email": "mtdowling@gmail.com", 289 | "homepage": "https://github.com/mtdowling" 290 | }, 291 | { 292 | "name": "Tobias Schultze", 293 | "homepage": "https://github.com/Tobion" 294 | } 295 | ], 296 | "description": "PSR-7 message implementation that also provides common utility methods", 297 | "keywords": [ 298 | "http", 299 | "message", 300 | "psr-7", 301 | "request", 302 | "response", 303 | "stream", 304 | "uri", 305 | "url" 306 | ], 307 | "time": "2018-12-04T20:46:45+00:00" 308 | }, 309 | { 310 | "name": "illuminate/contracts", 311 | "version": "v5.7.22", 312 | "source": { 313 | "type": "git", 314 | "url": "https://github.com/illuminate/contracts.git", 315 | "reference": "3d67e2d7c9087ae3a2a53d9b102697e5f482d6d0" 316 | }, 317 | "dist": { 318 | "type": "zip", 319 | "url": "https://api.github.com/repos/illuminate/contracts/zipball/3d67e2d7c9087ae3a2a53d9b102697e5f482d6d0", 320 | "reference": "3d67e2d7c9087ae3a2a53d9b102697e5f482d6d0", 321 | "shasum": "" 322 | }, 323 | "require": { 324 | "php": "^7.1.3", 325 | "psr/container": "^1.0", 326 | "psr/simple-cache": "^1.0" 327 | }, 328 | "type": "library", 329 | "extra": { 330 | "branch-alias": { 331 | "dev-master": "5.7-dev" 332 | } 333 | }, 334 | "autoload": { 335 | "psr-4": { 336 | "Illuminate\\Contracts\\": "" 337 | } 338 | }, 339 | "notification-url": "https://packagist.org/downloads/", 340 | "license": [ 341 | "MIT" 342 | ], 343 | "authors": [ 344 | { 345 | "name": "Taylor Otwell", 346 | "email": "taylor@laravel.com" 347 | } 348 | ], 349 | "description": "The Illuminate Contracts package.", 350 | "homepage": "https://laravel.com", 351 | "time": "2019-01-09T10:34:49+00:00" 352 | }, 353 | { 354 | "name": "illuminate/support", 355 | "version": "v5.7.22", 356 | "source": { 357 | "type": "git", 358 | "url": "https://github.com/illuminate/support.git", 359 | "reference": "ea3f30dd824bba52bcff4290dc7431b0ffb478e1" 360 | }, 361 | "dist": { 362 | "type": "zip", 363 | "url": "https://api.github.com/repos/illuminate/support/zipball/ea3f30dd824bba52bcff4290dc7431b0ffb478e1", 364 | "reference": "ea3f30dd824bba52bcff4290dc7431b0ffb478e1", 365 | "shasum": "" 366 | }, 367 | "require": { 368 | "doctrine/inflector": "^1.1", 369 | "ext-mbstring": "*", 370 | "illuminate/contracts": "5.7.*", 371 | "nesbot/carbon": "^1.26.3", 372 | "php": "^7.1.3" 373 | }, 374 | "conflict": { 375 | "tightenco/collect": "<5.5.33" 376 | }, 377 | "suggest": { 378 | "illuminate/filesystem": "Required to use the composer class (5.7.*).", 379 | "moontoast/math": "Required to use ordered UUIDs (^1.1).", 380 | "ramsey/uuid": "Required to use Str::uuid() (^3.7).", 381 | "symfony/process": "Required to use the composer class (^4.1).", 382 | "symfony/var-dumper": "Required to use the dd function (^4.1)." 383 | }, 384 | "type": "library", 385 | "extra": { 386 | "branch-alias": { 387 | "dev-master": "5.7-dev" 388 | } 389 | }, 390 | "autoload": { 391 | "psr-4": { 392 | "Illuminate\\Support\\": "" 393 | }, 394 | "files": [ 395 | "helpers.php" 396 | ] 397 | }, 398 | "notification-url": "https://packagist.org/downloads/", 399 | "license": [ 400 | "MIT" 401 | ], 402 | "authors": [ 403 | { 404 | "name": "Taylor Otwell", 405 | "email": "taylor@laravel.com" 406 | } 407 | ], 408 | "description": "The Illuminate Support package.", 409 | "homepage": "https://laravel.com", 410 | "time": "2019-01-07T13:39:07+00:00" 411 | }, 412 | { 413 | "name": "kreait/firebase-tokens", 414 | "version": "1.7.2", 415 | "source": { 416 | "type": "git", 417 | "url": "https://github.com/kreait/firebase-tokens-php.git", 418 | "reference": "a300c7dc17d83b1a19af7519c65612c5124d177e" 419 | }, 420 | "dist": { 421 | "type": "zip", 422 | "url": "https://api.github.com/repos/kreait/firebase-tokens-php/zipball/a300c7dc17d83b1a19af7519c65612c5124d177e", 423 | "reference": "a300c7dc17d83b1a19af7519c65612c5124d177e", 424 | "shasum": "" 425 | }, 426 | "require": { 427 | "fig/http-message-util": "^1.1", 428 | "guzzlehttp/guzzle": "^6.2.1", 429 | "lcobucci/jwt": "^3.2", 430 | "php": "^7.0", 431 | "psr/simple-cache": "^1.0" 432 | }, 433 | "require-dev": { 434 | "friendsofphp/php-cs-fixer": "^2.0", 435 | "phpstan/phpstan-phpunit": "^0.9.3", 436 | "phpunit/phpunit": "^6.0" 437 | }, 438 | "type": "library", 439 | "autoload": { 440 | "psr-4": { 441 | "Firebase\\Auth\\Token\\": "src" 442 | } 443 | }, 444 | "notification-url": "https://packagist.org/downloads/", 445 | "license": [ 446 | "MIT" 447 | ], 448 | "authors": [ 449 | { 450 | "name": "Jérôme Gamez", 451 | "homepage": "https://github.com/jeromegamez" 452 | } 453 | ], 454 | "description": "A library to work with Firebase tokens", 455 | "homepage": "https://github.com/kreait/firebase-token-php", 456 | "keywords": [ 457 | "Authentication", 458 | "auth", 459 | "firebase", 460 | "google", 461 | "token" 462 | ], 463 | "time": "2018-10-26T22:01:30+00:00" 464 | }, 465 | { 466 | "name": "lcobucci/jwt", 467 | "version": "3.2.5", 468 | "source": { 469 | "type": "git", 470 | "url": "https://github.com/lcobucci/jwt.git", 471 | "reference": "82be04b4753f8b7693b62852b7eab30f97524f9b" 472 | }, 473 | "dist": { 474 | "type": "zip", 475 | "url": "https://api.github.com/repos/lcobucci/jwt/zipball/82be04b4753f8b7693b62852b7eab30f97524f9b", 476 | "reference": "82be04b4753f8b7693b62852b7eab30f97524f9b", 477 | "shasum": "" 478 | }, 479 | "require": { 480 | "ext-openssl": "*", 481 | "php": ">=5.5" 482 | }, 483 | "require-dev": { 484 | "mdanter/ecc": "~0.3.1", 485 | "mikey179/vfsstream": "~1.5", 486 | "phpmd/phpmd": "~2.2", 487 | "phpunit/php-invoker": "~1.1", 488 | "phpunit/phpunit": "~4.5", 489 | "squizlabs/php_codesniffer": "~2.3" 490 | }, 491 | "suggest": { 492 | "mdanter/ecc": "Required to use Elliptic Curves based algorithms." 493 | }, 494 | "type": "library", 495 | "extra": { 496 | "branch-alias": { 497 | "dev-master": "3.1-dev" 498 | } 499 | }, 500 | "autoload": { 501 | "psr-4": { 502 | "Lcobucci\\JWT\\": "src" 503 | } 504 | }, 505 | "notification-url": "https://packagist.org/downloads/", 506 | "license": [ 507 | "BSD-3-Clause" 508 | ], 509 | "authors": [ 510 | { 511 | "name": "Luís Otávio Cobucci Oblonczyk", 512 | "email": "lcobucci@gmail.com", 513 | "role": "Developer" 514 | } 515 | ], 516 | "description": "A simple library to work with JSON Web Token and JSON Web Signature", 517 | "keywords": [ 518 | "JWS", 519 | "jwt" 520 | ], 521 | "time": "2018-11-11T12:22:26+00:00" 522 | }, 523 | { 524 | "name": "nesbot/carbon", 525 | "version": "1.36.2", 526 | "source": { 527 | "type": "git", 528 | "url": "https://github.com/briannesbitt/Carbon.git", 529 | "reference": "cd324b98bc30290f233dd0e75e6ce49f7ab2a6c9" 530 | }, 531 | "dist": { 532 | "type": "zip", 533 | "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/cd324b98bc30290f233dd0e75e6ce49f7ab2a6c9", 534 | "reference": "cd324b98bc30290f233dd0e75e6ce49f7ab2a6c9", 535 | "shasum": "" 536 | }, 537 | "require": { 538 | "php": ">=5.3.9", 539 | "symfony/translation": "~2.6 || ~3.0 || ~4.0" 540 | }, 541 | "require-dev": { 542 | "phpunit/phpunit": "^4.8.35 || ^5.7" 543 | }, 544 | "suggest": { 545 | "friendsofphp/php-cs-fixer": "Needed for the `composer phpcs` command. Allow to automatically fix code style.", 546 | "phpstan/phpstan": "Needed for the `composer phpstan` command. Allow to detect potential errors." 547 | }, 548 | "type": "library", 549 | "extra": { 550 | "laravel": { 551 | "providers": [ 552 | "Carbon\\Laravel\\ServiceProvider" 553 | ] 554 | } 555 | }, 556 | "autoload": { 557 | "psr-4": { 558 | "": "src/" 559 | } 560 | }, 561 | "notification-url": "https://packagist.org/downloads/", 562 | "license": [ 563 | "MIT" 564 | ], 565 | "authors": [ 566 | { 567 | "name": "Brian Nesbitt", 568 | "email": "brian@nesbot.com", 569 | "homepage": "http://nesbot.com" 570 | } 571 | ], 572 | "description": "A simple API extension for DateTime.", 573 | "homepage": "http://carbon.nesbot.com", 574 | "keywords": [ 575 | "date", 576 | "datetime", 577 | "time" 578 | ], 579 | "time": "2018-12-28T10:07:33+00:00" 580 | }, 581 | { 582 | "name": "psr/container", 583 | "version": "1.0.0", 584 | "source": { 585 | "type": "git", 586 | "url": "https://github.com/php-fig/container.git", 587 | "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" 588 | }, 589 | "dist": { 590 | "type": "zip", 591 | "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", 592 | "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", 593 | "shasum": "" 594 | }, 595 | "require": { 596 | "php": ">=5.3.0" 597 | }, 598 | "type": "library", 599 | "extra": { 600 | "branch-alias": { 601 | "dev-master": "1.0.x-dev" 602 | } 603 | }, 604 | "autoload": { 605 | "psr-4": { 606 | "Psr\\Container\\": "src/" 607 | } 608 | }, 609 | "notification-url": "https://packagist.org/downloads/", 610 | "license": [ 611 | "MIT" 612 | ], 613 | "authors": [ 614 | { 615 | "name": "PHP-FIG", 616 | "homepage": "http://www.php-fig.org/" 617 | } 618 | ], 619 | "description": "Common Container Interface (PHP FIG PSR-11)", 620 | "homepage": "https://github.com/php-fig/container", 621 | "keywords": [ 622 | "PSR-11", 623 | "container", 624 | "container-interface", 625 | "container-interop", 626 | "psr" 627 | ], 628 | "time": "2017-02-14T16:28:37+00:00" 629 | }, 630 | { 631 | "name": "psr/http-message", 632 | "version": "1.0.1", 633 | "source": { 634 | "type": "git", 635 | "url": "https://github.com/php-fig/http-message.git", 636 | "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" 637 | }, 638 | "dist": { 639 | "type": "zip", 640 | "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", 641 | "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", 642 | "shasum": "" 643 | }, 644 | "require": { 645 | "php": ">=5.3.0" 646 | }, 647 | "type": "library", 648 | "extra": { 649 | "branch-alias": { 650 | "dev-master": "1.0.x-dev" 651 | } 652 | }, 653 | "autoload": { 654 | "psr-4": { 655 | "Psr\\Http\\Message\\": "src/" 656 | } 657 | }, 658 | "notification-url": "https://packagist.org/downloads/", 659 | "license": [ 660 | "MIT" 661 | ], 662 | "authors": [ 663 | { 664 | "name": "PHP-FIG", 665 | "homepage": "http://www.php-fig.org/" 666 | } 667 | ], 668 | "description": "Common interface for HTTP messages", 669 | "homepage": "https://github.com/php-fig/http-message", 670 | "keywords": [ 671 | "http", 672 | "http-message", 673 | "psr", 674 | "psr-7", 675 | "request", 676 | "response" 677 | ], 678 | "time": "2016-08-06T14:39:51+00:00" 679 | }, 680 | { 681 | "name": "psr/simple-cache", 682 | "version": "1.0.1", 683 | "source": { 684 | "type": "git", 685 | "url": "https://github.com/php-fig/simple-cache.git", 686 | "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" 687 | }, 688 | "dist": { 689 | "type": "zip", 690 | "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", 691 | "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", 692 | "shasum": "" 693 | }, 694 | "require": { 695 | "php": ">=5.3.0" 696 | }, 697 | "type": "library", 698 | "extra": { 699 | "branch-alias": { 700 | "dev-master": "1.0.x-dev" 701 | } 702 | }, 703 | "autoload": { 704 | "psr-4": { 705 | "Psr\\SimpleCache\\": "src/" 706 | } 707 | }, 708 | "notification-url": "https://packagist.org/downloads/", 709 | "license": [ 710 | "MIT" 711 | ], 712 | "authors": [ 713 | { 714 | "name": "PHP-FIG", 715 | "homepage": "http://www.php-fig.org/" 716 | } 717 | ], 718 | "description": "Common interfaces for simple caching", 719 | "keywords": [ 720 | "cache", 721 | "caching", 722 | "psr", 723 | "psr-16", 724 | "simple-cache" 725 | ], 726 | "time": "2017-10-23T01:57:42+00:00" 727 | }, 728 | { 729 | "name": "ralouphie/getallheaders", 730 | "version": "2.0.5", 731 | "source": { 732 | "type": "git", 733 | "url": "https://github.com/ralouphie/getallheaders.git", 734 | "reference": "5601c8a83fbba7ef674a7369456d12f1e0d0eafa" 735 | }, 736 | "dist": { 737 | "type": "zip", 738 | "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/5601c8a83fbba7ef674a7369456d12f1e0d0eafa", 739 | "reference": "5601c8a83fbba7ef674a7369456d12f1e0d0eafa", 740 | "shasum": "" 741 | }, 742 | "require": { 743 | "php": ">=5.3" 744 | }, 745 | "require-dev": { 746 | "phpunit/phpunit": "~3.7.0", 747 | "satooshi/php-coveralls": ">=1.0" 748 | }, 749 | "type": "library", 750 | "autoload": { 751 | "files": [ 752 | "src/getallheaders.php" 753 | ] 754 | }, 755 | "notification-url": "https://packagist.org/downloads/", 756 | "license": [ 757 | "MIT" 758 | ], 759 | "authors": [ 760 | { 761 | "name": "Ralph Khattar", 762 | "email": "ralph.khattar@gmail.com" 763 | } 764 | ], 765 | "description": "A polyfill for getallheaders.", 766 | "time": "2016-02-11T07:05:27+00:00" 767 | }, 768 | { 769 | "name": "symfony/contracts", 770 | "version": "v1.0.2", 771 | "source": { 772 | "type": "git", 773 | "url": "https://github.com/symfony/contracts.git", 774 | "reference": "1aa7ab2429c3d594dd70689604b5cf7421254cdf" 775 | }, 776 | "dist": { 777 | "type": "zip", 778 | "url": "https://api.github.com/repos/symfony/contracts/zipball/1aa7ab2429c3d594dd70689604b5cf7421254cdf", 779 | "reference": "1aa7ab2429c3d594dd70689604b5cf7421254cdf", 780 | "shasum": "" 781 | }, 782 | "require": { 783 | "php": "^7.1.3" 784 | }, 785 | "require-dev": { 786 | "psr/cache": "^1.0", 787 | "psr/container": "^1.0" 788 | }, 789 | "suggest": { 790 | "psr/cache": "When using the Cache contracts", 791 | "psr/container": "When using the Service contracts", 792 | "symfony/cache-contracts-implementation": "", 793 | "symfony/service-contracts-implementation": "", 794 | "symfony/translation-contracts-implementation": "" 795 | }, 796 | "type": "library", 797 | "extra": { 798 | "branch-alias": { 799 | "dev-master": "1.0-dev" 800 | } 801 | }, 802 | "autoload": { 803 | "psr-4": { 804 | "Symfony\\Contracts\\": "" 805 | }, 806 | "exclude-from-classmap": [ 807 | "**/Tests/" 808 | ] 809 | }, 810 | "notification-url": "https://packagist.org/downloads/", 811 | "license": [ 812 | "MIT" 813 | ], 814 | "authors": [ 815 | { 816 | "name": "Nicolas Grekas", 817 | "email": "p@tchwork.com" 818 | }, 819 | { 820 | "name": "Symfony Community", 821 | "homepage": "https://symfony.com/contributors" 822 | } 823 | ], 824 | "description": "A set of abstractions extracted out of the Symfony components", 825 | "homepage": "https://symfony.com", 826 | "keywords": [ 827 | "abstractions", 828 | "contracts", 829 | "decoupling", 830 | "interfaces", 831 | "interoperability", 832 | "standards" 833 | ], 834 | "time": "2018-12-05T08:06:11+00:00" 835 | }, 836 | { 837 | "name": "symfony/polyfill-mbstring", 838 | "version": "v1.10.0", 839 | "source": { 840 | "type": "git", 841 | "url": "https://github.com/symfony/polyfill-mbstring.git", 842 | "reference": "c79c051f5b3a46be09205c73b80b346e4153e494" 843 | }, 844 | "dist": { 845 | "type": "zip", 846 | "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/c79c051f5b3a46be09205c73b80b346e4153e494", 847 | "reference": "c79c051f5b3a46be09205c73b80b346e4153e494", 848 | "shasum": "" 849 | }, 850 | "require": { 851 | "php": ">=5.3.3" 852 | }, 853 | "suggest": { 854 | "ext-mbstring": "For best performance" 855 | }, 856 | "type": "library", 857 | "extra": { 858 | "branch-alias": { 859 | "dev-master": "1.9-dev" 860 | } 861 | }, 862 | "autoload": { 863 | "psr-4": { 864 | "Symfony\\Polyfill\\Mbstring\\": "" 865 | }, 866 | "files": [ 867 | "bootstrap.php" 868 | ] 869 | }, 870 | "notification-url": "https://packagist.org/downloads/", 871 | "license": [ 872 | "MIT" 873 | ], 874 | "authors": [ 875 | { 876 | "name": "Nicolas Grekas", 877 | "email": "p@tchwork.com" 878 | }, 879 | { 880 | "name": "Symfony Community", 881 | "homepage": "https://symfony.com/contributors" 882 | } 883 | ], 884 | "description": "Symfony polyfill for the Mbstring extension", 885 | "homepage": "https://symfony.com", 886 | "keywords": [ 887 | "compatibility", 888 | "mbstring", 889 | "polyfill", 890 | "portable", 891 | "shim" 892 | ], 893 | "time": "2018-09-21T13:07:52+00:00" 894 | }, 895 | { 896 | "name": "symfony/translation", 897 | "version": "v4.2.2", 898 | "source": { 899 | "type": "git", 900 | "url": "https://github.com/symfony/translation.git", 901 | "reference": "939fb792d73f2ce80e6ae9019d205fc480f1c9a0" 902 | }, 903 | "dist": { 904 | "type": "zip", 905 | "url": "https://api.github.com/repos/symfony/translation/zipball/939fb792d73f2ce80e6ae9019d205fc480f1c9a0", 906 | "reference": "939fb792d73f2ce80e6ae9019d205fc480f1c9a0", 907 | "shasum": "" 908 | }, 909 | "require": { 910 | "php": "^7.1.3", 911 | "symfony/contracts": "^1.0.2", 912 | "symfony/polyfill-mbstring": "~1.0" 913 | }, 914 | "conflict": { 915 | "symfony/config": "<3.4", 916 | "symfony/dependency-injection": "<3.4", 917 | "symfony/yaml": "<3.4" 918 | }, 919 | "provide": { 920 | "symfony/translation-contracts-implementation": "1.0" 921 | }, 922 | "require-dev": { 923 | "psr/log": "~1.0", 924 | "symfony/config": "~3.4|~4.0", 925 | "symfony/console": "~3.4|~4.0", 926 | "symfony/dependency-injection": "~3.4|~4.0", 927 | "symfony/finder": "~2.8|~3.0|~4.0", 928 | "symfony/intl": "~3.4|~4.0", 929 | "symfony/yaml": "~3.4|~4.0" 930 | }, 931 | "suggest": { 932 | "psr/log-implementation": "To use logging capability in translator", 933 | "symfony/config": "", 934 | "symfony/yaml": "" 935 | }, 936 | "type": "library", 937 | "extra": { 938 | "branch-alias": { 939 | "dev-master": "4.2-dev" 940 | } 941 | }, 942 | "autoload": { 943 | "psr-4": { 944 | "Symfony\\Component\\Translation\\": "" 945 | }, 946 | "exclude-from-classmap": [ 947 | "/Tests/" 948 | ] 949 | }, 950 | "notification-url": "https://packagist.org/downloads/", 951 | "license": [ 952 | "MIT" 953 | ], 954 | "authors": [ 955 | { 956 | "name": "Fabien Potencier", 957 | "email": "fabien@symfony.com" 958 | }, 959 | { 960 | "name": "Symfony Community", 961 | "homepage": "https://symfony.com/contributors" 962 | } 963 | ], 964 | "description": "Symfony Translation Component", 965 | "homepage": "https://symfony.com", 966 | "time": "2019-01-03T09:07:35+00:00" 967 | } 968 | ], 969 | "packages-dev": [], 970 | "aliases": [], 971 | "minimum-stability": "stable", 972 | "stability-flags": [], 973 | "prefer-stable": false, 974 | "prefer-lowest": false, 975 | "platform": { 976 | "php": ">=7.0" 977 | }, 978 | "platform-dev": [] 979 | } 980 | --------------------------------------------------------------------------------