2017-02-07 9 views
0

Я следовал инструкциям, чтобы сохранить маркер в контейнере с функцией обратного вызова (https://github.com/tuupola/slim-jwt-auth):не удается получить доступ к токен хранится в контейнере

$app = new \Slim\App(); 

$container = $app->getContainer(); 

$container["jwt"] = function ($container) { 
    return new StdClass; 
}; 

$app->add(new \Slim\Middleware\JwtAuthentication([ 
    "path" => ["/"], 
    "passthrough" => ["/version", "/auth"], 
    "secret" => "mysecret", 
    "callback" => function ($request, $response, $arguments) use ($container) { 
     $container["jwt"] = $arguments["decoded"]; 
    }, 
    "error" => function ($request, $response, $arguments) { 
     $data["status"] = "error"; 
     $data["message"] = $arguments["message"]; 
     return $response 
      ->withHeader("Content-Type", "application/json") 
      ->write(json_encode($data, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT)); 
    } 
])); 

Нет данных возвращается в ответ, кажется, $ this-> JWT пусто ,

$app->get("/user", 'getUsers'); 

function getUsers($req, $res, $args) { 
    $decode = $this->jwt; 
    print_r($decode); 
} 
+0

Возможный дубликат [Access $ этого внутри маршрута в slim3 не работает «Использование $ это, когда не в контексте объекта»] (http://stackoverflow.com/questions/40362978/access-this- in-route-in-slim3-doesnt-work-using-this-when-not-in-objec) – jmattheis

ответ

1

Ваше определение маршрута throws Using $this when not in object context Ошибка. Чтобы получить доступ к $this, вам нужно использовать закрытие. См. closure binding в документации.

$app->get("/user", function ($request, $response, $arguments) { 
    $decode = $this->jwt; 
    print_r($decode); 
}); 

или

$getUsers = function ($request, $response, $arguments) use ($container) { 
    $decode = $this->jwt; 
    print_r($decode); 
}; 

$app->get("/user", $getUsers); 

С любым из кода выше вы можете получить доступ к декодированной фишке через $this. Первый пример является предпочтительным.

$ curl --include http://localhost:8081/user --header "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.mHEOMTUPhzNDAKheszd1A74EyLmKgy3PFdmKLg4ZNAE" 
HTTP/1.1 200 OK 
Host: localhost:8081 
Connection: close 
X-Powered-By: PHP/7.0.12 
Content-Type: text/html; charset=UTF-8 
Content-Length: 84 

stdClass Object 
(
    [sub] => 1234567890 
    [name] => John Doe 
    [admin] => 1 
) 
1

Инструкция вы связаны с состояниями:

Callback вызывается только тогда, когда аутентификация прошла успешно. Он получает декодированный токен в аргументах. Если обратный вызов возвращает boolean false аутентификация вынуждена быть сбой.

Вы выполняете это требование при тестировании, то есть успешно ли выполняете аутентификацию? Также рассмотрите возможность использования var_dump($decode) вместо print_r($decode) при тестировании.

+0

Спасибо! Значок получен правильно, я не прошел этот маршрут. – robert