kreait / laravel-firebase

A Laravel package for the Firebase PHP Admin SDK
https://github.com/kreait/firebase-php
MIT License
992 stars 163 forks source link

Error while initializing the auth component #135

Closed MnKashpour closed 1 year ago

MnKashpour commented 2 years ago

I'm trying to use phone number authentication using firebase, but this error occurs while initializing the auth component with the Laravel app() helper like this app('firebase.auth'). This error happens in my Linux Ubuntu 20.04 server with PHP 8.1 & Laravel 9 project, but for some reason, it works fine in my windows 11 machine with PHP 8.1.

Error

{
    "message": "Cannot assign Beste\\Clock\\SystemClock to property Kreait\\Firebase\\Factory::$clock of type StellaMaris\\Clock\\ClockInterface",
    "exception": "TypeError",
    "file": "/home/forge/my.project/vendor/kreait/firebase-php/src/Firebase/Factory.php",
    "line": 96,
    "trace": [
        {
            "file": "/home/forge/my.project/vendor/kreait/laravel-firebase/src/FirebaseProjectManager.php",
            "line": 63,
            "function": "__construct",
            "class": "Kreait\\Firebase\\Factory",
            "type": "->"
        },
        {
            "file": "/home/forge/my.project/vendor/kreait/laravel-firebase/src/FirebaseProjectManager.php",
            "line": 33,
            "function": "configure",
            "class": "Kreait\\Laravel\\Firebase\\FirebaseProjectManager",
            "type": "->"
        },
        {
            "file": "/home/forge/my.project/vendor/kreait/laravel-firebase/src/ServiceProvider.php",
            "line": 46,
            "function": "project",
            "class": "Kreait\\Laravel\\Firebase\\FirebaseProjectManager",
            "type": "->"
        },
        {
            "file": "/home/forge/my.project/vendor/laravel/framework/src/Illuminate/Container/Container.php",
            "line": 871,
            "function": "Kreait\\Laravel\\Firebase\\{closure}",
            "class": "Kreait\\Laravel\\Firebase\\ServiceProvider",
            "type": "::"
        },
        {
            "file": "/home/forge/my.project/vendor/laravel/framework/src/Illuminate/Container/Container.php",
            "line": 756,
            "function": "build",
            "class": "Illuminate\\Container\\Container",
            "type": "->"
        },
        {
            "file": "/home/forge/my.project/vendor/laravel/framework/src/Illuminate/Foundation/Application.php",
            "line": 855,
            "function": "resolve",
            "class": "Illuminate\\Container\\Container",
            "type": "->"
        },
        {
            "file": "/home/forge/my.project/vendor/laravel/framework/src/Illuminate/Container/Container.php",
            "line": 692,
            "function": "resolve",
            "class": "Illuminate\\Foundation\\Application",
            "type": "->"
        },
        {
            "file": "/home/forge/my.project/vendor/laravel/framework/src/Illuminate/Foundation/Application.php",
            "line": 840,
            "function": "make",
            "class": "Illuminate\\Container\\Container",
            "type": "->"
        },
        {
            "file": "/home/forge/my.project/vendor/laravel/framework/src/Illuminate/Foundation/helpers.php",
            "line": 119,
            "function": "make",
            "class": "Illuminate\\Foundation\\Application",
            "type": "->"
        },
        {
            "file": "/home/forge/my.project/app/Services/FirebaseService.php",
            "line": 31,
            "function": "app"
        },
        {
            "file": "/home/forge/my.project/app/Services/FirebaseService.php",
            "line": 14,
            "function": "getAuthObject",
            "class": "App\\Services\\FirebaseService",
            "type": "::"
        }
  ]
}

composer.json

"name": "laravel/laravel",
    "type": "project",
    "description": "The Laravel Framework.",
    "keywords": ["framework", "laravel"],
    "license": "MIT",
    "require": {
        "php": "^8.1",
        "calebporzio/parental": "^1.1",
        "guzzlehttp/guzzle": "^7.2",
        "intervention/image": "^2.7",
        "kreait/laravel-firebase": "^4.1",
        "laravel/framework": "^9.2",
        "laravel/octane": "^1.2",
        "laravel/sanctum": "^2.14.1",
        "laravel/telescope": "^4.9",
        "laravel/tinker": "^2.7",
        "propaganistas/laravel-phone": "^4.3",
        "spatie/laravel-medialibrary": "10.3.5",
        "spatie/laravel-permission": "^5.5",
        "spatie/laravel-query-builder": "^5.0",
        "spatie/laravel-translatable": "^6.0"
    },
    "require-dev": {
        "barryvdh/laravel-ide-helper": "^2.12",
        "fakerphp/faker": "^1.9.1",
        "laravel/sail": "^1.13",
        "mockery/mockery": "^1.4.4",
        "nunomaduro/collision": "^6.1",
        "phpunit/phpunit": "^9.5.10",
        "spatie/laravel-ignition": "^1.0"
    },
    "autoload": {
        "psr-4": {
            "App\\": "app/",
            "Database\\Factories\\": "database/factories/",
            "Database\\Seeders\\": "database/seeders/"
        },
        "files": [
            "app/Utility/Helpers/AuthHelper.php",
            "app/Utility/Helpers/GeneralHelpers.php"
        ]
    },
    "autoload-dev": {
        "psr-4": {
            "Tests\\": "tests/"
        }
    },
    "scripts": {
        "post-autoload-dump": [
            "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
            "@php artisan package:discover --ansi"
        ],
        "post-update-cmd": [
            "@php artisan vendor:publish --tag=laravel-assets --ansi --force",
            "Illuminate\\Foundation\\ComposerScripts::postUpdate",
            "@php artisan ide-helper:generate",
            "@php artisan ide-helper:meta"
        ],
        "post-root-package-install": [
            "@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
        ],
        "post-create-project-cmd": [
            "@php artisan key:generate --ansi"
        ]
    },
    "extra": {
        "laravel": {
            "dont-discover": []
        }
    },
    "config": {
        "optimize-autoloader": true,
        "preferred-install": "dist",
        "sort-packages": true
    },
    "minimum-stability": "dev",
    "prefer-stable": true
jeromegamez commented 2 years ago

Please try a composer update -W On the Linux server, it's possible that not all dependencies are up-to-date there. 🤞

MnKashpour commented 2 years ago

I've tried the above command but it didn't work, I also tried to delete composer.lock then execute the same command but unfortunately, it didn't work

jeromegamez commented 2 years ago

Using your composer.json, I wasn't able to reproduce the problem because of the following error

require(/path/to/vendor/composer/../../app/Utility/Helpers/AuthHelper.php): Failed to open stream: No such file or directory

When creating a new Laravel project and copy-pasting your require and require-dev sections, I got it to install, but didn't encounter the problem when getting the Auth component in Tinker:

❯ php artisan tinker
Psy Shell v0.11.4 (PHP 8.1.6 — cli) by Justin Hileman
>>> app('firebase.auth')
=> Kreait\Firebase\Auth {#3920}

You have referenced a custom AuthHelper in your composer.json and, from what I can see in the error log, an app/Services/FirebaseService.php so I assume the error must be somewhere there.

MnKashpour commented 2 years ago

I've tried initializing the auth component using tinker, and it worked, maybe the problem is that I'm using Laravel Octane in the server because this is the only difference between my local Windows machine & Linux server

for the app/Service/FirebaseService.php, I've reviewed the code & I don't think there is a problem there.

Here is the app/Service/FirebaseService.php, maybe there is something that I'm missing

namespace App\Services;

use App\Exceptions\Classes\FirebaseInvalidTokenException;
use Kreait\Firebase\Contract\Auth;
use Kreait\Firebase\Contract\Messaging;
use Kreait\Firebase\Exception\Auth\FailedToVerifyToken;
use Kreait\Firebase\Exception\Auth\RevokedIdToken;

class FirebaseService {
    public static function getUidFromFirebaseToken(string $idTokenString) : string
    {
        $auth = self::getAuthObject();

        try {
            $verifiedIdToken = $auth->verifyIdToken($idTokenString, true);
        } catch (FailedToVerifyToken $e) {
            throw new FirebaseInvalidTokenException($e->getMessage(), 0, $e);
        } catch (RevokedIdToken $e) {
            throw new FirebaseInvalidTokenException($e->getMessage(), 0, $e);
        }

        $uid = $verifiedIdToken->claims()->get('sub');

        return $uid;
    }

    private static function getAuthObject() : Auth
    {
        return app('firebase.auth');
    }
}

for the AuthHelper & GeneralHelpers, I don't use them there, but I've removed them & tried but the same error still occurs, so I don't think the problem is in these files either.

jeromegamez commented 2 years ago

Thank you for the hint that you're using Octane. Although I'm not fully familiar with it, I'm confident that using proper Dependency Injection might do the trick. Could you please try changing the FirebaseService class to the following to see if that works?

<?php

namespace App\Services;

use App\Exceptions\Classes\FirebaseInvalidTokenException;
use Kreait\Firebase\Contract\Auth;
use Kreait\Firebase\Contract\Messaging;
use Kreait\Firebase\Exception\Auth\FailedToVerifyToken;
use Kreait\Firebase\Exception\Auth\RevokedIdToken;

class FirebaseService 
{
    private Auth $auth;

    public function __construct(Auth $auth)
    {
        $this->auth = $auth;
    }

    public static function getUidFromFirebaseToken(string $idTokenString): string
    {
        try {
            $verifiedIdToken = $this->auth->verifyIdToken($idTokenString, true);
        } catch (FailedToVerifyToken $e) {
            throw new FirebaseInvalidTokenException($e->getMessage(), 0, $e);
        } catch (RevokedIdToken $e) {
            throw new FirebaseInvalidTokenException($e->getMessage(), 0, $e);
        }

        $uid = $verifiedIdToken->claims()->get('sub');

        return $uid;
    }
}

(I've made the suggested changes without trying them out, so there might be typos, but you get the gist 😅)

MnKashpour commented 2 years ago

I've just tried that but no luck😢 the same error still occurs.

This is the FirebaseService.php

<?php

namespace App\Services;

use App\Exceptions\Classes\FirebaseInvalidTokenException;
use Kreait\Firebase\Contract\Auth;
use Kreait\Firebase\Exception\Auth\FailedToVerifyToken;
use Kreait\Firebase\Exception\Auth\RevokedIdToken;

class FirebaseService {
    private Auth $auth;

    public function __construct(Auth $auth)
    {
        $this->auth = $auth;
    }

    public function getUidFromFirebaseToken(string $idTokenString) : string
    {
        try {
            $verifiedIdToken = $this->auth->verifyIdToken($idTokenString, true);
        } catch (FailedToVerifyToken $e) {
            throw new FirebaseInvalidTokenException($e->getMessage(), 0, $e);
        } catch (RevokedIdToken $e) {
            throw new FirebaseInvalidTokenException($e->getMessage(), 0, $e);
        }

        $uid = $verifiedIdToken->claims()->get('sub');

        return $uid;
    }
}

This is the error

TypeError: Cannot assign Beste\Clock\SystemClock to property Kreait\Firebase\Factory::$clock of type StellaMaris\Clock\ClockInterface in file /home/forge/api.testing.slinger.ly/vendor/kreait/firebase-php/src/Firebase/Factory.php on line 96

#0 /home/forge/api.testing.slinger.ly/vendor/kreait/laravel-firebase/src/FirebaseProjectManager.php(63): Kreait\Firebase\Factory->__construct()
#1 /home/forge/api.testing.slinger.ly/vendor/kreait/laravel-firebase/src/FirebaseProjectManager.php(33): Kreait\Laravel\Firebase\FirebaseProjectManager->configure()
#2 /home/forge/api.testing.slinger.ly/vendor/kreait/laravel-firebase/src/ServiceProvider.php(46): Kreait\Laravel\Firebase\FirebaseProjectManager->project()
#3 /home/forge/api.testing.slinger.ly/vendor/laravel/framework/src/Illuminate/Container/Container.php(871): Kreait\Laravel\Firebase\ServiceProvider::Kreait\Laravel\Firebase\{closure}()
#4 /home/forge/api.testing.slinger.ly/vendor/laravel/framework/src/Illuminate/Container/Container.php(756): Illuminate\Container\Container->build()
#5 /home/forge/api.testing.slinger.ly/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(855): Illuminate\Container\Container->resolve()
#6 /home/forge/api.testing.slinger.ly/vendor/laravel/framework/src/Illuminate/Container/Container.php(692): Illuminate\Foundation\Application->resolve()
#7 /home/forge/api.testing.slinger.ly/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(840): Illuminate\Container\Container->make()
#8 /home/forge/api.testing.slinger.ly/vendor/laravel/framework/src/Illuminate/Container/Container.php(1025): Illuminate\Foundation\Application->make()
#9 /home/forge/api.testing.slinger.ly/vendor/laravel/framework/src/Illuminate/Container/Container.php(945): Illuminate\Container\Container->resolveClass()
#10 /home/forge/api.testing.slinger.ly/vendor/laravel/framework/src/Illuminate/Container/Container.php(906): Illuminate\Container\Container->resolveDependencies()
#11 /home/forge/api.testing.slinger.ly/vendor/laravel/framework/src/Illuminate/Container/Container.php(756): Illuminate\Container\Container->build()
#12 /home/forge/api.testing.slinger.ly/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(855): Illuminate\Container\Container->resolve()
#13 /home/forge/api.testing.slinger.ly/vendor/laravel/framework/src/Illuminate/Container/Container.php(692): Illuminate\Foundation\Application->resolve()
#14 /home/forge/api.testing.slinger.ly/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(840): Illuminate\Container\Container->make()
#15 /home/forge/api.testing.slinger.ly/vendor/laravel/framework/src/Illuminate/Container/Container.php(1025): Illuminate\Foundation\Application->make()
#16 /home/forge/api.testing.slinger.ly/vendor/laravel/framework/src/Illuminate/Container/Container.php(945): Illuminate\Container\Container->resolveClass()
#17 /home/forge/api.testing.slinger.ly/vendor/laravel/framework/src/Illuminate/Container/Container.php(906): Illuminate\Container\Container->resolveDependencies()
#18 /home/forge/api.testing.slinger.ly/vendor/laravel/framework/src/Illuminate/Container/Container.php(756): Illuminate\Container\Container->build()
#19 /home/forge/api.testing.slinger.ly/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(855): Illuminate\Container\Container->resolve()
#20 /home/forge/api.testing.slinger.ly/vendor/laravel/framework/src/Illuminate/Container/Container.php(692): Illuminate\Foundation\Application->resolve()
#21 /home/forge/api.testing.slinger.ly/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(840): Illuminate\Container\Container->make()
#22 /home/forge/api.testing.slinger.ly/vendor/laravel/framework/src/Illuminate/Routing/Route.php(275): Illuminate\Foundation\Application->make()
#23 /home/forge/api.testing.slinger.ly/vendor/laravel/framework/src/Illuminate/Routing/Route.php(1081): Illuminate\Routing\Route->getController()
#24 /home/forge/api.testing.slinger.ly/vendor/laravel/framework/src/Illuminate/Routing/Route.php(1024): Illuminate\Routing\Route->controllerMiddleware()
#25 /home/forge/api.testing.slinger.ly/vendor/laravel/framework/src/Illuminate/Routing/Router.php(737): Illuminate\Routing\Route->gatherMiddleware()
#26 /home/forge/api.testing.slinger.ly/vendor/laravel/framework/src/Illuminate/Routing/Router.php(719): Illuminate\Routing\Router->gatherRouteMiddleware()
#27 /home/forge/api.testing.slinger.ly/vendor/laravel/framework/src/Illuminate/Routing/Router.php(703): Illuminate\Routing\Router->runRouteWithinStack()
#28 /home/forge/api.testing.slinger.ly/vendor/laravel/framework/src/Illuminate/Routing/Router.php(667): Illuminate\Routing\Router->runRoute()
#29 /home/forge/api.testing.slinger.ly/vendor/laravel/framework/src/Illuminate/Routing/Router.php(656): Illuminate\Routing\Router->dispatchToRoute()
#30 /home/forge/api.testing.slinger.ly/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(167): Illuminate\Routing\Router->dispatch()
#31 /home/forge/api.testing.slinger.ly/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(141): Illuminate\Foundation\Http\Kernel->Illuminate\Foundation\Http\{closure}()
#32 /home/forge/api.testing.slinger.ly/app/Http/Middleware/LanguageSwitcher.php(41): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#33 /home/forge/api.testing.slinger.ly/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): App\Http\Middleware\LanguageSwitcher->handle()
#34 /home/forge/api.testing.slinger.ly/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#35 /home/forge/api.testing.slinger.ly/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php(31): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle()
#36 /home/forge/api.testing.slinger.ly/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull->handle()
#37 /home/forge/api.testing.slinger.ly/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#38 /home/forge/api.testing.slinger.ly/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle()
#39 /home/forge/api.testing.slinger.ly/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\Foundation\Http\Middleware\TrimStrings->handle()
#40 /home/forge/api.testing.slinger.ly/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#41 /home/forge/api.testing.slinger.ly/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\Foundation\Http\Middleware\ValidatePostSize->handle()
#42 /home/forge/api.testing.slinger.ly/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(86): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#43 /home/forge/api.testing.slinger.ly/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance->handle()
#44 /home/forge/api.testing.slinger.ly/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(62): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#45 /home/forge/api.testing.slinger.ly/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\Http\Middleware\HandleCors->handle()
#46 /home/forge/api.testing.slinger.ly/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#47 /home/forge/api.testing.slinger.ly/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\Http\Middleware\TrustProxies->handle()
#48 /home/forge/api.testing.slinger.ly/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(116): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#49 /home/forge/api.testing.slinger.ly/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(142): Illuminate\Pipeline\Pipeline->then()
#50 /home/forge/api.testing.slinger.ly/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(111): Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter()
#51 /home/forge/api.testing.slinger.ly/vendor/laravel/octane/src/ApplicationGateway.php(36): Illuminate\Foundation\Http\Kernel->handle()
#52 /home/forge/api.testing.slinger.ly/vendor/laravel/octane/src/Worker.php(92): Laravel\Octane\ApplicationGateway->handle()
#53 /home/forge/api.testing.slinger.ly/vendor/laravel/octane/bin/swoole-server(118): Laravel\Octane\Worker->handle()
#54 [internal function]: {closure}()
#55 /home/forge/api.testing.slinger.ly/vendor/laravel/octane/bin/swoole-server(164): Swoole\Server->start()
#56 {main}
jeromegamez commented 2 years ago

Unfortunately, I'm not able to reproduce this problem. This is what I did to do so:

laravel new l9firebase
cd l9firebase
composer require kreait/laravel-firebase
php artisan tinker

Psy Shell v0.11.4 (PHP 8.1.6 — cli) by Justin Hileman
>>> app('firebase.auth')
=> Kreait\Firebase\Auth {#3613}

Could you please try this as well and tell me if that works?

MnKashpour commented 2 years ago

I've tried it with tinker and it works, but with a request that only initializes the auth component and then sends a 200 response the error occurs

jeromegamez commented 2 years ago

Could you please share the controller code 😅🙏

MnKashpour commented 2 years ago

Hey there, sorry for the late reply. I've deployed my project to the same server with the same settings but removed Octane (deployed it as a normal project). It works. So the problem must be caused by Octane.

The weird thing is that I've used this package (version 3.1) in an old project (Laravel 8 with PHP 8.0) with Octane and it was working great.

jeromegamez commented 2 years ago

That's a good hint! Could you perhaps try to gradually upgrade versions from 3.1 to 3.2 etc? Once we know between which versions it breaks, I can have a closer look. Just from the commit messages since 3.1 I can't yet see an obvious reason.

if it's not too much hassle, do you perhaps have an example project with the error? I haven't used octane yet, so I might be missing something obvious and could debug it with real code

github-actions[bot] commented 1 year ago

There hasn't been any activity on this issue recently, and in order to prioritize active issues, it will be marked as stale. Please make sure to update to the latest version and check if that solves the issue. Let me know if that works for you by leaving a 👍. Because this issue is marked as stale, it will be closed and locked in 7 days if no further activity occurs. Thank you for your contributions!