├── .gitignore ├── README.md ├── composer.json ├── composer.lock ├── config └── config.php └── src ├── Broker.php ├── Guard └── SsoGuard.php ├── Middleware └── AttachBroker.php ├── SSOServiceProvider.php └── Server.php /.gitignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | vendor/ 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## About 2 | 3 | This library provides integration between Laravel Framework and SSO (Single Sign-On) [https://en.wikipedia.org/wiki/Single_sign-on](https://en.wikipedia.org/wiki/Single_sign-on). 4 | 5 | ## Get started 6 | 7 | ### Instalation 8 | Execute in shell: 9 | ```sh 10 | composer require codeedu/laravel-sso:0.0.1 11 | ``` 12 | Publish the sso configuration file: 13 | ```sh 14 | php artisan vendor:publish --provider="CodeEdu\LaravelSso\SSOServiceProvider" 15 | ``` 16 | #### Broker Configuration 17 | Set environment variables: 18 | ``` 19 | SSO_SERVER=http://server.address 20 | SSO_BROKER_ID=BROKER ID 21 | SSO_BROKER_SECRET=BROKER SECRET 22 | ``` 23 | Register middleware **CodeEdu\LaravelSso\Middleware\AttachBroker** in **routes** key in **Kernel.php**. 24 | 25 | Register **sso** in **config/auth.php**: 26 | ```php 27 | 'sso' => [ 28 | 'driver' => 'sso', 29 | 'model' => \App\User::class 30 | ] 31 | ``` 32 | 33 | #### Server Configuration 34 | 35 | Set environment variable: 36 | ``` 37 | SSO_TYPE=server 38 | ``` 39 | 40 | Create App\Sso\Server.php: 41 | ```php 42 | 'secret1', 57 | '2' => 'secret2' 58 | ]; 59 | 60 | 61 | /** 62 | * Authenticate using user credentials 63 | * 64 | * @param string $username 65 | * @param string $password 66 | * @return \Jasny\ValidationResult 67 | */ 68 | protected function authenticate($username, $password) 69 | { 70 | if (!\Auth::guard('web')->validate(['email' => $username, 'password' => $password])) { 71 | return ValidationResult::error(trans('auth.failed')); 72 | } 73 | 74 | return ValidationResult::success(); 75 | } 76 | 77 | /** 78 | * Get the secret key and other info of a broker 79 | * 80 | * @param string $brokerId 81 | * @return array 82 | */ 83 | protected function getBrokerInfo($brokerId) 84 | { 85 | return !array_key_exists($brokerId, $this->brokers) ? null : [ 86 | 'id' => $brokerId, 87 | 'secret' => $this->brokers[$brokerId] 88 | ]; 89 | } 90 | 91 | /** 92 | * Get the information about a user 93 | * 94 | * @param string $username 95 | * @return array|object 96 | */ 97 | protected function getUserInfo($username) 98 | { 99 | $user = User::whereEmail($username)->first(); 100 | return !$user ? null : [ 101 | 'user' => $user, 102 | ]; 103 | } 104 | } 105 | ``` 106 | This file will describe how Server SSO identity and authenticate the brokers. More details see: [https://github.com/jasny/sso](https://github.com/jasny/sso) 107 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "codeedu/laravel-sso", 3 | "require": { 4 | "php": "^7.1.3", 5 | "illuminate/session": "~5.5", 6 | "illuminate/cookie": "~5.5", 7 | "illuminate/routing": "~5.5", 8 | "illuminate/validation": "~5.5", 9 | "jasny/sso": "^0.3.0", 10 | "illuminate/cache": "~5.5", 11 | "guzzlehttp/guzzle": "~6.0" 12 | }, 13 | "autoload": { 14 | "psr-4": { 15 | "CodeEdu\\LaravelSso\\": "src/" 16 | } 17 | }, 18 | "extra": { 19 | "laravel": { 20 | "providers": [ 21 | "CodeEdu\\LaravelSso\\SSOServiceProvider" 22 | ] 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /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": "eb44e9cacb54fa9b80650aaa96d4683c", 8 | "packages": [ 9 | { 10 | "name": "desarrolla2/cache", 11 | "version": "v2.1.1", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/desarrolla2/Cache.git", 15 | "reference": "ebd1f7bfd1be605a9b5fbb0a4b25a948a31fe963" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/desarrolla2/Cache/zipball/ebd1f7bfd1be605a9b5fbb0a4b25a948a31fe963", 20 | "reference": "ebd1f7bfd1be605a9b5fbb0a4b25a948a31fe963", 21 | "shasum": "" 22 | }, 23 | "require": { 24 | "php": ">=5.4.0" 25 | }, 26 | "require-dev": { 27 | "predis/predis": "~1.0.0" 28 | }, 29 | "suggest": { 30 | "predis/predis": "Predis support" 31 | }, 32 | "type": "library", 33 | "autoload": { 34 | "psr-4": { 35 | "Desarrolla2\\Cache\\": "src/", 36 | "Desarrolla2\\Test\\Cache\\": "test/" 37 | } 38 | }, 39 | "notification-url": "https://packagist.org/downloads/", 40 | "license": [ 41 | "MIT" 42 | ], 43 | "authors": [ 44 | { 45 | "name": "Daniel González", 46 | "homepage": "http://desarrolla2.com/" 47 | } 48 | ], 49 | "description": "Provides an cache interface for several adapters Apc, Apcu, File, Mongo, Memcache, Memcached, Mysql, Mongo, Redis is supported. New adapters is comming!", 50 | "homepage": "https://github.com/desarrolla2/Cache/", 51 | "keywords": [ 52 | "apc", 53 | "apcu", 54 | "cache", 55 | "file", 56 | "memcache", 57 | "memcached", 58 | "mongo", 59 | "mysql", 60 | "redis" 61 | ], 62 | "time": "2017-01-18T12:58:33+00:00" 63 | }, 64 | { 65 | "name": "doctrine/inflector", 66 | "version": "v1.3.0", 67 | "source": { 68 | "type": "git", 69 | "url": "https://github.com/doctrine/inflector.git", 70 | "reference": "5527a48b7313d15261292c149e55e26eae771b0a" 71 | }, 72 | "dist": { 73 | "type": "zip", 74 | "url": "https://api.github.com/repos/doctrine/inflector/zipball/5527a48b7313d15261292c149e55e26eae771b0a", 75 | "reference": "5527a48b7313d15261292c149e55e26eae771b0a", 76 | "shasum": "" 77 | }, 78 | "require": { 79 | "php": "^7.1" 80 | }, 81 | "require-dev": { 82 | "phpunit/phpunit": "^6.2" 83 | }, 84 | "type": "library", 85 | "extra": { 86 | "branch-alias": { 87 | "dev-master": "1.3.x-dev" 88 | } 89 | }, 90 | "autoload": { 91 | "psr-4": { 92 | "Doctrine\\Common\\Inflector\\": "lib/Doctrine/Common/Inflector" 93 | } 94 | }, 95 | "notification-url": "https://packagist.org/downloads/", 96 | "license": [ 97 | "MIT" 98 | ], 99 | "authors": [ 100 | { 101 | "name": "Roman Borschel", 102 | "email": "roman@code-factory.org" 103 | }, 104 | { 105 | "name": "Benjamin Eberlei", 106 | "email": "kontakt@beberlei.de" 107 | }, 108 | { 109 | "name": "Guilherme Blanco", 110 | "email": "guilhermeblanco@gmail.com" 111 | }, 112 | { 113 | "name": "Jonathan Wage", 114 | "email": "jonwage@gmail.com" 115 | }, 116 | { 117 | "name": "Johannes Schmitt", 118 | "email": "schmittjoh@gmail.com" 119 | } 120 | ], 121 | "description": "Common String Manipulations with regard to casing and singular/plural rules.", 122 | "homepage": "http://www.doctrine-project.org", 123 | "keywords": [ 124 | "inflection", 125 | "pluralize", 126 | "singularize", 127 | "string" 128 | ], 129 | "time": "2018-01-09T20:05:19+00:00" 130 | }, 131 | { 132 | "name": "doctrine/lexer", 133 | "version": "v1.0.1", 134 | "source": { 135 | "type": "git", 136 | "url": "https://github.com/doctrine/lexer.git", 137 | "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c" 138 | }, 139 | "dist": { 140 | "type": "zip", 141 | "url": "https://api.github.com/repos/doctrine/lexer/zipball/83893c552fd2045dd78aef794c31e694c37c0b8c", 142 | "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c", 143 | "shasum": "" 144 | }, 145 | "require": { 146 | "php": ">=5.3.2" 147 | }, 148 | "type": "library", 149 | "extra": { 150 | "branch-alias": { 151 | "dev-master": "1.0.x-dev" 152 | } 153 | }, 154 | "autoload": { 155 | "psr-0": { 156 | "Doctrine\\Common\\Lexer\\": "lib/" 157 | } 158 | }, 159 | "notification-url": "https://packagist.org/downloads/", 160 | "license": [ 161 | "MIT" 162 | ], 163 | "authors": [ 164 | { 165 | "name": "Roman Borschel", 166 | "email": "roman@code-factory.org" 167 | }, 168 | { 169 | "name": "Guilherme Blanco", 170 | "email": "guilhermeblanco@gmail.com" 171 | }, 172 | { 173 | "name": "Johannes Schmitt", 174 | "email": "schmittjoh@gmail.com" 175 | } 176 | ], 177 | "description": "Base library for a lexer that can be used in Top-Down, Recursive Descent Parsers.", 178 | "homepage": "http://www.doctrine-project.org", 179 | "keywords": [ 180 | "lexer", 181 | "parser" 182 | ], 183 | "time": "2014-09-09T13:34:57+00:00" 184 | }, 185 | { 186 | "name": "egulias/email-validator", 187 | "version": "2.1.7", 188 | "source": { 189 | "type": "git", 190 | "url": "https://github.com/egulias/EmailValidator.git", 191 | "reference": "709f21f92707308cdf8f9bcfa1af4cb26586521e" 192 | }, 193 | "dist": { 194 | "type": "zip", 195 | "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/709f21f92707308cdf8f9bcfa1af4cb26586521e", 196 | "reference": "709f21f92707308cdf8f9bcfa1af4cb26586521e", 197 | "shasum": "" 198 | }, 199 | "require": { 200 | "doctrine/lexer": "^1.0.1", 201 | "php": ">= 5.5" 202 | }, 203 | "require-dev": { 204 | "dominicsayers/isemail": "dev-master", 205 | "phpunit/phpunit": "^4.8.35||^5.7||^6.0", 206 | "satooshi/php-coveralls": "^1.0.1" 207 | }, 208 | "suggest": { 209 | "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" 210 | }, 211 | "type": "library", 212 | "extra": { 213 | "branch-alias": { 214 | "dev-master": "2.0.x-dev" 215 | } 216 | }, 217 | "autoload": { 218 | "psr-4": { 219 | "Egulias\\EmailValidator\\": "EmailValidator" 220 | } 221 | }, 222 | "notification-url": "https://packagist.org/downloads/", 223 | "license": [ 224 | "MIT" 225 | ], 226 | "authors": [ 227 | { 228 | "name": "Eduardo Gulias Davis" 229 | } 230 | ], 231 | "description": "A library for validating emails against several RFCs", 232 | "homepage": "https://github.com/egulias/EmailValidator", 233 | "keywords": [ 234 | "email", 235 | "emailvalidation", 236 | "emailvalidator", 237 | "validation", 238 | "validator" 239 | ], 240 | "time": "2018-12-04T22:38:24+00:00" 241 | }, 242 | { 243 | "name": "guzzlehttp/guzzle", 244 | "version": "6.3.3", 245 | "source": { 246 | "type": "git", 247 | "url": "https://github.com/guzzle/guzzle.git", 248 | "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba" 249 | }, 250 | "dist": { 251 | "type": "zip", 252 | "url": "https://api.github.com/repos/guzzle/guzzle/zipball/407b0cb880ace85c9b63c5f9551db498cb2d50ba", 253 | "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba", 254 | "shasum": "" 255 | }, 256 | "require": { 257 | "guzzlehttp/promises": "^1.0", 258 | "guzzlehttp/psr7": "^1.4", 259 | "php": ">=5.5" 260 | }, 261 | "require-dev": { 262 | "ext-curl": "*", 263 | "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", 264 | "psr/log": "^1.0" 265 | }, 266 | "suggest": { 267 | "psr/log": "Required for using the Log middleware" 268 | }, 269 | "type": "library", 270 | "extra": { 271 | "branch-alias": { 272 | "dev-master": "6.3-dev" 273 | } 274 | }, 275 | "autoload": { 276 | "files": [ 277 | "src/functions_include.php" 278 | ], 279 | "psr-4": { 280 | "GuzzleHttp\\": "src/" 281 | } 282 | }, 283 | "notification-url": "https://packagist.org/downloads/", 284 | "license": [ 285 | "MIT" 286 | ], 287 | "authors": [ 288 | { 289 | "name": "Michael Dowling", 290 | "email": "mtdowling@gmail.com", 291 | "homepage": "https://github.com/mtdowling" 292 | } 293 | ], 294 | "description": "Guzzle is a PHP HTTP client library", 295 | "homepage": "http://guzzlephp.org/", 296 | "keywords": [ 297 | "client", 298 | "curl", 299 | "framework", 300 | "http", 301 | "http client", 302 | "rest", 303 | "web service" 304 | ], 305 | "time": "2018-04-22T15:46:56+00:00" 306 | }, 307 | { 308 | "name": "guzzlehttp/promises", 309 | "version": "v1.3.1", 310 | "source": { 311 | "type": "git", 312 | "url": "https://github.com/guzzle/promises.git", 313 | "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646" 314 | }, 315 | "dist": { 316 | "type": "zip", 317 | "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646", 318 | "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646", 319 | "shasum": "" 320 | }, 321 | "require": { 322 | "php": ">=5.5.0" 323 | }, 324 | "require-dev": { 325 | "phpunit/phpunit": "^4.0" 326 | }, 327 | "type": "library", 328 | "extra": { 329 | "branch-alias": { 330 | "dev-master": "1.4-dev" 331 | } 332 | }, 333 | "autoload": { 334 | "psr-4": { 335 | "GuzzleHttp\\Promise\\": "src/" 336 | }, 337 | "files": [ 338 | "src/functions_include.php" 339 | ] 340 | }, 341 | "notification-url": "https://packagist.org/downloads/", 342 | "license": [ 343 | "MIT" 344 | ], 345 | "authors": [ 346 | { 347 | "name": "Michael Dowling", 348 | "email": "mtdowling@gmail.com", 349 | "homepage": "https://github.com/mtdowling" 350 | } 351 | ], 352 | "description": "Guzzle promises library", 353 | "keywords": [ 354 | "promise" 355 | ], 356 | "time": "2016-12-20T10:07:11+00:00" 357 | }, 358 | { 359 | "name": "guzzlehttp/psr7", 360 | "version": "1.5.2", 361 | "source": { 362 | "type": "git", 363 | "url": "https://github.com/guzzle/psr7.git", 364 | "reference": "9f83dded91781a01c63574e387eaa769be769115" 365 | }, 366 | "dist": { 367 | "type": "zip", 368 | "url": "https://api.github.com/repos/guzzle/psr7/zipball/9f83dded91781a01c63574e387eaa769be769115", 369 | "reference": "9f83dded91781a01c63574e387eaa769be769115", 370 | "shasum": "" 371 | }, 372 | "require": { 373 | "php": ">=5.4.0", 374 | "psr/http-message": "~1.0", 375 | "ralouphie/getallheaders": "^2.0.5" 376 | }, 377 | "provide": { 378 | "psr/http-message-implementation": "1.0" 379 | }, 380 | "require-dev": { 381 | "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8" 382 | }, 383 | "type": "library", 384 | "extra": { 385 | "branch-alias": { 386 | "dev-master": "1.5-dev" 387 | } 388 | }, 389 | "autoload": { 390 | "psr-4": { 391 | "GuzzleHttp\\Psr7\\": "src/" 392 | }, 393 | "files": [ 394 | "src/functions_include.php" 395 | ] 396 | }, 397 | "notification-url": "https://packagist.org/downloads/", 398 | "license": [ 399 | "MIT" 400 | ], 401 | "authors": [ 402 | { 403 | "name": "Michael Dowling", 404 | "email": "mtdowling@gmail.com", 405 | "homepage": "https://github.com/mtdowling" 406 | }, 407 | { 408 | "name": "Tobias Schultze", 409 | "homepage": "https://github.com/Tobion" 410 | } 411 | ], 412 | "description": "PSR-7 message implementation that also provides common utility methods", 413 | "keywords": [ 414 | "http", 415 | "message", 416 | "psr-7", 417 | "request", 418 | "response", 419 | "stream", 420 | "uri", 421 | "url" 422 | ], 423 | "time": "2018-12-04T20:46:45+00:00" 424 | }, 425 | { 426 | "name": "illuminate/cache", 427 | "version": "v5.8.9", 428 | "source": { 429 | "type": "git", 430 | "url": "https://github.com/illuminate/cache.git", 431 | "reference": "40463fe8f7f49d3f6cf6cf4aa1759fa76f29b797" 432 | }, 433 | "dist": { 434 | "type": "zip", 435 | "url": "https://api.github.com/repos/illuminate/cache/zipball/40463fe8f7f49d3f6cf6cf4aa1759fa76f29b797", 436 | "reference": "40463fe8f7f49d3f6cf6cf4aa1759fa76f29b797", 437 | "shasum": "" 438 | }, 439 | "require": { 440 | "illuminate/contracts": "5.8.*", 441 | "illuminate/support": "5.8.*", 442 | "php": "^7.1.3" 443 | }, 444 | "suggest": { 445 | "illuminate/database": "Required to use the database cache driver (5.8.*).", 446 | "illuminate/filesystem": "Required to use the file cache driver (5.8.*).", 447 | "illuminate/redis": "Required to use the redis cache driver (5.8.*)." 448 | }, 449 | "type": "library", 450 | "extra": { 451 | "branch-alias": { 452 | "dev-master": "5.8-dev" 453 | } 454 | }, 455 | "autoload": { 456 | "psr-4": { 457 | "Illuminate\\Cache\\": "" 458 | } 459 | }, 460 | "notification-url": "https://packagist.org/downloads/", 461 | "license": [ 462 | "MIT" 463 | ], 464 | "authors": [ 465 | { 466 | "name": "Taylor Otwell", 467 | "email": "taylor@laravel.com" 468 | } 469 | ], 470 | "description": "The Illuminate Cache package.", 471 | "homepage": "https://laravel.com", 472 | "time": "2019-03-28T14:00:15+00:00" 473 | }, 474 | { 475 | "name": "illuminate/container", 476 | "version": "v5.8.9", 477 | "source": { 478 | "type": "git", 479 | "url": "https://github.com/illuminate/container.git", 480 | "reference": "b984960d2634c6be97b0dd368a8953e8c4e06ec7" 481 | }, 482 | "dist": { 483 | "type": "zip", 484 | "url": "https://api.github.com/repos/illuminate/container/zipball/b984960d2634c6be97b0dd368a8953e8c4e06ec7", 485 | "reference": "b984960d2634c6be97b0dd368a8953e8c4e06ec7", 486 | "shasum": "" 487 | }, 488 | "require": { 489 | "illuminate/contracts": "5.8.*", 490 | "illuminate/support": "5.8.*", 491 | "php": "^7.1.3", 492 | "psr/container": "^1.0" 493 | }, 494 | "type": "library", 495 | "extra": { 496 | "branch-alias": { 497 | "dev-master": "5.8-dev" 498 | } 499 | }, 500 | "autoload": { 501 | "psr-4": { 502 | "Illuminate\\Container\\": "" 503 | } 504 | }, 505 | "notification-url": "https://packagist.org/downloads/", 506 | "license": [ 507 | "MIT" 508 | ], 509 | "authors": [ 510 | { 511 | "name": "Taylor Otwell", 512 | "email": "taylor@laravel.com" 513 | } 514 | ], 515 | "description": "The Illuminate Container package.", 516 | "homepage": "https://laravel.com", 517 | "time": "2019-03-03T15:13:35+00:00" 518 | }, 519 | { 520 | "name": "illuminate/contracts", 521 | "version": "v5.8.9", 522 | "source": { 523 | "type": "git", 524 | "url": "https://github.com/illuminate/contracts.git", 525 | "reference": "7224ed316427ae5f67c4888679bbf7f6e7773660" 526 | }, 527 | "dist": { 528 | "type": "zip", 529 | "url": "https://api.github.com/repos/illuminate/contracts/zipball/7224ed316427ae5f67c4888679bbf7f6e7773660", 530 | "reference": "7224ed316427ae5f67c4888679bbf7f6e7773660", 531 | "shasum": "" 532 | }, 533 | "require": { 534 | "php": "^7.1.3", 535 | "psr/container": "^1.0", 536 | "psr/simple-cache": "^1.0" 537 | }, 538 | "type": "library", 539 | "extra": { 540 | "branch-alias": { 541 | "dev-master": "5.8-dev" 542 | } 543 | }, 544 | "autoload": { 545 | "psr-4": { 546 | "Illuminate\\Contracts\\": "" 547 | } 548 | }, 549 | "notification-url": "https://packagist.org/downloads/", 550 | "license": [ 551 | "MIT" 552 | ], 553 | "authors": [ 554 | { 555 | "name": "Taylor Otwell", 556 | "email": "taylor@laravel.com" 557 | } 558 | ], 559 | "description": "The Illuminate Contracts package.", 560 | "homepage": "https://laravel.com", 561 | "time": "2019-03-06T19:39:19+00:00" 562 | }, 563 | { 564 | "name": "illuminate/cookie", 565 | "version": "v5.8.9", 566 | "source": { 567 | "type": "git", 568 | "url": "https://github.com/illuminate/cookie.git", 569 | "reference": "71de5c93d68c524630734294029f8696de7f2967" 570 | }, 571 | "dist": { 572 | "type": "zip", 573 | "url": "https://api.github.com/repos/illuminate/cookie/zipball/71de5c93d68c524630734294029f8696de7f2967", 574 | "reference": "71de5c93d68c524630734294029f8696de7f2967", 575 | "shasum": "" 576 | }, 577 | "require": { 578 | "illuminate/contracts": "5.8.*", 579 | "illuminate/support": "5.8.*", 580 | "php": "^7.1.3", 581 | "symfony/http-foundation": "^4.2", 582 | "symfony/http-kernel": "^4.2" 583 | }, 584 | "type": "library", 585 | "extra": { 586 | "branch-alias": { 587 | "dev-master": "5.8-dev" 588 | } 589 | }, 590 | "autoload": { 591 | "psr-4": { 592 | "Illuminate\\Cookie\\": "" 593 | } 594 | }, 595 | "notification-url": "https://packagist.org/downloads/", 596 | "license": [ 597 | "MIT" 598 | ], 599 | "authors": [ 600 | { 601 | "name": "Taylor Otwell", 602 | "email": "taylor@laravel.com" 603 | } 604 | ], 605 | "description": "The Illuminate Cookie package.", 606 | "homepage": "https://laravel.com", 607 | "time": "2019-02-18T18:37:54+00:00" 608 | }, 609 | { 610 | "name": "illuminate/filesystem", 611 | "version": "v5.8.9", 612 | "source": { 613 | "type": "git", 614 | "url": "https://github.com/illuminate/filesystem.git", 615 | "reference": "8aef3ed5028eea80fa20287b776d6ec8e7eafbba" 616 | }, 617 | "dist": { 618 | "type": "zip", 619 | "url": "https://api.github.com/repos/illuminate/filesystem/zipball/8aef3ed5028eea80fa20287b776d6ec8e7eafbba", 620 | "reference": "8aef3ed5028eea80fa20287b776d6ec8e7eafbba", 621 | "shasum": "" 622 | }, 623 | "require": { 624 | "illuminate/contracts": "5.8.*", 625 | "illuminate/support": "5.8.*", 626 | "php": "^7.1.3", 627 | "symfony/finder": "^4.2" 628 | }, 629 | "suggest": { 630 | "league/flysystem": "Required to use the Flysystem local and FTP drivers (^1.0).", 631 | "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^1.0).", 632 | "league/flysystem-cached-adapter": "Required to use the Flysystem cache (^1.0).", 633 | "league/flysystem-rackspace": "Required to use the Flysystem Rackspace driver (^1.0).", 634 | "league/flysystem-sftp": "Required to use the Flysystem SFTP driver (^1.0)." 635 | }, 636 | "type": "library", 637 | "extra": { 638 | "branch-alias": { 639 | "dev-master": "5.8-dev" 640 | } 641 | }, 642 | "autoload": { 643 | "psr-4": { 644 | "Illuminate\\Filesystem\\": "" 645 | } 646 | }, 647 | "notification-url": "https://packagist.org/downloads/", 648 | "license": [ 649 | "MIT" 650 | ], 651 | "authors": [ 652 | { 653 | "name": "Taylor Otwell", 654 | "email": "taylor@laravel.com" 655 | } 656 | ], 657 | "description": "The Illuminate Filesystem package.", 658 | "homepage": "https://laravel.com", 659 | "time": "2019-02-18T18:37:54+00:00" 660 | }, 661 | { 662 | "name": "illuminate/http", 663 | "version": "v5.8.9", 664 | "source": { 665 | "type": "git", 666 | "url": "https://github.com/illuminate/http.git", 667 | "reference": "5a3f9268561a8df637904dead361ed4e6b4eaf85" 668 | }, 669 | "dist": { 670 | "type": "zip", 671 | "url": "https://api.github.com/repos/illuminate/http/zipball/5a3f9268561a8df637904dead361ed4e6b4eaf85", 672 | "reference": "5a3f9268561a8df637904dead361ed4e6b4eaf85", 673 | "shasum": "" 674 | }, 675 | "require": { 676 | "ext-json": "*", 677 | "illuminate/session": "5.8.*", 678 | "illuminate/support": "5.8.*", 679 | "php": "^7.1.3", 680 | "symfony/http-foundation": "^4.2", 681 | "symfony/http-kernel": "^4.2" 682 | }, 683 | "type": "library", 684 | "extra": { 685 | "branch-alias": { 686 | "dev-master": "5.8-dev" 687 | } 688 | }, 689 | "autoload": { 690 | "psr-4": { 691 | "Illuminate\\Http\\": "" 692 | } 693 | }, 694 | "notification-url": "https://packagist.org/downloads/", 695 | "license": [ 696 | "MIT" 697 | ], 698 | "authors": [ 699 | { 700 | "name": "Taylor Otwell", 701 | "email": "taylor@laravel.com" 702 | } 703 | ], 704 | "description": "The Illuminate Http package.", 705 | "homepage": "https://laravel.com", 706 | "time": "2019-03-29T18:03:35+00:00" 707 | }, 708 | { 709 | "name": "illuminate/pipeline", 710 | "version": "v5.8.9", 711 | "source": { 712 | "type": "git", 713 | "url": "https://github.com/illuminate/pipeline.git", 714 | "reference": "9e81b335d853ddd633a86a7f7e3fceed3b14f3d7" 715 | }, 716 | "dist": { 717 | "type": "zip", 718 | "url": "https://api.github.com/repos/illuminate/pipeline/zipball/9e81b335d853ddd633a86a7f7e3fceed3b14f3d7", 719 | "reference": "9e81b335d853ddd633a86a7f7e3fceed3b14f3d7", 720 | "shasum": "" 721 | }, 722 | "require": { 723 | "illuminate/contracts": "5.8.*", 724 | "illuminate/support": "5.8.*", 725 | "php": "^7.1.3" 726 | }, 727 | "type": "library", 728 | "extra": { 729 | "branch-alias": { 730 | "dev-master": "5.8-dev" 731 | } 732 | }, 733 | "autoload": { 734 | "psr-4": { 735 | "Illuminate\\Pipeline\\": "" 736 | } 737 | }, 738 | "notification-url": "https://packagist.org/downloads/", 739 | "license": [ 740 | "MIT" 741 | ], 742 | "authors": [ 743 | { 744 | "name": "Taylor Otwell", 745 | "email": "taylor@laravel.com" 746 | } 747 | ], 748 | "description": "The Illuminate Pipeline package.", 749 | "homepage": "https://laravel.com", 750 | "time": "2019-02-25T10:08:47+00:00" 751 | }, 752 | { 753 | "name": "illuminate/routing", 754 | "version": "v5.8.9", 755 | "source": { 756 | "type": "git", 757 | "url": "https://github.com/illuminate/routing.git", 758 | "reference": "8c08ca1e2291cdfb9c27ee2f9ebb2b4955fedeb3" 759 | }, 760 | "dist": { 761 | "type": "zip", 762 | "url": "https://api.github.com/repos/illuminate/routing/zipball/8c08ca1e2291cdfb9c27ee2f9ebb2b4955fedeb3", 763 | "reference": "8c08ca1e2291cdfb9c27ee2f9ebb2b4955fedeb3", 764 | "shasum": "" 765 | }, 766 | "require": { 767 | "ext-json": "*", 768 | "illuminate/container": "5.8.*", 769 | "illuminate/contracts": "5.8.*", 770 | "illuminate/http": "5.8.*", 771 | "illuminate/pipeline": "5.8.*", 772 | "illuminate/session": "5.8.*", 773 | "illuminate/support": "5.8.*", 774 | "php": "^7.1.3", 775 | "symfony/debug": "^4.2", 776 | "symfony/http-foundation": "^4.2", 777 | "symfony/http-kernel": "^4.2", 778 | "symfony/routing": "^4.2" 779 | }, 780 | "suggest": { 781 | "illuminate/console": "Required to use the make commands (5.8.*).", 782 | "symfony/psr-http-message-bridge": "Required to psr7 bridging features (^1.1)." 783 | }, 784 | "type": "library", 785 | "extra": { 786 | "branch-alias": { 787 | "dev-master": "5.8-dev" 788 | } 789 | }, 790 | "autoload": { 791 | "psr-4": { 792 | "Illuminate\\Routing\\": "" 793 | } 794 | }, 795 | "notification-url": "https://packagist.org/downloads/", 796 | "license": [ 797 | "MIT" 798 | ], 799 | "authors": [ 800 | { 801 | "name": "Taylor Otwell", 802 | "email": "taylor@laravel.com" 803 | } 804 | ], 805 | "description": "The Illuminate Routing package.", 806 | "homepage": "https://laravel.com", 807 | "time": "2019-03-26T01:29:46+00:00" 808 | }, 809 | { 810 | "name": "illuminate/session", 811 | "version": "v5.8.9", 812 | "source": { 813 | "type": "git", 814 | "url": "https://github.com/illuminate/session.git", 815 | "reference": "a74fcdf4442e7d2cfb6839afd73533b9f10e92e2" 816 | }, 817 | "dist": { 818 | "type": "zip", 819 | "url": "https://api.github.com/repos/illuminate/session/zipball/a74fcdf4442e7d2cfb6839afd73533b9f10e92e2", 820 | "reference": "a74fcdf4442e7d2cfb6839afd73533b9f10e92e2", 821 | "shasum": "" 822 | }, 823 | "require": { 824 | "ext-json": "*", 825 | "illuminate/contracts": "5.8.*", 826 | "illuminate/filesystem": "5.8.*", 827 | "illuminate/support": "5.8.*", 828 | "php": "^7.1.3", 829 | "symfony/finder": "^4.2", 830 | "symfony/http-foundation": "^4.2" 831 | }, 832 | "suggest": { 833 | "illuminate/console": "Required to use the session:table command (5.8.*)." 834 | }, 835 | "type": "library", 836 | "extra": { 837 | "branch-alias": { 838 | "dev-master": "5.8-dev" 839 | } 840 | }, 841 | "autoload": { 842 | "psr-4": { 843 | "Illuminate\\Session\\": "" 844 | } 845 | }, 846 | "notification-url": "https://packagist.org/downloads/", 847 | "license": [ 848 | "MIT" 849 | ], 850 | "authors": [ 851 | { 852 | "name": "Taylor Otwell", 853 | "email": "taylor@laravel.com" 854 | } 855 | ], 856 | "description": "The Illuminate Session package.", 857 | "homepage": "https://laravel.com", 858 | "time": "2019-03-19T14:20:36+00:00" 859 | }, 860 | { 861 | "name": "illuminate/support", 862 | "version": "v5.8.9", 863 | "source": { 864 | "type": "git", 865 | "url": "https://github.com/illuminate/support.git", 866 | "reference": "e275519c58246cc4011c798f9b0a0f83aae2aab7" 867 | }, 868 | "dist": { 869 | "type": "zip", 870 | "url": "https://api.github.com/repos/illuminate/support/zipball/e275519c58246cc4011c798f9b0a0f83aae2aab7", 871 | "reference": "e275519c58246cc4011c798f9b0a0f83aae2aab7", 872 | "shasum": "" 873 | }, 874 | "require": { 875 | "doctrine/inflector": "^1.1", 876 | "ext-json": "*", 877 | "ext-mbstring": "*", 878 | "illuminate/contracts": "5.8.*", 879 | "nesbot/carbon": "^1.26.3 || ^2.0", 880 | "php": "^7.1.3" 881 | }, 882 | "conflict": { 883 | "tightenco/collect": "<5.5.33" 884 | }, 885 | "suggest": { 886 | "illuminate/filesystem": "Required to use the composer class (5.8.*).", 887 | "moontoast/math": "Required to use ordered UUIDs (^1.1).", 888 | "ramsey/uuid": "Required to use Str::uuid() (^3.7).", 889 | "symfony/process": "Required to use the composer class (^4.2).", 890 | "symfony/var-dumper": "Required to use the dd function (^4.2).", 891 | "vlucas/phpdotenv": "Required to use the env helper (^3.3)." 892 | }, 893 | "type": "library", 894 | "extra": { 895 | "branch-alias": { 896 | "dev-master": "5.8-dev" 897 | } 898 | }, 899 | "autoload": { 900 | "psr-4": { 901 | "Illuminate\\Support\\": "" 902 | }, 903 | "files": [ 904 | "helpers.php" 905 | ] 906 | }, 907 | "notification-url": "https://packagist.org/downloads/", 908 | "license": [ 909 | "MIT" 910 | ], 911 | "authors": [ 912 | { 913 | "name": "Taylor Otwell", 914 | "email": "taylor@laravel.com" 915 | } 916 | ], 917 | "description": "The Illuminate Support package.", 918 | "homepage": "https://laravel.com", 919 | "time": "2019-04-01T19:02:05+00:00" 920 | }, 921 | { 922 | "name": "illuminate/translation", 923 | "version": "v5.8.9", 924 | "source": { 925 | "type": "git", 926 | "url": "https://github.com/illuminate/translation.git", 927 | "reference": "7d9cc548c9bb99fb344ab7b78f2f067372beedbd" 928 | }, 929 | "dist": { 930 | "type": "zip", 931 | "url": "https://api.github.com/repos/illuminate/translation/zipball/7d9cc548c9bb99fb344ab7b78f2f067372beedbd", 932 | "reference": "7d9cc548c9bb99fb344ab7b78f2f067372beedbd", 933 | "shasum": "" 934 | }, 935 | "require": { 936 | "ext-json": "*", 937 | "illuminate/contracts": "5.8.*", 938 | "illuminate/filesystem": "5.8.*", 939 | "illuminate/support": "5.8.*", 940 | "php": "^7.1.3" 941 | }, 942 | "type": "library", 943 | "extra": { 944 | "branch-alias": { 945 | "dev-master": "5.8-dev" 946 | } 947 | }, 948 | "autoload": { 949 | "psr-4": { 950 | "Illuminate\\Translation\\": "" 951 | } 952 | }, 953 | "notification-url": "https://packagist.org/downloads/", 954 | "license": [ 955 | "MIT" 956 | ], 957 | "authors": [ 958 | { 959 | "name": "Taylor Otwell", 960 | "email": "taylor@laravel.com" 961 | } 962 | ], 963 | "description": "The Illuminate Translation package.", 964 | "homepage": "https://laravel.com", 965 | "time": "2019-02-18T18:37:54+00:00" 966 | }, 967 | { 968 | "name": "illuminate/validation", 969 | "version": "v5.8.9", 970 | "source": { 971 | "type": "git", 972 | "url": "https://github.com/illuminate/validation.git", 973 | "reference": "264dfd1d2b772090cb156c3bbb2f8e1dfbe111b0" 974 | }, 975 | "dist": { 976 | "type": "zip", 977 | "url": "https://api.github.com/repos/illuminate/validation/zipball/264dfd1d2b772090cb156c3bbb2f8e1dfbe111b0", 978 | "reference": "264dfd1d2b772090cb156c3bbb2f8e1dfbe111b0", 979 | "shasum": "" 980 | }, 981 | "require": { 982 | "egulias/email-validator": "^2.0", 983 | "ext-json": "*", 984 | "illuminate/container": "5.8.*", 985 | "illuminate/contracts": "5.8.*", 986 | "illuminate/support": "5.8.*", 987 | "illuminate/translation": "5.8.*", 988 | "php": "^7.1.3", 989 | "symfony/http-foundation": "^4.2" 990 | }, 991 | "suggest": { 992 | "illuminate/database": "Required to use the database presence verifier (5.8.*)." 993 | }, 994 | "type": "library", 995 | "extra": { 996 | "branch-alias": { 997 | "dev-master": "5.8-dev" 998 | } 999 | }, 1000 | "autoload": { 1001 | "psr-4": { 1002 | "Illuminate\\Validation\\": "" 1003 | } 1004 | }, 1005 | "notification-url": "https://packagist.org/downloads/", 1006 | "license": [ 1007 | "MIT" 1008 | ], 1009 | "authors": [ 1010 | { 1011 | "name": "Taylor Otwell", 1012 | "email": "taylor@laravel.com" 1013 | } 1014 | ], 1015 | "description": "The Illuminate Validation package.", 1016 | "homepage": "https://laravel.com", 1017 | "time": "2019-03-26T01:29:46+00:00" 1018 | }, 1019 | { 1020 | "name": "jasny/sso", 1021 | "version": "v0.3.0", 1022 | "source": { 1023 | "type": "git", 1024 | "url": "https://github.com/jasny/sso.git", 1025 | "reference": "0cb18c072e7b14db3d2d2549c051f41ca837e5e9" 1026 | }, 1027 | "dist": { 1028 | "type": "zip", 1029 | "url": "https://api.github.com/repos/jasny/sso/zipball/0cb18c072e7b14db3d2d2549c051f41ca837e5e9", 1030 | "reference": "0cb18c072e7b14db3d2d2549c051f41ca837e5e9", 1031 | "shasum": "" 1032 | }, 1033 | "require": { 1034 | "desarrolla2/cache": "^2.0.0", 1035 | "jasny/validation-result": "^1.0.0", 1036 | "php": ">=5.5.0" 1037 | }, 1038 | "require-dev": { 1039 | "codeception/codeception": "^2.1.0", 1040 | "jasny/php-code-quality": "^1.1.0" 1041 | }, 1042 | "type": "library", 1043 | "autoload": { 1044 | "psr-4": { 1045 | "Jasny\\SSO\\": "src/" 1046 | } 1047 | }, 1048 | "notification-url": "https://packagist.org/downloads/", 1049 | "license": [ 1050 | "MIT" 1051 | ], 1052 | "authors": [ 1053 | { 1054 | "name": "Arnold Daniels", 1055 | "email": "arnold@jasny.net", 1056 | "homepage": "http://www.jasny.net" 1057 | } 1058 | ], 1059 | "description": "Simple Single Sign-On", 1060 | "homepage": "http://www.jasny.net/articles/simple-single-sign-on-for-php/", 1061 | "keywords": [ 1062 | "SSO", 1063 | "auth" 1064 | ], 1065 | "time": "2017-02-24T22:44:27+00:00" 1066 | }, 1067 | { 1068 | "name": "jasny/validation-result", 1069 | "version": "v1.1.2", 1070 | "source": { 1071 | "type": "git", 1072 | "url": "https://github.com/jasny/validation-result.git", 1073 | "reference": "fbce54837c8414cf5af22981ac33b26eb13b2a51" 1074 | }, 1075 | "dist": { 1076 | "type": "zip", 1077 | "url": "https://api.github.com/repos/jasny/validation-result/zipball/fbce54837c8414cf5af22981ac33b26eb13b2a51", 1078 | "reference": "fbce54837c8414cf5af22981ac33b26eb13b2a51", 1079 | "shasum": "" 1080 | }, 1081 | "require": { 1082 | "php": ">=5.6.0" 1083 | }, 1084 | "require-dev": { 1085 | "jasny/php-code-quality": "^1.2" 1086 | }, 1087 | "type": "library", 1088 | "autoload": { 1089 | "psr-4": { 1090 | "Jasny\\": "src/" 1091 | } 1092 | }, 1093 | "notification-url": "https://packagist.org/downloads/", 1094 | "license": [ 1095 | "MIT" 1096 | ], 1097 | "authors": [ 1098 | { 1099 | "name": "Arnold Daniels", 1100 | "email": "arnold@jasny.net", 1101 | "homepage": "http://www.jasny.net" 1102 | } 1103 | ], 1104 | "description": "A result object for validation", 1105 | "keywords": [ 1106 | "validation" 1107 | ], 1108 | "time": "2019-02-12T12:51:58+00:00" 1109 | }, 1110 | { 1111 | "name": "nesbot/carbon", 1112 | "version": "2.16.2", 1113 | "source": { 1114 | "type": "git", 1115 | "url": "https://github.com/briannesbitt/Carbon.git", 1116 | "reference": "720a9c36927396efeeb48a972e9d129d44b6dc28" 1117 | }, 1118 | "dist": { 1119 | "type": "zip", 1120 | "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/720a9c36927396efeeb48a972e9d129d44b6dc28", 1121 | "reference": "720a9c36927396efeeb48a972e9d129d44b6dc28", 1122 | "shasum": "" 1123 | }, 1124 | "require": { 1125 | "ext-json": "*", 1126 | "php": "^7.1.8 || ^8.0", 1127 | "symfony/translation": "^3.4 || ^4.0" 1128 | }, 1129 | "require-dev": { 1130 | "friendsofphp/php-cs-fixer": "^2.14 || ^3.0", 1131 | "kylekatarnls/multi-tester": "^0.1", 1132 | "phpmd/phpmd": "^2.6", 1133 | "phpstan/phpstan": "^0.10.8", 1134 | "phpunit/phpunit": "^7.5 || ^8.0", 1135 | "squizlabs/php_codesniffer": "^3.4" 1136 | }, 1137 | "type": "library", 1138 | "extra": { 1139 | "laravel": { 1140 | "providers": [ 1141 | "Carbon\\Laravel\\ServiceProvider" 1142 | ] 1143 | } 1144 | }, 1145 | "autoload": { 1146 | "psr-4": { 1147 | "Carbon\\": "src/Carbon/" 1148 | } 1149 | }, 1150 | "notification-url": "https://packagist.org/downloads/", 1151 | "license": [ 1152 | "MIT" 1153 | ], 1154 | "authors": [ 1155 | { 1156 | "name": "Brian Nesbitt", 1157 | "email": "brian@nesbot.com", 1158 | "homepage": "http://nesbot.com" 1159 | } 1160 | ], 1161 | "description": "A simple API extension for DateTime.", 1162 | "homepage": "http://carbon.nesbot.com", 1163 | "keywords": [ 1164 | "date", 1165 | "datetime", 1166 | "time" 1167 | ], 1168 | "time": "2019-03-29T12:23:12+00:00" 1169 | }, 1170 | { 1171 | "name": "psr/container", 1172 | "version": "1.0.0", 1173 | "source": { 1174 | "type": "git", 1175 | "url": "https://github.com/php-fig/container.git", 1176 | "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" 1177 | }, 1178 | "dist": { 1179 | "type": "zip", 1180 | "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", 1181 | "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", 1182 | "shasum": "" 1183 | }, 1184 | "require": { 1185 | "php": ">=5.3.0" 1186 | }, 1187 | "type": "library", 1188 | "extra": { 1189 | "branch-alias": { 1190 | "dev-master": "1.0.x-dev" 1191 | } 1192 | }, 1193 | "autoload": { 1194 | "psr-4": { 1195 | "Psr\\Container\\": "src/" 1196 | } 1197 | }, 1198 | "notification-url": "https://packagist.org/downloads/", 1199 | "license": [ 1200 | "MIT" 1201 | ], 1202 | "authors": [ 1203 | { 1204 | "name": "PHP-FIG", 1205 | "homepage": "http://www.php-fig.org/" 1206 | } 1207 | ], 1208 | "description": "Common Container Interface (PHP FIG PSR-11)", 1209 | "homepage": "https://github.com/php-fig/container", 1210 | "keywords": [ 1211 | "PSR-11", 1212 | "container", 1213 | "container-interface", 1214 | "container-interop", 1215 | "psr" 1216 | ], 1217 | "time": "2017-02-14T16:28:37+00:00" 1218 | }, 1219 | { 1220 | "name": "psr/http-message", 1221 | "version": "1.0.1", 1222 | "source": { 1223 | "type": "git", 1224 | "url": "https://github.com/php-fig/http-message.git", 1225 | "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" 1226 | }, 1227 | "dist": { 1228 | "type": "zip", 1229 | "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", 1230 | "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", 1231 | "shasum": "" 1232 | }, 1233 | "require": { 1234 | "php": ">=5.3.0" 1235 | }, 1236 | "type": "library", 1237 | "extra": { 1238 | "branch-alias": { 1239 | "dev-master": "1.0.x-dev" 1240 | } 1241 | }, 1242 | "autoload": { 1243 | "psr-4": { 1244 | "Psr\\Http\\Message\\": "src/" 1245 | } 1246 | }, 1247 | "notification-url": "https://packagist.org/downloads/", 1248 | "license": [ 1249 | "MIT" 1250 | ], 1251 | "authors": [ 1252 | { 1253 | "name": "PHP-FIG", 1254 | "homepage": "http://www.php-fig.org/" 1255 | } 1256 | ], 1257 | "description": "Common interface for HTTP messages", 1258 | "homepage": "https://github.com/php-fig/http-message", 1259 | "keywords": [ 1260 | "http", 1261 | "http-message", 1262 | "psr", 1263 | "psr-7", 1264 | "request", 1265 | "response" 1266 | ], 1267 | "time": "2016-08-06T14:39:51+00:00" 1268 | }, 1269 | { 1270 | "name": "psr/log", 1271 | "version": "1.1.0", 1272 | "source": { 1273 | "type": "git", 1274 | "url": "https://github.com/php-fig/log.git", 1275 | "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd" 1276 | }, 1277 | "dist": { 1278 | "type": "zip", 1279 | "url": "https://api.github.com/repos/php-fig/log/zipball/6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd", 1280 | "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd", 1281 | "shasum": "" 1282 | }, 1283 | "require": { 1284 | "php": ">=5.3.0" 1285 | }, 1286 | "type": "library", 1287 | "extra": { 1288 | "branch-alias": { 1289 | "dev-master": "1.0.x-dev" 1290 | } 1291 | }, 1292 | "autoload": { 1293 | "psr-4": { 1294 | "Psr\\Log\\": "Psr/Log/" 1295 | } 1296 | }, 1297 | "notification-url": "https://packagist.org/downloads/", 1298 | "license": [ 1299 | "MIT" 1300 | ], 1301 | "authors": [ 1302 | { 1303 | "name": "PHP-FIG", 1304 | "homepage": "http://www.php-fig.org/" 1305 | } 1306 | ], 1307 | "description": "Common interface for logging libraries", 1308 | "homepage": "https://github.com/php-fig/log", 1309 | "keywords": [ 1310 | "log", 1311 | "psr", 1312 | "psr-3" 1313 | ], 1314 | "time": "2018-11-20T15:27:04+00:00" 1315 | }, 1316 | { 1317 | "name": "psr/simple-cache", 1318 | "version": "1.0.1", 1319 | "source": { 1320 | "type": "git", 1321 | "url": "https://github.com/php-fig/simple-cache.git", 1322 | "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" 1323 | }, 1324 | "dist": { 1325 | "type": "zip", 1326 | "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", 1327 | "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", 1328 | "shasum": "" 1329 | }, 1330 | "require": { 1331 | "php": ">=5.3.0" 1332 | }, 1333 | "type": "library", 1334 | "extra": { 1335 | "branch-alias": { 1336 | "dev-master": "1.0.x-dev" 1337 | } 1338 | }, 1339 | "autoload": { 1340 | "psr-4": { 1341 | "Psr\\SimpleCache\\": "src/" 1342 | } 1343 | }, 1344 | "notification-url": "https://packagist.org/downloads/", 1345 | "license": [ 1346 | "MIT" 1347 | ], 1348 | "authors": [ 1349 | { 1350 | "name": "PHP-FIG", 1351 | "homepage": "http://www.php-fig.org/" 1352 | } 1353 | ], 1354 | "description": "Common interfaces for simple caching", 1355 | "keywords": [ 1356 | "cache", 1357 | "caching", 1358 | "psr", 1359 | "psr-16", 1360 | "simple-cache" 1361 | ], 1362 | "time": "2017-10-23T01:57:42+00:00" 1363 | }, 1364 | { 1365 | "name": "ralouphie/getallheaders", 1366 | "version": "2.0.5", 1367 | "source": { 1368 | "type": "git", 1369 | "url": "https://github.com/ralouphie/getallheaders.git", 1370 | "reference": "5601c8a83fbba7ef674a7369456d12f1e0d0eafa" 1371 | }, 1372 | "dist": { 1373 | "type": "zip", 1374 | "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/5601c8a83fbba7ef674a7369456d12f1e0d0eafa", 1375 | "reference": "5601c8a83fbba7ef674a7369456d12f1e0d0eafa", 1376 | "shasum": "" 1377 | }, 1378 | "require": { 1379 | "php": ">=5.3" 1380 | }, 1381 | "require-dev": { 1382 | "phpunit/phpunit": "~3.7.0", 1383 | "satooshi/php-coveralls": ">=1.0" 1384 | }, 1385 | "type": "library", 1386 | "autoload": { 1387 | "files": [ 1388 | "src/getallheaders.php" 1389 | ] 1390 | }, 1391 | "notification-url": "https://packagist.org/downloads/", 1392 | "license": [ 1393 | "MIT" 1394 | ], 1395 | "authors": [ 1396 | { 1397 | "name": "Ralph Khattar", 1398 | "email": "ralph.khattar@gmail.com" 1399 | } 1400 | ], 1401 | "description": "A polyfill for getallheaders.", 1402 | "time": "2016-02-11T07:05:27+00:00" 1403 | }, 1404 | { 1405 | "name": "symfony/contracts", 1406 | "version": "v1.0.2", 1407 | "source": { 1408 | "type": "git", 1409 | "url": "https://github.com/symfony/contracts.git", 1410 | "reference": "1aa7ab2429c3d594dd70689604b5cf7421254cdf" 1411 | }, 1412 | "dist": { 1413 | "type": "zip", 1414 | "url": "https://api.github.com/repos/symfony/contracts/zipball/1aa7ab2429c3d594dd70689604b5cf7421254cdf", 1415 | "reference": "1aa7ab2429c3d594dd70689604b5cf7421254cdf", 1416 | "shasum": "" 1417 | }, 1418 | "require": { 1419 | "php": "^7.1.3" 1420 | }, 1421 | "require-dev": { 1422 | "psr/cache": "^1.0", 1423 | "psr/container": "^1.0" 1424 | }, 1425 | "suggest": { 1426 | "psr/cache": "When using the Cache contracts", 1427 | "psr/container": "When using the Service contracts", 1428 | "symfony/cache-contracts-implementation": "", 1429 | "symfony/service-contracts-implementation": "", 1430 | "symfony/translation-contracts-implementation": "" 1431 | }, 1432 | "type": "library", 1433 | "extra": { 1434 | "branch-alias": { 1435 | "dev-master": "1.0-dev" 1436 | } 1437 | }, 1438 | "autoload": { 1439 | "psr-4": { 1440 | "Symfony\\Contracts\\": "" 1441 | }, 1442 | "exclude-from-classmap": [ 1443 | "**/Tests/" 1444 | ] 1445 | }, 1446 | "notification-url": "https://packagist.org/downloads/", 1447 | "license": [ 1448 | "MIT" 1449 | ], 1450 | "authors": [ 1451 | { 1452 | "name": "Nicolas Grekas", 1453 | "email": "p@tchwork.com" 1454 | }, 1455 | { 1456 | "name": "Symfony Community", 1457 | "homepage": "https://symfony.com/contributors" 1458 | } 1459 | ], 1460 | "description": "A set of abstractions extracted out of the Symfony components", 1461 | "homepage": "https://symfony.com", 1462 | "keywords": [ 1463 | "abstractions", 1464 | "contracts", 1465 | "decoupling", 1466 | "interfaces", 1467 | "interoperability", 1468 | "standards" 1469 | ], 1470 | "time": "2018-12-05T08:06:11+00:00" 1471 | }, 1472 | { 1473 | "name": "symfony/debug", 1474 | "version": "v4.2.5", 1475 | "source": { 1476 | "type": "git", 1477 | "url": "https://github.com/symfony/debug.git", 1478 | "reference": "43ce8ab34c734dcc8a4af576cb86711daab964c5" 1479 | }, 1480 | "dist": { 1481 | "type": "zip", 1482 | "url": "https://api.github.com/repos/symfony/debug/zipball/43ce8ab34c734dcc8a4af576cb86711daab964c5", 1483 | "reference": "43ce8ab34c734dcc8a4af576cb86711daab964c5", 1484 | "shasum": "" 1485 | }, 1486 | "require": { 1487 | "php": "^7.1.3", 1488 | "psr/log": "~1.0" 1489 | }, 1490 | "conflict": { 1491 | "symfony/http-kernel": "<3.4" 1492 | }, 1493 | "require-dev": { 1494 | "symfony/http-kernel": "~3.4|~4.0" 1495 | }, 1496 | "type": "library", 1497 | "extra": { 1498 | "branch-alias": { 1499 | "dev-master": "4.2-dev" 1500 | } 1501 | }, 1502 | "autoload": { 1503 | "psr-4": { 1504 | "Symfony\\Component\\Debug\\": "" 1505 | }, 1506 | "exclude-from-classmap": [ 1507 | "/Tests/" 1508 | ] 1509 | }, 1510 | "notification-url": "https://packagist.org/downloads/", 1511 | "license": [ 1512 | "MIT" 1513 | ], 1514 | "authors": [ 1515 | { 1516 | "name": "Fabien Potencier", 1517 | "email": "fabien@symfony.com" 1518 | }, 1519 | { 1520 | "name": "Symfony Community", 1521 | "homepage": "https://symfony.com/contributors" 1522 | } 1523 | ], 1524 | "description": "Symfony Debug Component", 1525 | "homepage": "https://symfony.com", 1526 | "time": "2019-03-10T17:09:50+00:00" 1527 | }, 1528 | { 1529 | "name": "symfony/event-dispatcher", 1530 | "version": "v4.2.5", 1531 | "source": { 1532 | "type": "git", 1533 | "url": "https://github.com/symfony/event-dispatcher.git", 1534 | "reference": "ca5af306fbc37f3cf597e91bc9cfa0c7d3f33544" 1535 | }, 1536 | "dist": { 1537 | "type": "zip", 1538 | "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/ca5af306fbc37f3cf597e91bc9cfa0c7d3f33544", 1539 | "reference": "ca5af306fbc37f3cf597e91bc9cfa0c7d3f33544", 1540 | "shasum": "" 1541 | }, 1542 | "require": { 1543 | "php": "^7.1.3", 1544 | "symfony/contracts": "^1.0" 1545 | }, 1546 | "conflict": { 1547 | "symfony/dependency-injection": "<3.4" 1548 | }, 1549 | "require-dev": { 1550 | "psr/log": "~1.0", 1551 | "symfony/config": "~3.4|~4.0", 1552 | "symfony/dependency-injection": "~3.4|~4.0", 1553 | "symfony/expression-language": "~3.4|~4.0", 1554 | "symfony/stopwatch": "~3.4|~4.0" 1555 | }, 1556 | "suggest": { 1557 | "symfony/dependency-injection": "", 1558 | "symfony/http-kernel": "" 1559 | }, 1560 | "type": "library", 1561 | "extra": { 1562 | "branch-alias": { 1563 | "dev-master": "4.2-dev" 1564 | } 1565 | }, 1566 | "autoload": { 1567 | "psr-4": { 1568 | "Symfony\\Component\\EventDispatcher\\": "" 1569 | }, 1570 | "exclude-from-classmap": [ 1571 | "/Tests/" 1572 | ] 1573 | }, 1574 | "notification-url": "https://packagist.org/downloads/", 1575 | "license": [ 1576 | "MIT" 1577 | ], 1578 | "authors": [ 1579 | { 1580 | "name": "Fabien Potencier", 1581 | "email": "fabien@symfony.com" 1582 | }, 1583 | { 1584 | "name": "Symfony Community", 1585 | "homepage": "https://symfony.com/contributors" 1586 | } 1587 | ], 1588 | "description": "Symfony EventDispatcher Component", 1589 | "homepage": "https://symfony.com", 1590 | "time": "2019-03-30T15:58:42+00:00" 1591 | }, 1592 | { 1593 | "name": "symfony/finder", 1594 | "version": "v4.2.5", 1595 | "source": { 1596 | "type": "git", 1597 | "url": "https://github.com/symfony/finder.git", 1598 | "reference": "267b7002c1b70ea80db0833c3afe05f0fbde580a" 1599 | }, 1600 | "dist": { 1601 | "type": "zip", 1602 | "url": "https://api.github.com/repos/symfony/finder/zipball/267b7002c1b70ea80db0833c3afe05f0fbde580a", 1603 | "reference": "267b7002c1b70ea80db0833c3afe05f0fbde580a", 1604 | "shasum": "" 1605 | }, 1606 | "require": { 1607 | "php": "^7.1.3" 1608 | }, 1609 | "type": "library", 1610 | "extra": { 1611 | "branch-alias": { 1612 | "dev-master": "4.2-dev" 1613 | } 1614 | }, 1615 | "autoload": { 1616 | "psr-4": { 1617 | "Symfony\\Component\\Finder\\": "" 1618 | }, 1619 | "exclude-from-classmap": [ 1620 | "/Tests/" 1621 | ] 1622 | }, 1623 | "notification-url": "https://packagist.org/downloads/", 1624 | "license": [ 1625 | "MIT" 1626 | ], 1627 | "authors": [ 1628 | { 1629 | "name": "Fabien Potencier", 1630 | "email": "fabien@symfony.com" 1631 | }, 1632 | { 1633 | "name": "Symfony Community", 1634 | "homepage": "https://symfony.com/contributors" 1635 | } 1636 | ], 1637 | "description": "Symfony Finder Component", 1638 | "homepage": "https://symfony.com", 1639 | "time": "2019-02-23T15:42:05+00:00" 1640 | }, 1641 | { 1642 | "name": "symfony/http-foundation", 1643 | "version": "v4.2.5", 1644 | "source": { 1645 | "type": "git", 1646 | "url": "https://github.com/symfony/http-foundation.git", 1647 | "reference": "5b7ab6beaa5b053b8d3c9b13367ada9b292e12e1" 1648 | }, 1649 | "dist": { 1650 | "type": "zip", 1651 | "url": "https://api.github.com/repos/symfony/http-foundation/zipball/5b7ab6beaa5b053b8d3c9b13367ada9b292e12e1", 1652 | "reference": "5b7ab6beaa5b053b8d3c9b13367ada9b292e12e1", 1653 | "shasum": "" 1654 | }, 1655 | "require": { 1656 | "php": "^7.1.3", 1657 | "symfony/polyfill-mbstring": "~1.1" 1658 | }, 1659 | "require-dev": { 1660 | "predis/predis": "~1.0", 1661 | "symfony/expression-language": "~3.4|~4.0" 1662 | }, 1663 | "type": "library", 1664 | "extra": { 1665 | "branch-alias": { 1666 | "dev-master": "4.2-dev" 1667 | } 1668 | }, 1669 | "autoload": { 1670 | "psr-4": { 1671 | "Symfony\\Component\\HttpFoundation\\": "" 1672 | }, 1673 | "exclude-from-classmap": [ 1674 | "/Tests/" 1675 | ] 1676 | }, 1677 | "notification-url": "https://packagist.org/downloads/", 1678 | "license": [ 1679 | "MIT" 1680 | ], 1681 | "authors": [ 1682 | { 1683 | "name": "Fabien Potencier", 1684 | "email": "fabien@symfony.com" 1685 | }, 1686 | { 1687 | "name": "Symfony Community", 1688 | "homepage": "https://symfony.com/contributors" 1689 | } 1690 | ], 1691 | "description": "Symfony HttpFoundation Component", 1692 | "homepage": "https://symfony.com", 1693 | "time": "2019-03-30T15:58:42+00:00" 1694 | }, 1695 | { 1696 | "name": "symfony/http-kernel", 1697 | "version": "v4.2.5", 1698 | "source": { 1699 | "type": "git", 1700 | "url": "https://github.com/symfony/http-kernel.git", 1701 | "reference": "e8b940bbeebf0f96789b5d17d9d77f8b2613960b" 1702 | }, 1703 | "dist": { 1704 | "type": "zip", 1705 | "url": "https://api.github.com/repos/symfony/http-kernel/zipball/e8b940bbeebf0f96789b5d17d9d77f8b2613960b", 1706 | "reference": "e8b940bbeebf0f96789b5d17d9d77f8b2613960b", 1707 | "shasum": "" 1708 | }, 1709 | "require": { 1710 | "php": "^7.1.3", 1711 | "psr/log": "~1.0", 1712 | "symfony/contracts": "^1.0.2", 1713 | "symfony/debug": "~3.4|~4.0", 1714 | "symfony/event-dispatcher": "~4.1", 1715 | "symfony/http-foundation": "^4.1.1", 1716 | "symfony/polyfill-ctype": "~1.8" 1717 | }, 1718 | "conflict": { 1719 | "symfony/config": "<3.4", 1720 | "symfony/dependency-injection": "<4.2", 1721 | "symfony/translation": "<4.2", 1722 | "symfony/var-dumper": "<4.1.1", 1723 | "twig/twig": "<1.34|<2.4,>=2" 1724 | }, 1725 | "provide": { 1726 | "psr/log-implementation": "1.0" 1727 | }, 1728 | "require-dev": { 1729 | "psr/cache": "~1.0", 1730 | "symfony/browser-kit": "~3.4|~4.0", 1731 | "symfony/config": "~3.4|~4.0", 1732 | "symfony/console": "~3.4|~4.0", 1733 | "symfony/css-selector": "~3.4|~4.0", 1734 | "symfony/dependency-injection": "^4.2", 1735 | "symfony/dom-crawler": "~3.4|~4.0", 1736 | "symfony/expression-language": "~3.4|~4.0", 1737 | "symfony/finder": "~3.4|~4.0", 1738 | "symfony/process": "~3.4|~4.0", 1739 | "symfony/routing": "~3.4|~4.0", 1740 | "symfony/stopwatch": "~3.4|~4.0", 1741 | "symfony/templating": "~3.4|~4.0", 1742 | "symfony/translation": "~4.2", 1743 | "symfony/var-dumper": "^4.1.1" 1744 | }, 1745 | "suggest": { 1746 | "symfony/browser-kit": "", 1747 | "symfony/config": "", 1748 | "symfony/console": "", 1749 | "symfony/dependency-injection": "", 1750 | "symfony/var-dumper": "" 1751 | }, 1752 | "type": "library", 1753 | "extra": { 1754 | "branch-alias": { 1755 | "dev-master": "4.2-dev" 1756 | } 1757 | }, 1758 | "autoload": { 1759 | "psr-4": { 1760 | "Symfony\\Component\\HttpKernel\\": "" 1761 | }, 1762 | "exclude-from-classmap": [ 1763 | "/Tests/" 1764 | ] 1765 | }, 1766 | "notification-url": "https://packagist.org/downloads/", 1767 | "license": [ 1768 | "MIT" 1769 | ], 1770 | "authors": [ 1771 | { 1772 | "name": "Fabien Potencier", 1773 | "email": "fabien@symfony.com" 1774 | }, 1775 | { 1776 | "name": "Symfony Community", 1777 | "homepage": "https://symfony.com/contributors" 1778 | } 1779 | ], 1780 | "description": "Symfony HttpKernel Component", 1781 | "homepage": "https://symfony.com", 1782 | "time": "2019-04-02T19:03:51+00:00" 1783 | }, 1784 | { 1785 | "name": "symfony/polyfill-ctype", 1786 | "version": "v1.11.0", 1787 | "source": { 1788 | "type": "git", 1789 | "url": "https://github.com/symfony/polyfill-ctype.git", 1790 | "reference": "82ebae02209c21113908c229e9883c419720738a" 1791 | }, 1792 | "dist": { 1793 | "type": "zip", 1794 | "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/82ebae02209c21113908c229e9883c419720738a", 1795 | "reference": "82ebae02209c21113908c229e9883c419720738a", 1796 | "shasum": "" 1797 | }, 1798 | "require": { 1799 | "php": ">=5.3.3" 1800 | }, 1801 | "suggest": { 1802 | "ext-ctype": "For best performance" 1803 | }, 1804 | "type": "library", 1805 | "extra": { 1806 | "branch-alias": { 1807 | "dev-master": "1.11-dev" 1808 | } 1809 | }, 1810 | "autoload": { 1811 | "psr-4": { 1812 | "Symfony\\Polyfill\\Ctype\\": "" 1813 | }, 1814 | "files": [ 1815 | "bootstrap.php" 1816 | ] 1817 | }, 1818 | "notification-url": "https://packagist.org/downloads/", 1819 | "license": [ 1820 | "MIT" 1821 | ], 1822 | "authors": [ 1823 | { 1824 | "name": "Symfony Community", 1825 | "homepage": "https://symfony.com/contributors" 1826 | }, 1827 | { 1828 | "name": "Gert de Pagter", 1829 | "email": "backendtea@gmail.com" 1830 | } 1831 | ], 1832 | "description": "Symfony polyfill for ctype functions", 1833 | "homepage": "https://symfony.com", 1834 | "keywords": [ 1835 | "compatibility", 1836 | "ctype", 1837 | "polyfill", 1838 | "portable" 1839 | ], 1840 | "time": "2019-02-06T07:57:58+00:00" 1841 | }, 1842 | { 1843 | "name": "symfony/polyfill-mbstring", 1844 | "version": "v1.11.0", 1845 | "source": { 1846 | "type": "git", 1847 | "url": "https://github.com/symfony/polyfill-mbstring.git", 1848 | "reference": "fe5e94c604826c35a32fa832f35bd036b6799609" 1849 | }, 1850 | "dist": { 1851 | "type": "zip", 1852 | "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fe5e94c604826c35a32fa832f35bd036b6799609", 1853 | "reference": "fe5e94c604826c35a32fa832f35bd036b6799609", 1854 | "shasum": "" 1855 | }, 1856 | "require": { 1857 | "php": ">=5.3.3" 1858 | }, 1859 | "suggest": { 1860 | "ext-mbstring": "For best performance" 1861 | }, 1862 | "type": "library", 1863 | "extra": { 1864 | "branch-alias": { 1865 | "dev-master": "1.11-dev" 1866 | } 1867 | }, 1868 | "autoload": { 1869 | "psr-4": { 1870 | "Symfony\\Polyfill\\Mbstring\\": "" 1871 | }, 1872 | "files": [ 1873 | "bootstrap.php" 1874 | ] 1875 | }, 1876 | "notification-url": "https://packagist.org/downloads/", 1877 | "license": [ 1878 | "MIT" 1879 | ], 1880 | "authors": [ 1881 | { 1882 | "name": "Nicolas Grekas", 1883 | "email": "p@tchwork.com" 1884 | }, 1885 | { 1886 | "name": "Symfony Community", 1887 | "homepage": "https://symfony.com/contributors" 1888 | } 1889 | ], 1890 | "description": "Symfony polyfill for the Mbstring extension", 1891 | "homepage": "https://symfony.com", 1892 | "keywords": [ 1893 | "compatibility", 1894 | "mbstring", 1895 | "polyfill", 1896 | "portable", 1897 | "shim" 1898 | ], 1899 | "time": "2019-02-06T07:57:58+00:00" 1900 | }, 1901 | { 1902 | "name": "symfony/routing", 1903 | "version": "v4.2.5", 1904 | "source": { 1905 | "type": "git", 1906 | "url": "https://github.com/symfony/routing.git", 1907 | "reference": "319f600c1ea0f981f6bdc2f042cfc1690957c0e0" 1908 | }, 1909 | "dist": { 1910 | "type": "zip", 1911 | "url": "https://api.github.com/repos/symfony/routing/zipball/319f600c1ea0f981f6bdc2f042cfc1690957c0e0", 1912 | "reference": "319f600c1ea0f981f6bdc2f042cfc1690957c0e0", 1913 | "shasum": "" 1914 | }, 1915 | "require": { 1916 | "php": "^7.1.3" 1917 | }, 1918 | "conflict": { 1919 | "symfony/config": "<4.2", 1920 | "symfony/dependency-injection": "<3.4", 1921 | "symfony/yaml": "<3.4" 1922 | }, 1923 | "require-dev": { 1924 | "doctrine/annotations": "~1.0", 1925 | "psr/log": "~1.0", 1926 | "symfony/config": "~4.2", 1927 | "symfony/dependency-injection": "~3.4|~4.0", 1928 | "symfony/expression-language": "~3.4|~4.0", 1929 | "symfony/http-foundation": "~3.4|~4.0", 1930 | "symfony/yaml": "~3.4|~4.0" 1931 | }, 1932 | "suggest": { 1933 | "doctrine/annotations": "For using the annotation loader", 1934 | "symfony/config": "For using the all-in-one router or any loader", 1935 | "symfony/expression-language": "For using expression matching", 1936 | "symfony/http-foundation": "For using a Symfony Request object", 1937 | "symfony/yaml": "For using the YAML loader" 1938 | }, 1939 | "type": "library", 1940 | "extra": { 1941 | "branch-alias": { 1942 | "dev-master": "4.2-dev" 1943 | } 1944 | }, 1945 | "autoload": { 1946 | "psr-4": { 1947 | "Symfony\\Component\\Routing\\": "" 1948 | }, 1949 | "exclude-from-classmap": [ 1950 | "/Tests/" 1951 | ] 1952 | }, 1953 | "notification-url": "https://packagist.org/downloads/", 1954 | "license": [ 1955 | "MIT" 1956 | ], 1957 | "authors": [ 1958 | { 1959 | "name": "Fabien Potencier", 1960 | "email": "fabien@symfony.com" 1961 | }, 1962 | { 1963 | "name": "Symfony Community", 1964 | "homepage": "https://symfony.com/contributors" 1965 | } 1966 | ], 1967 | "description": "Symfony Routing Component", 1968 | "homepage": "https://symfony.com", 1969 | "keywords": [ 1970 | "router", 1971 | "routing", 1972 | "uri", 1973 | "url" 1974 | ], 1975 | "time": "2019-03-30T15:58:42+00:00" 1976 | }, 1977 | { 1978 | "name": "symfony/translation", 1979 | "version": "v4.2.5", 1980 | "source": { 1981 | "type": "git", 1982 | "url": "https://github.com/symfony/translation.git", 1983 | "reference": "e46933cc31b68f51f7fc5470fb55550407520f56" 1984 | }, 1985 | "dist": { 1986 | "type": "zip", 1987 | "url": "https://api.github.com/repos/symfony/translation/zipball/e46933cc31b68f51f7fc5470fb55550407520f56", 1988 | "reference": "e46933cc31b68f51f7fc5470fb55550407520f56", 1989 | "shasum": "" 1990 | }, 1991 | "require": { 1992 | "php": "^7.1.3", 1993 | "symfony/contracts": "^1.0.2", 1994 | "symfony/polyfill-mbstring": "~1.0" 1995 | }, 1996 | "conflict": { 1997 | "symfony/config": "<3.4", 1998 | "symfony/dependency-injection": "<3.4", 1999 | "symfony/yaml": "<3.4" 2000 | }, 2001 | "provide": { 2002 | "symfony/translation-contracts-implementation": "1.0" 2003 | }, 2004 | "require-dev": { 2005 | "psr/log": "~1.0", 2006 | "symfony/config": "~3.4|~4.0", 2007 | "symfony/console": "~3.4|~4.0", 2008 | "symfony/dependency-injection": "~3.4|~4.0", 2009 | "symfony/finder": "~2.8|~3.0|~4.0", 2010 | "symfony/intl": "~3.4|~4.0", 2011 | "symfony/yaml": "~3.4|~4.0" 2012 | }, 2013 | "suggest": { 2014 | "psr/log-implementation": "To use logging capability in translator", 2015 | "symfony/config": "", 2016 | "symfony/yaml": "" 2017 | }, 2018 | "type": "library", 2019 | "extra": { 2020 | "branch-alias": { 2021 | "dev-master": "4.2-dev" 2022 | } 2023 | }, 2024 | "autoload": { 2025 | "psr-4": { 2026 | "Symfony\\Component\\Translation\\": "" 2027 | }, 2028 | "exclude-from-classmap": [ 2029 | "/Tests/" 2030 | ] 2031 | }, 2032 | "notification-url": "https://packagist.org/downloads/", 2033 | "license": [ 2034 | "MIT" 2035 | ], 2036 | "authors": [ 2037 | { 2038 | "name": "Fabien Potencier", 2039 | "email": "fabien@symfony.com" 2040 | }, 2041 | { 2042 | "name": "Symfony Community", 2043 | "homepage": "https://symfony.com/contributors" 2044 | } 2045 | ], 2046 | "description": "Symfony Translation Component", 2047 | "homepage": "https://symfony.com", 2048 | "time": "2019-04-01T14:13:08+00:00" 2049 | } 2050 | ], 2051 | "packages-dev": [], 2052 | "aliases": [], 2053 | "minimum-stability": "stable", 2054 | "stability-flags": [], 2055 | "prefer-stable": false, 2056 | "prefer-lowest": false, 2057 | "platform": { 2058 | "php": "^7.1.3" 2059 | }, 2060 | "platform-dev": [] 2061 | } 2062 | -------------------------------------------------------------------------------- /config/config.php: -------------------------------------------------------------------------------- 1 | env('SSO_SERVER'), 5 | 'sso_broker_id' => env('SSO_BROKER_ID'), 6 | 'sso_broker_secret' => env('SSO_BROKER_SECRET'), 7 | 'server_prefix' => env('SSO_SERVER_PREFIX', '/'), 8 | 'type' => env('SSO_TYPE', 'broker'), 9 | 'log_erros' => env('APP_DEBUG', false), 10 | ]; 11 | -------------------------------------------------------------------------------- /src/Broker.php: -------------------------------------------------------------------------------- 1 | url = $url; 27 | $this->broker = $broker; 28 | $this->secret = $secret; 29 | $this->cookie_lifetime = $cookie_lifetime; 30 | 31 | $cookieToken = \Request::cookie($this->getCookieName()); 32 | if (isset($cookieToken)) { 33 | $this->token = $cookieToken; 34 | } 35 | } 36 | 37 | /** 38 | * Generate session token 39 | */ 40 | public function generateToken() 41 | { 42 | if (isset($this->token)) { 43 | return; 44 | } 45 | 46 | $this->token = base_convert(md5(uniqid(rand(), true)), 16, 36); 47 | \Cookie::queue( 48 | \Cookie::make( 49 | $this->getCookieName(), 50 | $this->token, 51 | time() + $this->cookie_lifetime, 52 | '/' 53 | ) 54 | ); 55 | } 56 | 57 | public function attach($returnUrl = null) 58 | { 59 | if ($this->isAttached()) { 60 | return; 61 | } 62 | 63 | if ($returnUrl === true) { 64 | $protocol = !empty($_SERVER['HTTPS']) ? 'https://' : 'http://'; 65 | $returnUrl = $protocol . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; 66 | } 67 | 68 | $params = ['return_url' => $returnUrl]; 69 | $url = $this->getAttachUrl($params); 70 | 71 | return redirect($url, 307); 72 | } 73 | 74 | public function logout() 75 | { 76 | $this->request('POST', 'logout', 'logout'); 77 | $this->clearToken(); 78 | } 79 | 80 | protected function request($method, $command, $data = null) 81 | { 82 | if (!$this->isAttached()) { 83 | throw new NotAttachedException('No token'); 84 | } 85 | $url = $this->getRequestUrl($command, !$data || $method === 'POST' ? [] : $data); 86 | 87 | $ch = curl_init($url); 88 | curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 89 | curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method); 90 | curl_setopt($ch, CURLOPT_HTTPHEADER, 91 | ['Accept: application/json', 'Authorization: Bearer ' . $this->getSessionID()] 92 | ); 93 | 94 | if ($method === 'POST' && !empty($data)) { 95 | $post = is_string($data) ? $data : http_build_query($data); 96 | curl_setopt($ch, CURLOPT_POSTFIELDS, $post); 97 | } 98 | 99 | $response = curl_exec($ch); 100 | if (curl_errno($ch) != 0) { 101 | $message = 'Server request failed: ' . curl_error($ch); 102 | throw new Exception($message); 103 | } 104 | 105 | $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); 106 | list($contentType) = explode(';', curl_getinfo($ch, CURLINFO_CONTENT_TYPE)); 107 | 108 | if ($contentType != 'application/json' and $httpCode != 204) { 109 | $message = 'Expected application/json response, got ' . $contentType; 110 | throw new Exception($message); 111 | } 112 | 113 | $data = json_decode($response, true); 114 | if ($httpCode == 403) { 115 | $this->clearToken(); 116 | throw new NotAttachedException($data['error'] ?: $response, $httpCode); 117 | } 118 | if ($httpCode >= 400) { 119 | throw new Exception($data['error'] ?: $response, $httpCode); 120 | } 121 | 122 | return $data; 123 | } 124 | 125 | /** 126 | * Clears session token 127 | */ 128 | public function clearToken() 129 | { 130 | \Cookie::queue( 131 | \Cookie::forget($this->getCookieName()) 132 | ); 133 | $this->token = null; 134 | } 135 | } 136 | -------------------------------------------------------------------------------- /src/Guard/SsoGuard.php: -------------------------------------------------------------------------------- 1 | model = $model; 26 | $this->broker = $broker; 27 | } 28 | 29 | public function user() 30 | { 31 | if ($this->user !== null) { 32 | return $this->user; 33 | } 34 | try { 35 | $this->_setUser($this->broker->getUserInfo()); 36 | return $this->user; 37 | } catch (\Exception $e) { 38 | if (config('sso.log_erros')) { 39 | \Log::error($e->getMessage(), ['exception' => $e]); 40 | } 41 | return null; 42 | } 43 | } 44 | 45 | public function validate(array $credentials = []) 46 | { 47 | return (bool)$this->attempt($credentials, false); 48 | } 49 | 50 | public function attempt(array $credentials = []) 51 | { 52 | try { 53 | $this->_setUser($this->broker->login($credentials['email'], $credentials['password'])); 54 | return true; 55 | } catch (\Exception $e) { 56 | if (config('sso.log_erros')) { 57 | \Log::error($e->getMessage(), ['exception' => $e]); 58 | } 59 | return false; 60 | } 61 | } 62 | 63 | protected function _setUser($user){ 64 | $this->user = new $this->model($user['user']); 65 | } 66 | 67 | public function logout() 68 | { 69 | try { 70 | $this->broker->logout(); 71 | } catch (\Exception $e) { 72 | if (config('sso.log_erros')) { 73 | \Log::error($e->getMessage(), ['exception' => $e]); 74 | } 75 | } 76 | 77 | } 78 | 79 | public function setUser(Authenticatable $user) 80 | { 81 | throw new \Exception('Not implemented'); 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /src/Middleware/AttachBroker.php: -------------------------------------------------------------------------------- 1 | attach(true); 21 | if ($redirect) { 22 | return $redirect; 23 | } 24 | return $next($request); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/SSOServiceProvider.php: -------------------------------------------------------------------------------- 1 | app->singleton(Broker::class, function ($app) { 24 | $broker = new Broker( 25 | config('sso.sso_server'), 26 | config('sso.sso_broker_id'), 27 | config('sso.sso_broker_secret') 28 | ); 29 | return $broker; 30 | }); 31 | } 32 | } 33 | 34 | public function boot() 35 | { 36 | $this->publishes([ 37 | __DIR__ . '/../config/config.php' => config_path('sso.php'), 38 | ], 'config'); 39 | if (config('sso.type') == 'server') { 40 | \Route::middleware('api') 41 | ->prefix(config('sso.server_prefix')) 42 | ->any('/', function (Request $request) { 43 | $ssoServer = app(\App\Sso\Server::class); 44 | $command = $request->get('command'); 45 | 46 | if (!$command || !method_exists($ssoServer, $command)) { 47 | return response()->json(['error' => 'Unknown command'], 404); 48 | } 49 | 50 | return $ssoServer->$command(); 51 | 52 | }); 53 | } else { 54 | \Auth::extend('sso', function ($app, $name, array $config) { 55 | return new SsoGuard( 56 | app(Broker::class), $config['model'] 57 | ); 58 | }); 59 | } 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /src/Server.php: -------------------------------------------------------------------------------- 1 | options = $options + $this->options; 22 | $cacheDriver = $options['cache_driver'] ?? config('cache.default'); 23 | $this->cache = $cache->driver($cacheDriver); 24 | } 25 | 26 | protected function startUserSession() 27 | { 28 | if (session_status() !== PHP_SESSION_ACTIVE) session_start(); 29 | } 30 | 31 | /** 32 | * Ouput user information as json. 33 | */ 34 | public function userInfo() 35 | { 36 | $this->startBrokerSession(); 37 | $user = null; 38 | 39 | $username = $this->getSessionData('sso_user'); 40 | $user = $this->getUserInfo($username); 41 | if (!$user) { 42 | return $this->fail("Unauthenticated", 401); 43 | } 44 | 45 | return response()->json($user); 46 | } 47 | 48 | protected function getSessionData($key) 49 | { 50 | return $key === 'id' ? session_id() : \Session::get($key); 51 | } 52 | 53 | public function login() 54 | { 55 | $this->startBrokerSession(); 56 | 57 | $validation = \Validator::make(\Request::all(), [ 58 | 'username' => 'required', 59 | 'password' => 'required' 60 | ]); 61 | 62 | if ($validation->fails()) { 63 | $errors = json_encode((array)$validation->errors()); 64 | $this->fail($errors, 400); 65 | } 66 | 67 | $data = $validation->validated(); 68 | $validation = $this->authenticate($data['username'], $data['password']); 69 | 70 | if ($validation->failed()) { 71 | return $this->fail($validation->getError(), 400); 72 | } 73 | 74 | $this->setSessionData('sso_user', $_POST['username']); 75 | return $this->userInfo(); 76 | } 77 | 78 | public function logout() 79 | { 80 | $this->startBrokerSession(); 81 | $this->setSessionData('sso_user', null); 82 | 83 | return response()->json([], 204); 84 | } 85 | 86 | protected function setSessionData($key, $value) 87 | { 88 | !isset($value) ? \Session::forget($key) : \Session::put($key, $value); 89 | \Session::save(); 90 | } 91 | 92 | public function startBrokerSession() 93 | { 94 | if (isset($this->brokerId)) { 95 | return; 96 | } 97 | 98 | $sid = $this->getBrokerSessionID(); 99 | 100 | if ($sid === false) { 101 | $this->fail("Broker didn't send a session key", 400); 102 | return; 103 | } 104 | 105 | $linkedId = $this->cache->get($sid); 106 | 107 | if (!$linkedId) { 108 | $this->fail("The broker session id isn't attached to a user session", 403); 109 | return; 110 | } 111 | 112 | if (session_status() === PHP_SESSION_ACTIVE) { 113 | if ($linkedId !== session_id()) throw new \Exception("Session has already started", 400); 114 | return; 115 | } 116 | 117 | $this->setSessionId($linkedId); 118 | $this->brokerId = $this->validateBrokerSessionId($sid); 119 | } 120 | 121 | public function attach() 122 | { 123 | $this->detectReturnType(); 124 | 125 | if (empty($_REQUEST['broker'])) { 126 | return $this->fail("No broker specified", 400); 127 | } 128 | if (empty($_REQUEST['token'])) { 129 | return $this->fail("No token specified", 400); 130 | } 131 | 132 | if (!$this->returnType) { 133 | return $this->fail("No return url specified", 400); 134 | } 135 | 136 | $checksum = $this->generateAttachChecksum($_REQUEST['broker'], $_REQUEST['token']); 137 | 138 | if (empty($_REQUEST['checksum']) || $checksum != $_REQUEST['checksum']) { 139 | return $this->fail("Invalid checksum", 400); 140 | } 141 | 142 | $this->startUserSession(); 143 | $sid = $this->generateSessionId($_REQUEST['broker'], $_REQUEST['token']); 144 | 145 | $sessionId = $this->getSessionData('id'); 146 | $this->cache->put($sid, $sessionId); 147 | $this->setSessionId($sessionId); 148 | $this->outputAttachSuccess(); 149 | } 150 | 151 | public function setSessionId($id){ 152 | \Session::setId($id); 153 | \Session::start(); 154 | \Session::save(); 155 | } 156 | } 157 | --------------------------------------------------------------------------------