Как отправить переменные в Bramus Router - PullRequest
0 голосов
/ 26 января 2019

У меня есть API-интерфейс, который использует PHP-маршрутизатор Bramus и проверяет JWT из Auth0.Все это прекрасно работает, но я стремлюсь расширить функциональность и получить дополнительную информацию из JWT, которую я могу затем передать вызовам API.

То есть, когда пользователь выполняет вызов API, он отправляет пользователюID в качестве переменной в URL.Однако это значение уже есть в JWT, поэтому в целях безопасности я хочу извлечь идентификатор пользователя из JWT, а не передавать его через URL.

Вот фрагмент кода маршрутизацииЯ пытаюсь использовать:

....
  $router->before('GET|POST', '/api.*', function() use ($app) {
    $userid = '12345';
  });

  // Check for read:messages scope
  $router->before('GET', '/api/private-scoped', function() use ($app) {
    if (!$app->checkScope('read:messages')){
      header('HTTP/1.0 403 forbidden');
      header('Content-Type: application/json; charset=utf-8');
      echo json_encode(array("message" => "Insufficient scope."));
      exit();
    }
  });

  $router->get('/api/users/get-info/(\w+)', function($userid) use ($app) {
    header('Content-Type: application/json; charset=utf-8');
    echo json_encode($app->getUserInfo($userid));
  });

  $router->get('/api/users/test', function() {
    header('Content-Type: application/json; charset=utf-8');
    echo json_encode(array("user" => $userid));
  });
....

Когда я посещаю /api/users/test, я получаю следующий ответ:

  {
    "user": null
  }

Как мне получить переменную $userid для передачи в маршрутизаторчтобы я мог использовать его в других функциях?

1 Ответ

0 голосов
/ 28 января 2019

Проблема, которую вы смотрите здесь, - это проблема с ограничением объема PHP, а не конкретная bramus/router - , которую я являюсь автором - проблемы.Поскольку вы определяете $user внутри вызываемого до, он доступен только внутри его текущей области (например, между { и } функции).Поэтому вы не можете получить к нему доступ за пределами указанной функции.

Есть несколько способов решить эту проблему.Поскольку я вижу, что вы уже внедрили переменную $app в обратный вызов before и другие функции, я предлагаю вам сохранить $userid в $app и всегда читать его оттуда.

Примерно так:

....
  $router->before('GET|POST', '/api.*', function() use ($app) {
    $app->set('userid', '12345');
  });

  // Check for read:messages scope
  $router->before('GET', '/api/private-scoped', function() use ($app) {
    if (!$app->checkScope('read:messages')){
      header('HTTP/1.0 403 forbidden');
      header('Content-Type: application/json; charset=utf-8');
      echo json_encode(array("message" => "Insufficient scope."));
      exit();
    }
  });

  $router->get('/api/users/get-info/(\w+)', function($userid) use ($app) {
    header('Content-Type: application/json; charset=utf-8');
    echo json_encode($app->getUserInfo($userid));
  });

  $router->get('/api/users/test', function() use ($app) {
    header('Content-Type: application/json; charset=utf-8');
    echo json_encode(array("user" => $app->get('userid')));
  });
....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...