19

I want to use pure firebase/php-jwt library in my code. Firstly, I go to /var/www/html/ and like the official library page is suggesting, I do this

composer require firebase/php-jwt

After I run this command, I see that a new vendor folder is created inside /var/www/html/ with a lot of files and subfolders. I then create my token.php file right in /var/www/html/ with contents similar to that from the official page:

<?php
use \Firebase\JWT\JWT;

$key = "example_key";
$token = array(
    "iss" => "http://example.org",
    "aud" => "http://example.com",
    "iat" => 1356999524,
    "nbf" => 1357000000
);

$jwt = JWT::encode($token, $key);
$decoded = JWT::decode($jwt, $key, array('HS256'));

print_r($decoded);

However, when I go to localhost/token.php, I get this error message:

Fatal error: Uncaught Error: Class 'Firebase\JWT\JWT' not found in /var/www/html/token.php:12 Stack trace: #0 {main} thrown in /var/www/html/token.php on line 12

I'm not sure if it matters, but my PHP version is 7.0.

yivi
  • 42,438
  • 18
  • 116
  • 138
Jacobian
  • 10,122
  • 29
  • 128
  • 221

6 Answers6

29

As per the documentation, you need to include the autoloader.

E.g., in your php file:

require __DIR__ . '/vendor/autoload.php';

But... typically your vendor folder would be at the same level than your html folder (the one where you are serving content).

E.g.:

- Project root
--- vendor
--- html
----- index.php

Then in your index.php you'd do:

 require __DIR__ . '/../vendor/autoload.php';

It is nice that you trying to use composer and modules, but if I were you I'd try to read on a bit about php's autoloading features, so you understand what's going on, and how you can profit from them.

yivi
  • 42,438
  • 18
  • 116
  • 138
  • In my case you dont need to use use \Firebase\JWT\JWT; if you use require __DIR__ . '/vendor/autoload.php'; – KlevisGjN May 20 '18 at 18:17
8

If not using composer for maintaining the structure. just remove

namespace Firebase\JWT;
use \DomainException;
use \InvalidArgumentException;
use \UnexpectedValueException;
use \DateTime;

* 
* JSON Web Token implementation, based on this spec:
* https://tools.ietf.org/html/rfc7519
 *
* PHP version 5
*
* @category Authentication
* @package  Authentication_JWT
* @author   Neuman Vong <neuman@twilio.com>
* @author   Anant Narayanan <anant@php.net>
* @license  http://opensource.org/licenses/BSD-3-Clause 3-clause BSD
* @link     https://github.com/firebase/php-jwt

form your JWT.php file. It works fine for me know.

Abhishek Pandey
  • 117
  • 1
  • 5
4

I added only one line to your code to get my code to work:

require __DIR__ . '\vendor\autoload.php';
use Firebase\JWT\JWT;

/* the rest of your code after this */

I did not have to modify the jwt.php file at all.

TARKUS
  • 2,170
  • 5
  • 34
  • 52
  • 1
    HI ! Il 'up' the topic as I found same issue, working with an MVC:
    My controller,which uses other composer loaded classes, has the following:
    `use \Firebase\JWT\JWT;`
    and still this `$token=JWT::encode($tokenArray,$secret);` will give same above mentionned error !
    – JMB Feb 23 '20 at 06:40
2

depends whether you are using composer or not, in case of not using composer try to remove the use part:

namespace Firebase\JWT;
use \DomainException;
use \InvalidArgumentException;
use \UnexpectedValueException;
use \DateTime;

and if you are using composer make sure your autoloader if loaded

0

When I don't use composer, I just load all JWT classes in my entry point PHP file, and later, use the main namespace in the classes than have to use JWT. For example, in my index.php:

require_once 'vendor/jwt/JWT.php';
require_once 'vendor/jwt/SignatureInvalidException.php';
require_once 'vendor/jwt/BeforeValidException.php';
require_once 'vendor/jwt/ExpiredException.php';
require_once 'vendor/jwt/JWK.php';

//Namespaces
use \Firebase\JWT\JWT;

In a Auth.php class file:

//Import the Namespace again
use \Firebase\JWT\JWT;

I don't really know if it's the correct way to do it when you don't have autoloader file, usually very small projects, but it works for me and possibly someone else is dealing with this too. However, I recognize that the best way to do this is to install the composer :)

pedrozopayares
  • 2,856
  • 1
  • 13
  • 14
0

Came across this recently. The problem seems to be a conflict in the namespaces somewhere. Solution; I copied the JWT classes into my local libraries folder (App/Libraries) and imported from that using App\Libraries\JWT namespace. Works perfectly.

CodesmithX
  • 246
  • 4
  • 8