如何将变量发送到Bramus Router

时间:2019-01-26 00:25:55

标签: php jwt

我有一个使用Bramus PHP路由器的API后端,并验证了Auth0的JWT。一切正常,但是我正在寻求扩展功能并从JWT派生其他信息,然后将这些信息传递给API调用。

也就是说,当用户进行API调用时,他们会将用户ID发送为URL中的变量。但是,此值已经在JWT中,因此出于安全考虑,我想将用户ID从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 :(得分:1)

您在这里看到的问题是PHP范围问题,而不是特定的bramus/router(我是的作者)–问题。由于您在before可调用对象中定义了$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')));
  });
....