1
votes

I am using slim framework and trying to implement slim token authentication as middleware, now whenever i go to

localhost/project/restrict

i get the message "Token Not Found" which seems to be working fine however when i try to pass the token in the authorization parameter as per the middleware documentation

locahost/project/restrict?authorization=usertokensecret

i always get the error Class 'app\Auth' not found and in my error trace the below,

0 /Applications/AMPPS/www/project/vendor/dyorg/slim-token-authentication/src/TokenAuthentication.php(66): {closure}(Object(Slim\Http\Request), Object(Slim\Middleware\TokenAuthentication))

1 [internal function]: Slim\Middleware\TokenAuthentication->__invoke(Object(Slim\Http\Request), Object(Slim\Http\Response), Object(Slim\App))

2 /Applications/AMPPS/www/project/vendor/slim/slim/Slim/DeferredCallable.php(43): call_user_func_array(Object(Slim\Middleware\TokenAuthentication), Array)

3 [internal function]: Slim\DeferredCallable->__invoke(Object(Slim\Http\Request), Object(Slim\Http\Response), Object(Slim\App))

4 /Applications/AMPPS/www/project/vendor/slim/slim/Slim/MiddlewareAwareTrait.php(73): call_user_func(Object(Slim\DeferredCallable), Object(Slim\Http\Request), Object(Slim\Http\Response), Object(Slim\App))

5 /Applications/AMPPS/www/project/vendor/slim/slim/Slim/MiddlewareAwareTrait.php(122): Slim\App->Slim{closure}(Object(Slim\Http\Request), Object(Slim\Http\Response))

6 /Applications/AMPPS/www/project/vendor/slim/slim/Slim/App.php(370): Slim\App->callMiddlewareStack(Object(Slim\Http\Request), Object(Slim\Http\Response))

7 /Applications/AMPPS/www/project/vendor/slim/slim/Slim/App.php(295): Slim\App->process(Object(Slim\Http\Request), Object(Slim\Http\Response))

8 /Applications/AMPPS/www/project/index.php(81): Slim\App->run()

9 {main}

here the code i am using

<?php
use \Psr\Http\Message\ServerRequestInterface as Request;
use \Psr\Http\Message\ResponseInterface as Response;

require_once './vendor/autoload.php';

$app = new \Slim\App;
use Slim\App;
use Slim\Middleware\TokenAuthentication;

$config = [
    'settings' => [
        'displayErrorDetails' => true
    ]
];

$app = new App($config);

$authenticator = function($request, TokenAuthentication $tokenAuth){

    $token = $tokenAuth->findToken($request);
    $auth = new \app\Auth();
    $auth->getUserByToken($token);

};

/**
 * Add token authentication middleware
 */
$app->add(new TokenAuthentication([
    'path' =>   '/restrict',
    'authenticator' => $authenticator
]));

/**
 * Public route example
 */
$app->get('/', function($request, $response){
    $output = ['msg' => 'It is a public area'];
    $response->withJson($output, 200, JSON_PRETTY_PRINT);
});


/**
 * Restrict route example
 * Our token is "usertokensecret"
 */
$app->get('/restrict', function($request, $response){
    $output = ['msg' => 'It\'s a restrict area. Token authentication works!'];
    $response->withJson($output, 200, JSON_PRETTY_PRINT);
});


$app->run();

?>
1
Does the class \app\Auth exist? Could we see that class and the composer.json. - meun5
@meun5 i installed the library through composer, am i suppose to move it into slim folder ? - jdoe1991
Did you create \app\Auth or is it a library you installed with composer? - meun5
@meun5 installed the library with composer, did not create any class, am i suppose to create it ? if you look at the example folder in the library there is a class app/Auth but its for the example i don't think its being used or called anywhere, am i suppose to move this app folder to a different path ? - jdoe1991
Can I get a picture of your directory structure so I can get a better idea of how everything is laid out? - meun5

1 Answers

1
votes

The reason that \app\Auth cannot be found is because it doesn't exist in the current composer autoload path.

First move the app to the root folder, where core and the root vendor folders are.

Then add

"autoload": {
    "classmap": [
      "app"
    ]
}

to the root composer.json.

Last, run composer dump-autoload -o in the root folder.

After that, \app\Auth should be in the autoload path and everything should work as expected.