From e99aa9b8f17e888682f46eef54b655f0f8da2c0d Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Sun, 26 Apr 2026 16:25:59 +0330 Subject: [PATCH 1/4] use nginx and php-fpm for docker --- backend/Dockerfile | 44 ++++++++++++++++++++--------------- backend/Dockerfile.production | 23 ++++++++++++------ docker-compose.production.yml | 31 +++++++++++++++++------- docker-compose.yml | 28 +++++++++++++++++----- nginx/payment.conf | 21 +++++++++++++++++ 5 files changed, 106 insertions(+), 41 deletions(-) create mode 100644 nginx/payment.conf diff --git a/backend/Dockerfile b/backend/Dockerfile index c1d77b0f..e58f4534 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -1,28 +1,34 @@ -FROM docker.arvancloud.ir/dunglas/frankenphp:1.11.2-php8.5-trixie +FROM docker.arvancloud.ir/php:8.5-fpm-alpine3.23 -RUN apt-get update \ - && apt-get install -y --no-install-recommends libpq-dev \ +# Install common PHP extension dependencies +RUN apk update && apk add --no-cache \ + bash \ + curl \ + libpng \ + libpng-dev \ + libjpeg-turbo-dev \ + freetype-dev \ + libwebp-dev \ + libxml2-dev \ unzip \ - zip \ - && install-php-extensions pdo_pgsql pgsql \ - && apt-get clean \ - && rm -rf /var/lib/apt/lists/* + libzip-dev \ + libpq-dev \ + && docker-php-ext-configure gd --with-freetype --with-jpeg --with-webp \ + && docker-php-ext-install pdo_pgsql pdo_mysql gd zip +# Set the working directory WORKDIR /var/www/payment - -#ENV SERVER_NAME=your-domain-name.example.com - -# Copy Laravel application COPY . . -# Give permissions to storage and bootstrap/cache -RUN chmod -R 777 storage bootstrap/cache +RUN chmod -R 777 /var/www/payment/storage /var/www/payment/bootstrap/cache # Install Composer -COPY --from=docker.arvancloud.ir/composer:latest /usr/bin/composer /usr/bin/composer +COPY --from=composer:latest /usr/bin/composer /usr/bin/composer +ENV COMPOSER_ALLOW_SUPERUSER=1 -CMD composer install;\ - php artisan key:generate;\ - php artisan migrate;\ - php artisan db:seed;\ - frankenphp php-server -r public/ +# Default command +CMD composer install ;\ + php artisan key:generate ;\ + php artisan migrate ;\ + php artisan db:seed ;\ + php-fpm diff --git a/backend/Dockerfile.production b/backend/Dockerfile.production index 848908b5..bfc9a2fe 100644 --- a/backend/Dockerfile.production +++ b/backend/Dockerfile.production @@ -14,13 +14,22 @@ COPY . . RUN composer dump-autoload --optimize --classmap-authoritative -FROM docker.arvancloud.ir/dunglas/frankenphp:1.11.2-php8.5-trixie AS application +FROM docker.arvancloud.ir/php:8.5-fpm-alpine3.23 AS application -RUN apt-get update \ - && apt-get install -y --no-install-recommends libpq-dev unzip zip \ - && install-php-extensions pdo_pgsql pgsql \ - && apt-get clean \ - && rm -rf /var/lib/apt/lists/* +RUN apk update && apk add --no-cache \ + bash \ + curl \ + libpng \ + libpng-dev \ + libjpeg-turbo-dev \ + freetype-dev \ + libwebp-dev \ + libxml2-dev \ + unzip \ + libzip-dev \ + libpq-dev \ + && docker-php-ext-configure gd --with-freetype --with-jpeg --with-webp \ + && docker-php-ext-install pdo_pgsql pdo_mysql gd zip WORKDIR /var/www/payment @@ -29,4 +38,4 @@ COPY --from=builder /app /var/www/payment RUN chown -R www-data:www-data /var/www/payment \ && chmod -R 775 storage bootstrap/cache -CMD ["frankenphp", "php-server", "-r", "public/"] +CMD ["php-fpm"] diff --git a/docker-compose.production.yml b/docker-compose.production.yml index 1d4536a6..a37a07f1 100644 --- a/docker-compose.production.yml +++ b/docker-compose.production.yml @@ -1,6 +1,26 @@ services: + nginx: + image: docker.arvancloud.ir/nginx:stable-alpine3.23-perl + container_name: nginx + restart: unless-stopped + ports: + - "80:80" + volumes: + - ./nginx/payment.conf:/etc/nginx/conf.d/default.conf + - ${BACKEND_PATH}:/var/www/${PROJECT_NAME} + networks: + - payment + + redis: + image: docker.arvancloud.ir/redis:8.6.0-alpine3.23 + container_name: redis + restart: unless-stopped + tty: true + networks: + - payment + postgres: - image: docker.arvancloud.ir/postgres:17.8-alpine3.23 + image: docker.arvancloud.ir/postgres:18.3-alpine3.23 container_name: pgsql restart: unless-stopped ports: @@ -26,15 +46,8 @@ services: container_name: laravel tty: true restart: unless-stopped - healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:80"] - interval: 30s - timeout: 10s - retries: 3 ports: - - "8003:80" - - "443:443" - - "443:443/udp" + - "80:80" volumes: - ${BACKEND_PATH}:/var/www/${PROJECT_NAME} depends_on: diff --git a/docker-compose.yml b/docker-compose.yml index 2da7a427..ba90b320 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,6 +1,26 @@ services: + nginx: + image: docker.arvancloud.ir/nginx:stable-alpine3.23-perl + container_name: nginx + restart: unless-stopped + ports: + - "80:80" + volumes: + - ./nginx/payment.conf:/etc/nginx/conf.d/default.conf + - ${BACKEND_PATH}:/var/www/${PROJECT_NAME} + networks: + - payment + + redis: + image: docker.arvancloud.ir/redis:8.6.0-alpine3.23 + container_name: redis + restart: unless-stopped + tty: true + networks: + - payment + postgres: - image: docker.arvancloud.ir/postgres:17.8-alpine3.23 + image: docker.arvancloud.ir/postgres:18.3-alpine3.23 container_name: pgsql restart: unless-stopped ports: @@ -22,13 +42,9 @@ services: tty: true restart: unless-stopped ports: - - "8003:80" - - "443:443" - - "443:443/udp" + - "9000:9000" volumes: - ${BACKEND_PATH}:/var/www/${PROJECT_NAME} -# - caddy_data:/data -# - caddy_config:/config depends_on: - postgres networks: diff --git a/nginx/payment.conf b/nginx/payment.conf new file mode 100644 index 00000000..afcf76bb --- /dev/null +++ b/nginx/payment.conf @@ -0,0 +1,21 @@ +server { + listen 80; + listen [::]:80; + charset utf-8; + + location / { + try_files $uri $uri/ /index.php?$query_string; + } + + location ~ ^/index\.php(/|$) { + include fastcgi_params; + fastcgi_pass laravel:9000; + fastcgi_index index.php; + fastcgi_hide_header X-Powered-By; + fastcgi_param SCRIPT_FILENAME /var/www/payment/backend/public/index.php; + } + + location ~ /\.(?!well-known).* { + deny all; + } +} -- 2.49.1 From 52ed10f831ae529e24d9d2f01fd984ae7e4794bb Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Mon, 27 Apr 2026 14:35:04 +0330 Subject: [PATCH 2/4] remove production yaml files --- backend/Dockerfile | 35 ++++++++++------- backend/Dockerfile.production | 41 -------------------- docker-compose.production.yml | 73 ----------------------------------- docker-compose.yml | 18 ++++++++- 4 files changed, 37 insertions(+), 130 deletions(-) delete mode 100644 backend/Dockerfile.production delete mode 100644 docker-compose.production.yml diff --git a/backend/Dockerfile b/backend/Dockerfile index e58f4534..4c047139 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -1,6 +1,21 @@ -FROM docker.arvancloud.ir/php:8.5-fpm-alpine3.23 +FROM docker.arvancloud.ir/composer:latest AS builder + +WORKDIR /app + +COPY composer.json composer.lock ./ + +RUN composer install \ + --no-dev \ + --no-scripts \ + --no-autoloader \ + --prefer-dist + +COPY . . + +RUN composer dump-autoload --optimize --classmap-authoritative + +FROM php:8.5.3-fpm-alpine3.23 AS application -# Install common PHP extension dependencies RUN apk update && apk add --no-cache \ bash \ curl \ @@ -16,19 +31,11 @@ RUN apk update && apk add --no-cache \ && docker-php-ext-configure gd --with-freetype --with-jpeg --with-webp \ && docker-php-ext-install pdo_pgsql pdo_mysql gd zip -# Set the working directory WORKDIR /var/www/payment -COPY . . -RUN chmod -R 777 /var/www/payment/storage /var/www/payment/bootstrap/cache +COPY --from=builder /app /var/www/payment -# Install Composer -COPY --from=composer:latest /usr/bin/composer /usr/bin/composer -ENV COMPOSER_ALLOW_SUPERUSER=1 +RUN chown -R www-data:www-data /var/www/payment \ + && chmod -R 665 storage bootstrap/cache -# Default command -CMD composer install ;\ - php artisan key:generate ;\ - php artisan migrate ;\ - php artisan db:seed ;\ - php-fpm +CMD ["php-fpm"] diff --git a/backend/Dockerfile.production b/backend/Dockerfile.production deleted file mode 100644 index bfc9a2fe..00000000 --- a/backend/Dockerfile.production +++ /dev/null @@ -1,41 +0,0 @@ -FROM docker.arvancloud.ir/composer:latest AS builder - -WORKDIR /app - -COPY composer.json composer.lock ./ - -RUN composer install \ - --no-dev \ - --no-scripts \ - --no-autoloader \ - --prefer-dist - -COPY . . - -RUN composer dump-autoload --optimize --classmap-authoritative - -FROM docker.arvancloud.ir/php:8.5-fpm-alpine3.23 AS application - -RUN apk update && apk add --no-cache \ - bash \ - curl \ - libpng \ - libpng-dev \ - libjpeg-turbo-dev \ - freetype-dev \ - libwebp-dev \ - libxml2-dev \ - unzip \ - libzip-dev \ - libpq-dev \ - && docker-php-ext-configure gd --with-freetype --with-jpeg --with-webp \ - && docker-php-ext-install pdo_pgsql pdo_mysql gd zip - -WORKDIR /var/www/payment - -COPY --from=builder /app /var/www/payment - -RUN chown -R www-data:www-data /var/www/payment \ - && chmod -R 775 storage bootstrap/cache - -CMD ["php-fpm"] diff --git a/docker-compose.production.yml b/docker-compose.production.yml deleted file mode 100644 index a37a07f1..00000000 --- a/docker-compose.production.yml +++ /dev/null @@ -1,73 +0,0 @@ -services: - nginx: - image: docker.arvancloud.ir/nginx:stable-alpine3.23-perl - container_name: nginx - restart: unless-stopped - ports: - - "80:80" - volumes: - - ./nginx/payment.conf:/etc/nginx/conf.d/default.conf - - ${BACKEND_PATH}:/var/www/${PROJECT_NAME} - networks: - - payment - - redis: - image: docker.arvancloud.ir/redis:8.6.0-alpine3.23 - container_name: redis - restart: unless-stopped - tty: true - networks: - - payment - - postgres: - image: docker.arvancloud.ir/postgres:18.3-alpine3.23 - container_name: pgsql - restart: unless-stopped - ports: - - "8091:5432" - environment: - POSTGRES_DB: ${POSTGRES_DB} - POSTGRES_USER: ${POSTGRES_USER} - POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} - volumes: - - payment-db:/var/lib/postgresql/data - networks: - - payment - healthcheck: - test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"] - interval: 30s - timeout: 10s - retries: 3 - - backend: - build: - context: ${BACKEND_PATH} - dockerfile: Dockerfile.production - container_name: laravel - tty: true - restart: unless-stopped - ports: - - "80:80" - volumes: - - ${BACKEND_PATH}:/var/www/${PROJECT_NAME} - depends_on: - - postgres - networks: - - payment - logging: - driver: "syslog" - options: - syslog-address: "tcp://host.docker.internal:514" - tag: "laravel-backend" - syslog-facility: "daemon" - max-size: "10m" - mem_limit: 512M - cpus: 1 - -volumes: - payment-db: - driver: local - -networks: - payment: - driver: bridge \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index ba90b320..3feb97d6 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -4,7 +4,7 @@ services: container_name: nginx restart: unless-stopped ports: - - "80:80" + - "8000:80" volumes: - ./nginx/payment.conf:/etc/nginx/conf.d/default.conf - ${BACKEND_PATH}:/var/www/${PROJECT_NAME} @@ -20,7 +20,7 @@ services: - payment postgres: - image: docker.arvancloud.ir/postgres:18.3-alpine3.23 + image: postgres:18.2-alpine3.23 container_name: pgsql restart: unless-stopped ports: @@ -29,6 +29,11 @@ services: POSTGRES_DB: ${POSTGRES_DB} POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} + healthcheck: + test: [ "CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}" ] + interval: 30s + timeout: 10s + retries: 3 volumes: - payment-db:/var/lib/postgresql/data networks: @@ -49,6 +54,15 @@ services: - postgres networks: - payment +# logging: +# driver: "syslog" +# options: +# syslog-address: "tcp://host.docker.internal:514" +# tag: "laravel-backend" +# syslog-facility: "daemon" +# max-size: "10m" +# mem_limit: 512M +# cpus: 1 volumes: payment-db: -- 2.49.1 From 1dbd816da29a555bbae0d961d3ad0449416a91e7 Mon Sep 17 00:00:00 2001 From: amirghasempoor Date: Mon, 27 Apr 2026 15:18:35 +0330 Subject: [PATCH 3/4] add dockerfile for production --- backend/Dockerfile | 39 +++++++++++++++------------------ backend/Dockerfile.production | 41 +++++++++++++++++++++++++++++++++++ docker-compose.yml | 4 ++-- 3 files changed, 60 insertions(+), 24 deletions(-) create mode 100644 backend/Dockerfile.production diff --git a/backend/Dockerfile b/backend/Dockerfile index 4c047139..7a70c044 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -1,21 +1,6 @@ -FROM docker.arvancloud.ir/composer:latest AS builder - -WORKDIR /app - -COPY composer.json composer.lock ./ - -RUN composer install \ - --no-dev \ - --no-scripts \ - --no-autoloader \ - --prefer-dist - -COPY . . - -RUN composer dump-autoload --optimize --classmap-authoritative - -FROM php:8.5.3-fpm-alpine3.23 AS application +FROM php:8.5.3-fpm-alpine3.23 +# Install common PHP extension dependencies RUN apk update && apk add --no-cache \ bash \ curl \ @@ -29,13 +14,23 @@ RUN apk update && apk add --no-cache \ libzip-dev \ libpq-dev \ && docker-php-ext-configure gd --with-freetype --with-jpeg --with-webp \ - && docker-php-ext-install pdo_pgsql pdo_mysql gd zip + && docker-php-ext-install pdo_pgsql gd zip +# Set the working directory WORKDIR /var/www/payment -COPY --from=builder /app /var/www/payment +COPY . . -RUN chown -R www-data:www-data /var/www/payment \ - && chmod -R 665 storage bootstrap/cache +RUN chmod -R 665 /var/www/payment/storage /var/www/payment/bootstrap/cache -CMD ["php-fpm"] +# Install Composer +COPY --from=composer:latest /usr/bin/composer /usr/bin/composer +ENV COMPOSER_ALLOW_SUPERUSER=1 + +# Default command +CMD composer install ;\ + composer dump-autoload --optimize --classmap-authoritative ;\ + php artisan key:generate ;\ + php artisan migrate ;\ + php artisan db:seed ;\ + php-fpm diff --git a/backend/Dockerfile.production b/backend/Dockerfile.production new file mode 100644 index 00000000..e2a7d0cf --- /dev/null +++ b/backend/Dockerfile.production @@ -0,0 +1,41 @@ +FROM docker.arvancloud.ir/composer:latest AS builder + +WORKDIR /app + +COPY composer.json composer.lock ./ + +RUN composer install \ + --no-dev \ + --no-scripts \ + --no-autoloader \ + --prefer-dist + +COPY . . + +RUN composer dump-autoload --optimize --classmap-authoritative + +FROM php:8.5.3-fpm-alpine3.23 AS application + +RUN apk update && apk add --no-cache \ + bash \ + curl \ + libpng \ + libpng-dev \ + libjpeg-turbo-dev \ + freetype-dev \ + libwebp-dev \ + libxml2-dev \ + unzip \ + libzip-dev \ + libpq-dev \ + && docker-php-ext-configure gd --with-freetype --with-jpeg --with-webp \ + && docker-php-ext-install pdo_pgsql gd zip + +WORKDIR /var/www/payment + +COPY --from=builder /app /var/www/payment + +RUN chown -R www-data:www-data /var/www/payment \ + && chmod -R 665 storage bootstrap/cache + +CMD ["php-fpm"] diff --git a/docker-compose.yml b/docker-compose.yml index 3feb97d6..899c16e5 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,6 +1,6 @@ services: nginx: - image: docker.arvancloud.ir/nginx:stable-alpine3.23-perl + image: nginx:stable-alpine3.23-perl container_name: nginx restart: unless-stopped ports: @@ -12,7 +12,7 @@ services: - payment redis: - image: docker.arvancloud.ir/redis:8.6.0-alpine3.23 + image: redis:8.6.0-alpine3.23 container_name: redis restart: unless-stopped tty: true -- 2.49.1 From 4596025ba33119ffccddea70801a2106e6b456ba Mon Sep 17 00:00:00 2001 From: faezehzafarbakhsh Date: Mon, 27 Apr 2026 16:12:08 +0330 Subject: [PATCH 4/4] install passport --- backend/app/Models/User.php | 3 +- backend/app/Providers/AppServiceProvider.php | 3 +- backend/bootstrap/app.php | 1 + backend/composer.json | 3 +- backend/composer.lock | 1010 ++++++++++++++++- backend/config/auth.php | 4 + backend/config/passport.php | 48 + ...7_122415_create_oauth_auth_codes_table.php | 39 + ...22416_create_oauth_access_tokens_table.php | 41 + ...2417_create_oauth_refresh_tokens_table.php | 37 + ...4_27_122418_create_oauth_clients_table.php | 42 + ...122419_create_oauth_device_codes_table.php | 42 + backend/routes/api.php | 8 + docker-compose.yml | 4 +- 14 files changed, 1278 insertions(+), 7 deletions(-) create mode 100644 backend/config/passport.php create mode 100644 backend/database/migrations/2026_04_27_122415_create_oauth_auth_codes_table.php create mode 100644 backend/database/migrations/2026_04_27_122416_create_oauth_access_tokens_table.php create mode 100644 backend/database/migrations/2026_04_27_122417_create_oauth_refresh_tokens_table.php create mode 100644 backend/database/migrations/2026_04_27_122418_create_oauth_clients_table.php create mode 100644 backend/database/migrations/2026_04_27_122419_create_oauth_device_codes_table.php create mode 100644 backend/routes/api.php diff --git a/backend/app/Models/User.php b/backend/app/Models/User.php index f6ba1d2e..f62f69bb 100644 --- a/backend/app/Models/User.php +++ b/backend/app/Models/User.php @@ -9,13 +9,14 @@ use Illuminate\Database\Eloquent\Attributes\Hidden; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; +use Laravel\Passport\HasApiTokens; #[Fillable(['name', 'email', 'password'])] #[Hidden(['password', 'remember_token'])] class User extends Authenticatable { /** @use HasFactory */ - use HasFactory, Notifiable; + use HasFactory, Notifiable, HasApiTokens; /** * Get the attributes that should be cast. diff --git a/backend/app/Providers/AppServiceProvider.php b/backend/app/Providers/AppServiceProvider.php index 452e6b65..bbedac67 100644 --- a/backend/app/Providers/AppServiceProvider.php +++ b/backend/app/Providers/AppServiceProvider.php @@ -3,6 +3,7 @@ namespace App\Providers; use Illuminate\Support\ServiceProvider; +use Laravel\Passport\Passport; class AppServiceProvider extends ServiceProvider { @@ -19,6 +20,6 @@ class AppServiceProvider extends ServiceProvider */ public function boot(): void { - // + Passport::enablePasswordGrant(); } } diff --git a/backend/bootstrap/app.php b/backend/bootstrap/app.php index c1832766..c3928c57 100644 --- a/backend/bootstrap/app.php +++ b/backend/bootstrap/app.php @@ -7,6 +7,7 @@ use Illuminate\Foundation\Configuration\Middleware; return Application::configure(basePath: dirname(__DIR__)) ->withRouting( web: __DIR__.'/../routes/web.php', + api: __DIR__.'/../routes/api.php', commands: __DIR__.'/../routes/console.php', health: '/up', ) diff --git a/backend/composer.json b/backend/composer.json index 98ec92e4..d8fdf089 100644 --- a/backend/composer.json +++ b/backend/composer.json @@ -11,6 +11,7 @@ "require": { "php": "^8.3", "laravel/framework": "^13.0", + "laravel/passport": "^13.0", "laravel/tinker": "^3.0" }, "require-dev": { @@ -86,4 +87,4 @@ }, "minimum-stability": "stable", "prefer-stable": true -} \ No newline at end of file +} diff --git a/backend/composer.lock b/backend/composer.lock index 7b2124f5..72005dd0 100644 --- a/backend/composer.lock +++ b/backend/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "2af3ccbaaf28845c404c1bd165e5a386", + "content-hash": "7298a47753c91eab121f7ef9a163f9f2", "packages": [ { "name": "brick/math", @@ -135,6 +135,73 @@ ], "time": "2024-02-09T16:56:22+00:00" }, + { + "name": "defuse/php-encryption", + "version": "v2.4.0", + "source": { + "type": "git", + "url": "https://github.com/defuse/php-encryption.git", + "reference": "f53396c2d34225064647a05ca76c1da9d99e5828" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/defuse/php-encryption/zipball/f53396c2d34225064647a05ca76c1da9d99e5828", + "reference": "f53396c2d34225064647a05ca76c1da9d99e5828", + "shasum": "" + }, + "require": { + "ext-openssl": "*", + "paragonie/random_compat": ">= 2", + "php": ">=5.6.0" + }, + "require-dev": { + "phpunit/phpunit": "^5|^6|^7|^8|^9|^10", + "yoast/phpunit-polyfills": "^2.0.0" + }, + "bin": [ + "bin/generate-defuse-key" + ], + "type": "library", + "autoload": { + "psr-4": { + "Defuse\\Crypto\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Hornby", + "email": "taylor@defuse.ca", + "homepage": "https://defuse.ca/" + }, + { + "name": "Scott Arciszewski", + "email": "info@paragonie.com", + "homepage": "https://paragonie.com" + } + ], + "description": "Secure PHP Encryption Library", + "keywords": [ + "aes", + "authenticated encryption", + "cipher", + "crypto", + "cryptography", + "encrypt", + "encryption", + "openssl", + "security", + "symmetric key cryptography" + ], + "support": { + "issues": "https://github.com/defuse/php-encryption/issues", + "source": "https://github.com/defuse/php-encryption/tree/v2.4.0" + }, + "time": "2023-06-19T06:10:36+00:00" + }, { "name": "dflydev/dot-access-data", "version": "v3.0.3", @@ -508,6 +575,70 @@ ], "time": "2025-03-06T22:45:56+00:00" }, + { + "name": "firebase/php-jwt", + "version": "v7.0.5", + "source": { + "type": "git", + "url": "https://github.com/googleapis/php-jwt.git", + "reference": "47ad26bab5e7c70ae8a6f08ed25ff83631121380" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/googleapis/php-jwt/zipball/47ad26bab5e7c70ae8a6f08ed25ff83631121380", + "reference": "47ad26bab5e7c70ae8a6f08ed25ff83631121380", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "guzzlehttp/guzzle": "^7.4", + "phpfastcache/phpfastcache": "^9.2", + "phpspec/prophecy-phpunit": "^2.0", + "phpunit/phpunit": "^9.5", + "psr/cache": "^2.0||^3.0", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0" + }, + "suggest": { + "ext-sodium": "Support EdDSA (Ed25519) signatures", + "paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present" + }, + "type": "library", + "autoload": { + "psr-4": { + "Firebase\\JWT\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Neuman Vong", + "email": "neuman+pear@twilio.com", + "role": "Developer" + }, + { + "name": "Anant Narayanan", + "email": "anant@php.net", + "role": "Developer" + } + ], + "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.", + "homepage": "https://github.com/firebase/php-jwt", + "keywords": [ + "jwt", + "php" + ], + "support": { + "issues": "https://github.com/googleapis/php-jwt/issues", + "source": "https://github.com/googleapis/php-jwt/tree/v7.0.5" + }, + "time": "2026-04-01T20:38:03+00:00" + }, { "name": "fruitcake/php-cors", "version": "v1.4.0", @@ -1276,6 +1407,81 @@ }, "time": "2026-04-21T13:32:11+00:00" }, + { + "name": "laravel/passport", + "version": "v13.7.5", + "source": { + "type": "git", + "url": "https://github.com/laravel/passport.git", + "reference": "90053dc4ba681c076855779250109bb624f961f6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/passport/zipball/90053dc4ba681c076855779250109bb624f961f6", + "reference": "90053dc4ba681c076855779250109bb624f961f6", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-openssl": "*", + "firebase/php-jwt": "^6.4|^7.0", + "illuminate/auth": "^11.35|^12.0|^13.0", + "illuminate/console": "^11.35|^12.0|^13.0", + "illuminate/container": "^11.35|^12.0|^13.0", + "illuminate/contracts": "^11.35|^12.0|^13.0", + "illuminate/cookie": "^11.35|^12.0|^13.0", + "illuminate/database": "^11.35|^12.0|^13.0", + "illuminate/encryption": "^11.35|^12.0|^13.0", + "illuminate/http": "^11.35|^12.0|^13.0", + "illuminate/support": "^11.35|^12.0|^13.0", + "league/oauth2-server": "^9.2", + "php": "^8.2", + "php-http/discovery": "^1.20", + "phpseclib/phpseclib": "^3.0", + "psr/http-factory-implementation": "*", + "symfony/console": "^7.1|^8.0", + "symfony/psr-http-message-bridge": "^7.1|^8.0" + }, + "require-dev": { + "orchestra/testbench": "^9.15|^10.8|^11.0", + "phpstan/phpstan": "^2.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laravel\\Passport\\PassportServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Passport\\": "src/", + "Laravel\\Passport\\Database\\Factories\\": "database/factories/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Laravel Passport provides OAuth2 server support to Laravel.", + "keywords": [ + "laravel", + "oauth", + "passport" + ], + "support": { + "issues": "https://github.com/laravel/passport/issues", + "source": "https://github.com/laravel/passport" + }, + "time": "2026-04-16T14:00:29+00:00" + }, { "name": "laravel/prompts", "version": "v0.3.17", @@ -1465,6 +1671,143 @@ }, "time": "2026-03-17T14:54:13+00:00" }, + { + "name": "lcobucci/clock", + "version": "3.6.0", + "source": { + "type": "git", + "url": "https://github.com/lcobucci/clock.git", + "reference": "4cdd88f761e9be9095ccbedf3e08d61ae216c643" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/lcobucci/clock/zipball/4cdd88f761e9be9095ccbedf3e08d61ae216c643", + "reference": "4cdd88f761e9be9095ccbedf3e08d61ae216c643", + "shasum": "" + }, + "require": { + "php": "~8.4.0 || ~8.5.0", + "psr/clock": "^1.0" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "require-dev": { + "infection/infection": "^0.32", + "lcobucci/coding-standard": "^12.0", + "phpstan/extension-installer": "^1.3.1", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-deprecation-rules": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpstan/phpstan-strict-rules": "^2.0", + "phpunit/phpunit": "^13.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Lcobucci\\Clock\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Luís Cobucci", + "email": "lcobucci@gmail.com" + } + ], + "description": "Yet another clock abstraction", + "support": { + "issues": "https://github.com/lcobucci/clock/issues", + "source": "https://github.com/lcobucci/clock/tree/3.6.0" + }, + "funding": [ + { + "url": "https://github.com/lcobucci", + "type": "github" + }, + { + "url": "https://www.patreon.com/lcobucci", + "type": "patreon" + } + ], + "time": "2026-04-13T21:30:16+00:00" + }, + { + "name": "lcobucci/jwt", + "version": "5.6.0", + "source": { + "type": "git", + "url": "https://github.com/lcobucci/jwt.git", + "reference": "bb3e9f21e4196e8afc41def81ef649c164bca25e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/lcobucci/jwt/zipball/bb3e9f21e4196e8afc41def81ef649c164bca25e", + "reference": "bb3e9f21e4196e8afc41def81ef649c164bca25e", + "shasum": "" + }, + "require": { + "ext-openssl": "*", + "ext-sodium": "*", + "php": "~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0", + "psr/clock": "^1.0" + }, + "require-dev": { + "infection/infection": "^0.29", + "lcobucci/clock": "^3.2", + "lcobucci/coding-standard": "^11.0", + "phpbench/phpbench": "^1.2", + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan": "^1.10.7", + "phpstan/phpstan-deprecation-rules": "^1.1.3", + "phpstan/phpstan-phpunit": "^1.3.10", + "phpstan/phpstan-strict-rules": "^1.5.0", + "phpunit/phpunit": "^11.1" + }, + "suggest": { + "lcobucci/clock": ">= 3.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Lcobucci\\JWT\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Luís Cobucci", + "email": "lcobucci@gmail.com", + "role": "Developer" + } + ], + "description": "A simple library to work with JSON Web Token and JSON Web Signature", + "keywords": [ + "JWS", + "jwt" + ], + "support": { + "issues": "https://github.com/lcobucci/jwt/issues", + "source": "https://github.com/lcobucci/jwt/tree/5.6.0" + }, + "funding": [ + { + "url": "https://github.com/lcobucci", + "type": "github" + }, + { + "url": "https://www.patreon.com/lcobucci", + "type": "patreon" + } + ], + "time": "2025-10-17T11:30:53+00:00" + }, { "name": "league/commonmark", "version": "2.8.2", @@ -1654,6 +1997,65 @@ ], "time": "2022-12-11T20:36:23+00:00" }, + { + "name": "league/event", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/event.git", + "reference": "ec38ff7ea10cad7d99a79ac937fbcffb9334c210" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/event/zipball/ec38ff7ea10cad7d99a79ac937fbcffb9334c210", + "reference": "ec38ff7ea10cad7d99a79ac937fbcffb9334c210", + "shasum": "" + }, + "require": { + "php": ">=7.2.0", + "psr/event-dispatcher": "^1.0" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.16", + "phpstan/phpstan": "^0.12.45", + "phpunit/phpunit": "^8.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Event\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frenky.net" + } + ], + "description": "Event package", + "keywords": [ + "emitter", + "event", + "listener" + ], + "support": { + "issues": "https://github.com/thephpleague/event/issues", + "source": "https://github.com/thephpleague/event/tree/3.0.3" + }, + "time": "2024-09-04T16:06:53+00:00" + }, { "name": "league/flysystem", "version": "3.33.0", @@ -1842,6 +2244,102 @@ ], "time": "2024-09-21T08:32:55+00:00" }, + { + "name": "league/oauth2-server", + "version": "9.3.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/oauth2-server.git", + "reference": "d8e2f39f645a82b207bbac441694d6e6079357cb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/oauth2-server/zipball/d8e2f39f645a82b207bbac441694d6e6079357cb", + "reference": "d8e2f39f645a82b207bbac441694d6e6079357cb", + "shasum": "" + }, + "require": { + "defuse/php-encryption": "^2.4", + "ext-json": "*", + "ext-openssl": "*", + "lcobucci/clock": "^2.3 || ^3.0", + "lcobucci/jwt": "^5.0", + "league/event": "^3.0", + "league/uri": "^7.0", + "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0", + "psr/http-message": "^2.0", + "psr/http-server-middleware": "^1.0" + }, + "replace": { + "league/oauth2server": "*", + "lncd/oauth2": "*" + }, + "require-dev": { + "laminas/laminas-diactoros": "^3.5", + "php-parallel-lint/php-parallel-lint": "^1.3.2", + "phpstan/extension-installer": "^1.3.1", + "phpstan/phpstan": "^1.12|^2.0", + "phpstan/phpstan-deprecation-rules": "^1.1.4|^2.0", + "phpstan/phpstan-phpunit": "^1.3.15|^2.0", + "phpstan/phpstan-strict-rules": "^1.5.2|^2.0", + "phpunit/phpunit": "^10.5|^11.5|^12.0", + "roave/security-advisories": "dev-master", + "slevomat/coding-standard": "^8.14.1", + "squizlabs/php_codesniffer": "^3.8" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\OAuth2\\Server\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Alex Bilbie", + "email": "hello@alexbilbie.com", + "homepage": "http://www.alexbilbie.com", + "role": "Developer" + }, + { + "name": "Andy Millington", + "email": "andrew@noexceptions.io", + "homepage": "https://www.noexceptions.io", + "role": "Developer" + } + ], + "description": "A lightweight and powerful OAuth 2.0 authorization and resource server library with support for all the core specification grants. This library will allow you to secure your API with OAuth and allow your applications users to approve apps that want to access their data from your API.", + "homepage": "https://oauth2.thephpleague.com/", + "keywords": [ + "Authentication", + "api", + "auth", + "authorisation", + "authorization", + "oauth", + "oauth 2", + "oauth 2.0", + "oauth2", + "protect", + "resource", + "secure", + "server" + ], + "support": { + "issues": "https://github.com/thephpleague/oauth2-server/issues", + "source": "https://github.com/thephpleague/oauth2-server/tree/9.3.0" + }, + "funding": [ + { + "url": "https://github.com/sephster", + "type": "github" + } + ], + "time": "2025-11-25T22:51:15+00:00" + }, { "name": "league/uri", "version": "7.8.1", @@ -2535,6 +3033,204 @@ ], "time": "2026-02-16T23:10:27+00:00" }, + { + "name": "paragonie/constant_time_encoding", + "version": "v3.1.3", + "source": { + "type": "git", + "url": "https://github.com/paragonie/constant_time_encoding.git", + "reference": "d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77", + "reference": "d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77", + "shasum": "" + }, + "require": { + "php": "^8" + }, + "require-dev": { + "infection/infection": "^0", + "nikic/php-fuzzer": "^0", + "phpunit/phpunit": "^9|^10|^11", + "vimeo/psalm": "^4|^5|^6" + }, + "type": "library", + "autoload": { + "psr-4": { + "ParagonIE\\ConstantTime\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com", + "role": "Maintainer" + }, + { + "name": "Steve 'Sc00bz' Thomas", + "email": "steve@tobtu.com", + "homepage": "https://www.tobtu.com", + "role": "Original Developer" + } + ], + "description": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)", + "keywords": [ + "base16", + "base32", + "base32_decode", + "base32_encode", + "base64", + "base64_decode", + "base64_encode", + "bin2hex", + "encoding", + "hex", + "hex2bin", + "rfc4648" + ], + "support": { + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/constant_time_encoding/issues", + "source": "https://github.com/paragonie/constant_time_encoding" + }, + "time": "2025-09-24T15:06:41+00:00" + }, + { + "name": "paragonie/random_compat", + "version": "v9.99.100", + "source": { + "type": "git", + "url": "https://github.com/paragonie/random_compat.git", + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a", + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a", + "shasum": "" + }, + "require": { + "php": ">= 7" + }, + "require-dev": { + "phpunit/phpunit": "4.*|5.*", + "vimeo/psalm": "^1" + }, + "suggest": { + "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com" + } + ], + "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", + "keywords": [ + "csprng", + "polyfill", + "pseudorandom", + "random" + ], + "support": { + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/random_compat/issues", + "source": "https://github.com/paragonie/random_compat" + }, + "time": "2020-10-15T08:29:30+00:00" + }, + { + "name": "php-http/discovery", + "version": "1.20.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/discovery.git", + "reference": "82fe4c73ef3363caed49ff8dd1539ba06044910d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/discovery/zipball/82fe4c73ef3363caed49ff8dd1539ba06044910d", + "reference": "82fe4c73ef3363caed49ff8dd1539ba06044910d", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0|^2.0", + "php": "^7.1 || ^8.0" + }, + "conflict": { + "nyholm/psr7": "<1.0", + "zendframework/zend-diactoros": "*" + }, + "provide": { + "php-http/async-client-implementation": "*", + "php-http/client-implementation": "*", + "psr/http-client-implementation": "*", + "psr/http-factory-implementation": "*", + "psr/http-message-implementation": "*" + }, + "require-dev": { + "composer/composer": "^1.0.2|^2.0", + "graham-campbell/phpspec-skip-example-extension": "^5.0", + "php-http/httplug": "^1.0 || ^2.0", + "php-http/message-factory": "^1.0", + "phpspec/phpspec": "^5.1 || ^6.1 || ^7.3", + "sebastian/comparator": "^3.0.5 || ^4.0.8", + "symfony/phpunit-bridge": "^6.4.4 || ^7.0.1" + }, + "type": "composer-plugin", + "extra": { + "class": "Http\\Discovery\\Composer\\Plugin", + "plugin-optional": true + }, + "autoload": { + "psr-4": { + "Http\\Discovery\\": "src/" + }, + "exclude-from-classmap": [ + "src/Composer/Plugin.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Finds and installs PSR-7, PSR-17, PSR-18 and HTTPlug implementations", + "homepage": "http://php-http.org", + "keywords": [ + "adapter", + "client", + "discovery", + "factory", + "http", + "message", + "psr17", + "psr7" + ], + "support": { + "issues": "https://github.com/php-http/discovery/issues", + "source": "https://github.com/php-http/discovery/tree/1.20.0" + }, + "time": "2024-10-02T11:20:13+00:00" + }, { "name": "phpoption/phpoption", "version": "1.9.5", @@ -2610,6 +3306,116 @@ ], "time": "2025-12-27T19:41:33+00:00" }, + { + "name": "phpseclib/phpseclib", + "version": "3.0.52", + "source": { + "type": "git", + "url": "https://github.com/phpseclib/phpseclib.git", + "reference": "2adaefc83df2ec548558307690f376dd7d4f4fce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/2adaefc83df2ec548558307690f376dd7d4f4fce", + "reference": "2adaefc83df2ec548558307690f376dd7d4f4fce", + "shasum": "" + }, + "require": { + "paragonie/constant_time_encoding": "^1|^2|^3", + "paragonie/random_compat": "^1.4|^2.0|^9.99.99", + "php": ">=5.6.1" + }, + "require-dev": { + "phpunit/phpunit": "*" + }, + "suggest": { + "ext-dom": "Install the DOM extension to load XML formatted public keys.", + "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.", + "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.", + "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.", + "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations." + }, + "type": "library", + "autoload": { + "files": [ + "phpseclib/bootstrap.php" + ], + "psr-4": { + "phpseclib3\\": "phpseclib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jim Wigginton", + "email": "terrafrost@php.net", + "role": "Lead Developer" + }, + { + "name": "Patrick Monnerat", + "email": "pm@datasphere.ch", + "role": "Developer" + }, + { + "name": "Andreas Fischer", + "email": "bantu@phpbb.com", + "role": "Developer" + }, + { + "name": "Hans-Jürgen Petrich", + "email": "petrich@tronic-media.com", + "role": "Developer" + }, + { + "name": "Graham Campbell", + "email": "graham@alt-three.com", + "role": "Developer" + } + ], + "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.", + "homepage": "http://phpseclib.sourceforge.net", + "keywords": [ + "BigInteger", + "aes", + "asn.1", + "asn1", + "blowfish", + "crypto", + "cryptography", + "encryption", + "rsa", + "security", + "sftp", + "signature", + "signing", + "ssh", + "twofish", + "x.509", + "x509" + ], + "support": { + "issues": "https://github.com/phpseclib/phpseclib/issues", + "source": "https://github.com/phpseclib/phpseclib/tree/3.0.52" + }, + "funding": [ + { + "url": "https://github.com/terrafrost", + "type": "github" + }, + { + "url": "https://www.patreon.com/phpseclib", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpseclib/phpseclib", + "type": "tidelift" + } + ], + "time": "2026-04-27T07:02:15+00:00" + }, { "name": "psr/clock", "version": "1.0.0", @@ -2921,6 +3727,119 @@ }, "time": "2023-04-04T09:54:51+00:00" }, + { + "name": "psr/http-server-handler", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-server-handler.git", + "reference": "84c4fb66179be4caaf8e97bd239203245302e7d4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-server-handler/zipball/84c4fb66179be4caaf8e97bd239203245302e7d4", + "reference": "84c4fb66179be4caaf8e97bd239203245302e7d4", + "shasum": "" + }, + "require": { + "php": ">=7.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Server\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP server-side request handler", + "keywords": [ + "handler", + "http", + "http-interop", + "psr", + "psr-15", + "psr-7", + "request", + "response", + "server" + ], + "support": { + "source": "https://github.com/php-fig/http-server-handler/tree/1.0.2" + }, + "time": "2023-04-10T20:06:20+00:00" + }, + { + "name": "psr/http-server-middleware", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-server-middleware.git", + "reference": "c1481f747daaa6a0782775cd6a8c26a1bf4a3829" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-server-middleware/zipball/c1481f747daaa6a0782775cd6a8c26a1bf4a3829", + "reference": "c1481f747daaa6a0782775cd6a8c26a1bf4a3829", + "shasum": "" + }, + "require": { + "php": ">=7.0", + "psr/http-message": "^1.0 || ^2.0", + "psr/http-server-handler": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Server\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP server-side middleware", + "keywords": [ + "http", + "http-interop", + "middleware", + "psr", + "psr-15", + "psr-7", + "request", + "response" + ], + "support": { + "issues": "https://github.com/php-fig/http-server-middleware/issues", + "source": "https://github.com/php-fig/http-server-middleware/tree/1.0.2" + }, + "time": "2023-04-11T06:14:47+00:00" + }, { "name": "psr/log", "version": "3.0.2", @@ -5076,6 +5995,93 @@ ], "time": "2026-03-30T15:14:47+00:00" }, + { + "name": "symfony/psr-http-message-bridge", + "version": "v8.0.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/psr-http-message-bridge.git", + "reference": "94facc221260c1d5f20e31ee43cd6c6a824b4a19" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/94facc221260c1d5f20e31ee43cd6c6a824b4a19", + "reference": "94facc221260c1d5f20e31ee43cd6c6a824b4a19", + "shasum": "" + }, + "require": { + "php": ">=8.4", + "psr/http-message": "^1.0|^2.0", + "symfony/http-foundation": "^7.4|^8.0" + }, + "conflict": { + "php-http/discovery": "<1.15" + }, + "require-dev": { + "nyholm/psr7": "^1.1", + "php-http/discovery": "^1.15", + "psr/log": "^1.1.4|^2|^3", + "symfony/browser-kit": "^7.4|^8.0", + "symfony/config": "^7.4|^8.0", + "symfony/event-dispatcher": "^7.4|^8.0", + "symfony/framework-bundle": "^7.4|^8.0", + "symfony/http-kernel": "^7.4|^8.0", + "symfony/runtime": "^7.4|^8.0" + }, + "type": "symfony-bridge", + "autoload": { + "psr-4": { + "Symfony\\Bridge\\PsrHttpMessage\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "PSR HTTP message bridge", + "homepage": "https://symfony.com", + "keywords": [ + "http", + "http-message", + "psr-17", + "psr-7" + ], + "support": { + "source": "https://github.com/symfony/psr-http-message-bridge/tree/v8.0.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-03-30T15:14:47+00:00" + }, { "name": "symfony/routing", "version": "v8.0.8", @@ -9091,5 +10097,5 @@ "php": "^8.3" }, "platform-dev": {}, - "plugin-api-version": "2.6.0" + "plugin-api-version": "2.9.0" } diff --git a/backend/config/auth.php b/backend/config/auth.php index d7568ff1..d0c87999 100644 --- a/backend/config/auth.php +++ b/backend/config/auth.php @@ -42,6 +42,10 @@ return [ 'driver' => 'session', 'provider' => 'users', ], + 'api' => [ + 'driver' => 'passport', + 'provider' => 'users', + ], ], /* diff --git a/backend/config/passport.php b/backend/config/passport.php new file mode 100644 index 00000000..aed43589 --- /dev/null +++ b/backend/config/passport.php @@ -0,0 +1,48 @@ + 'web', + + 'middleware' => [], + + /* + |-------------------------------------------------------------------------- + | Encryption Keys + |-------------------------------------------------------------------------- + | + | Passport uses encryption keys while generating secure access tokens for + | your application. By default, the keys are stored as local files but + | can be set via environment variables when that is more convenient. + | + */ + + 'private_key' => env('PASSPORT_PRIVATE_KEY'), + + 'public_key' => env('PASSPORT_PUBLIC_KEY'), + + /* + |-------------------------------------------------------------------------- + | Passport Database Connection + |-------------------------------------------------------------------------- + | + | By default, Passport's models will utilize your application's default + | database connection. If you wish to use a different connection you + | may specify the configured name of the database connection here. + | + */ + + 'connection' => env('PASSPORT_CONNECTION'), + +]; diff --git a/backend/database/migrations/2026_04_27_122415_create_oauth_auth_codes_table.php b/backend/database/migrations/2026_04_27_122415_create_oauth_auth_codes_table.php new file mode 100644 index 00000000..c700b50e --- /dev/null +++ b/backend/database/migrations/2026_04_27_122415_create_oauth_auth_codes_table.php @@ -0,0 +1,39 @@ +char('id', 80)->primary(); + $table->foreignId('user_id')->index(); + $table->foreignUuid('client_id'); + $table->text('scopes')->nullable(); + $table->boolean('revoked'); + $table->dateTime('expires_at')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('oauth_auth_codes'); + } + + /** + * Get the migration connection name. + */ + public function getConnection(): ?string + { + return $this->connection ?? config('passport.connection'); + } +}; diff --git a/backend/database/migrations/2026_04_27_122416_create_oauth_access_tokens_table.php b/backend/database/migrations/2026_04_27_122416_create_oauth_access_tokens_table.php new file mode 100644 index 00000000..3e50f7f7 --- /dev/null +++ b/backend/database/migrations/2026_04_27_122416_create_oauth_access_tokens_table.php @@ -0,0 +1,41 @@ +char('id', 80)->primary(); + $table->foreignId('user_id')->nullable()->index(); + $table->foreignUuid('client_id'); + $table->string('name')->nullable(); + $table->text('scopes')->nullable(); + $table->boolean('revoked'); + $table->timestamps(); + $table->dateTime('expires_at')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('oauth_access_tokens'); + } + + /** + * Get the migration connection name. + */ + public function getConnection(): ?string + { + return $this->connection ?? config('passport.connection'); + } +}; diff --git a/backend/database/migrations/2026_04_27_122417_create_oauth_refresh_tokens_table.php b/backend/database/migrations/2026_04_27_122417_create_oauth_refresh_tokens_table.php new file mode 100644 index 00000000..afb3c55c --- /dev/null +++ b/backend/database/migrations/2026_04_27_122417_create_oauth_refresh_tokens_table.php @@ -0,0 +1,37 @@ +char('id', 80)->primary(); + $table->char('access_token_id', 80)->index(); + $table->boolean('revoked'); + $table->dateTime('expires_at')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('oauth_refresh_tokens'); + } + + /** + * Get the migration connection name. + */ + public function getConnection(): ?string + { + return $this->connection ?? config('passport.connection'); + } +}; diff --git a/backend/database/migrations/2026_04_27_122418_create_oauth_clients_table.php b/backend/database/migrations/2026_04_27_122418_create_oauth_clients_table.php new file mode 100644 index 00000000..9794dc86 --- /dev/null +++ b/backend/database/migrations/2026_04_27_122418_create_oauth_clients_table.php @@ -0,0 +1,42 @@ +uuid('id')->primary(); + $table->nullableMorphs('owner'); + $table->string('name'); + $table->string('secret')->nullable(); + $table->string('provider')->nullable(); + $table->text('redirect_uris'); + $table->text('grant_types'); + $table->boolean('revoked'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('oauth_clients'); + } + + /** + * Get the migration connection name. + */ + public function getConnection(): ?string + { + return $this->connection ?? config('passport.connection'); + } +}; diff --git a/backend/database/migrations/2026_04_27_122419_create_oauth_device_codes_table.php b/backend/database/migrations/2026_04_27_122419_create_oauth_device_codes_table.php new file mode 100644 index 00000000..ea078319 --- /dev/null +++ b/backend/database/migrations/2026_04_27_122419_create_oauth_device_codes_table.php @@ -0,0 +1,42 @@ +char('id', 80)->primary(); + $table->foreignId('user_id')->nullable()->index(); + $table->foreignUuid('client_id')->index(); + $table->char('user_code', 8)->unique(); + $table->text('scopes'); + $table->boolean('revoked'); + $table->dateTime('user_approved_at')->nullable(); + $table->dateTime('last_polled_at')->nullable(); + $table->dateTime('expires_at')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('oauth_device_codes'); + } + + /** + * Get the migration connection name. + */ + public function getConnection(): ?string + { + return $this->connection ?? config('passport.connection'); + } +}; diff --git a/backend/routes/api.php b/backend/routes/api.php new file mode 100644 index 00000000..f35f6f84 --- /dev/null +++ b/backend/routes/api.php @@ -0,0 +1,8 @@ +user(); +})->middleware('auth:api'); diff --git a/docker-compose.yml b/docker-compose.yml index 899c16e5..d21e5ef4 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -21,10 +21,10 @@ services: postgres: image: postgres:18.2-alpine3.23 - container_name: pgsql + container_name: payment-db restart: unless-stopped ports: - - "8091:5432" + - "8092:5432" environment: POSTGRES_DB: ${POSTGRES_DB} POSTGRES_USER: ${POSTGRES_USER} -- 2.49.1