我正在Laravel中构建一个API,并尝试使用HTTP基本身份验证。我已经创建了一个电子邮件/密码组合为user@gmail.com:testpass
的用户。我正在访问以下URL上的一个端点,该端点需要身份验证:https://user@gmail.com:testpass@myapp.local/users/2
当我将auth.basic
路由过滤器附加到该路由时,我可以通过Auth
类成功地验证和访问已验证用户的详细信息,但由于这是一个API,我希望使用无状态HTTP基本验证,因此我编写了自己的过滤器:
// Our own auth filter to use onceBasic and return a consistent API response
Route::filter('basic.once', function() {
$result = Auth::onceBasic();
if ($result->getStatusCode() === 401) {
// Unauthorized, return our own response
return Response::json([
'message' => 'Bad credentials'
], Config::get('status.error.unauthorized'));
}
return $result;
});
不管怎样,这里Auth::onceBasic()
的结果总是未经授权地返回,即使我发送的用户名/密码组合保持不变。即使我在过滤器中将Auth::onceBasic()
更改为Auth::basic()
,它仍然会返回未经授权的结果。
我甚至不知道从哪里开始调试,因为我的过滤器基本上与Laravel附带的auth.basic
过滤器相同,只是使用了更多的代码来产生一致的API输出。
您使用的是PHP FastCGI吗?
来自Laravel官方文档:
https://laravel.com/docs/5.3/authentication#http-基本身份验证
关于FastCGI的一点注记
如果您使用的是PHP FastCGI,HTTP Basic身份验证可能无法正常运行。以下几行应该添加到.htaccess文件中:
RewriteCond %{HTTP:Authorization} ^(.+)$
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
我用这种方法自己解决了。