Angular Silex中间件身份验证在Postman和浏览器中的工作方式不同

Angular Silex中间件身份验证在Postman和浏览器中的工作方式不同,angular,authentication,postman,middleware,silex,Angular,Authentication,Postman,Middleware,Silex,我不是一个经验丰富的后端开发人员,所以这个问题可能不是正确的问题,但问题是真实的 我使用Silex作为Angular 2应用程序的简单后端,我有一个中间件,用于检查用户是否提供了JWT令牌 $app->before(function (Request $request) use ($app) { // Checks if the credential header is provided if (!$token = $request->headers->get('X-BEAR

我不是一个经验丰富的后端开发人员,所以这个问题可能不是正确的问题,但问题是真实的

我使用Silex作为Angular 2应用程序的简单后端,我有一个中间件,用于检查用户是否提供了JWT令牌

$app->before(function (Request $request) use ($app)  {
// Checks if the credential header is provided
if (!$token = $request->headers->get('X-BEARER-TOKEN')) {
    return new Response('Bad Request', 400);
}

$data = $app['user.validateToken']($token); // This checks if the JWT token is valid

if(!$data || (int) $data['user_role_id'] != 2){
    return new Response('Access Denied', 403);
}
});
我有一个API端点,它返回一些东西,比如仪表板信息

$app->get('/dashboard', function () use ($app) {

$stmnt = $app['db']->executeQuery(
    "SELECT Query"
);
$result = $stmnt->fetchAll();

if($result === false) {
    return new Response('Not Found', 404);
}else{
    $result = array('message' => 'success', 'status' => 200, 'data' => $result);
    return $app->json($result, 200);
}
});
这不起作用,我收到了一个“错误的请求”,因为请求无法获取头数据

令人费解的注释: A-如果我从Postman调用API,上面的代码工作得很好,但是当我从浏览器(在本例中是Angular应用程序)调用API时,我收到了一个错误的请求

B-如果我将凭证逻辑从中间件之前移动到端点(下面的代码),那么从邮递员调用和应用程序调用都可以正常工作

$app->get('/dashboard', function (Request $request) use ($app) {

// Checks if the credential header is provided
if (!$token = $request->headers->get('X-BEARER-TOKEN')) {
    return new Response('Bad Request', 400);
}

$data = $app['user.validateToken']($token);

if(!$data || (int) $data['user_role_id'] != 2){
    return new Response('Access Denied', 403);
}

$stmnt = $app['db']->executeQuery(
    "SELECT Query"
);
$result = $stmnt->fetchAll();

if($result === false) {
    return new Response('Not Found', 404);
}else{

    $result = array_map('intval', $result[0]);

    $result = array('message' => 'success', 'status' => 200, 'data' => $result);
    return $app->json($result, 200);
}

});
知道我错过了什么吗

顺便说一句,为了使飞行前的CORS选项工作,我有以下代码附加到应用程序的末尾,我不确定它是否与问题有关


好吧,我发现了问题,我觉得这很愚蠢

问题是没有正确考虑应用程序生命周期, $app->before在$app->options之前运行,因此当浏览器询问options标题是否可接受时,->before lifecycle不知道如何处理它

在解决问题之前,将以下代码添加到->中:

if ($request->getMethod() == 'OPTIONS') {
    return new Response(null, 204);
}
当然,这会使->选项和->匹配过时,这仍然很时髦。也许我所做的只是一个解决办法,而不是一个解决方案

if ($request->getMethod() == 'OPTIONS') {
    return new Response(null, 204);
}