Laravel路由筛选器获取JWT Auth的请求标头,array_key_exists工作不正常


Laravel Route Filter getting Request Headers for JWT Auth, array_key_exists not functioning properly

我在下面写了这个简单的过滤器:

Route::filter('token', function() 
{
    $headers = json_decode(json_encode(getallheaders()), true);
    if(array_key_exists($headers['Authorization'], $headers)) {
        echo 'test';
    }
});

它使用getallheaders()函数而不是Laravel的Request类,因为Request类还不能识别自定义HTTP头。

打印此数组时,返回:

Array
(
    [Host] => api.myapi.com
    [Connection] => keep-alive
    [Accept] => application/json, text/plain, */*
    [Origin] => http://myorigin
    [User-Agent] => Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.111 Safari/537.36
    [Authorization] => eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9hcGkuYmFjazlpbnMuY29tIiwiYXVkIjoiaHR0cDpcL1wvMTYyLjI0My4xMDEuMjAyXC9zbWFydDIiLCJpYXQiOjE0MTQ2ODE1NzgsIm5iZiI6MTQxNDY4MzM3OCwidXNlciI6ImI4YTAwNzIxLTQwZjEtNzgwMS1iNGI5LTUwY2UxNTJjZTJlYyJ9.VrcWRwupzuS_Y5PNiNfXCAMl3bVbifFIHptMO6
    [Referer] => http://myorigin/myproject/
    [Accept-Encoding] => gzip,deflate,sdch
    [Accept-Language] => en-US,en;q=0.8
)

然而,array_key_exists($headers['Authorization'], $headers)不断地评估为false。在这种情况下,为什么它会被评估为错误?我在标头中发送Authorization令牌,当我print_r()数组时,它会清楚地识别标头,并根据请求提供正确的值。

这可能有什么问题?

您的原始示例失败了,因为您使用了array_key_exists($headers['Authorization'], $headers),而本应使用array_key_exists('Authorization', $headers)

但更重要的是,这并不是解决问题的最佳方案。测试相当困难,而且很容易为您提供更好的方法来解决这个问题,主要是提供的Request对象。

Route::filter('token', function ($route, 'Illuminate'Http'Request $request) {
    if ($request->headers('Authorization')) {
        echo "Token is " . {$request->headers('Authorization')};
    }
});

这很容易提供测试过滤器是否按预期工作的能力。代码也更易于阅读。

所以我解决了自己的问题。不同的方式,但我实现了我想要的(检查以确保Authorization标头已发送)。

我在array_keys($headers)上运行了一个print_r(),它返回了一个包含所有头的数组。

然后我写道:

echo in_array('Authorization', array_keys($headers));

它返回true,因为它是真的。

如果有人对array_key_exists()不起作用的原因有更好的解决方案或答案,我很想听听原因。