我正在尝试对laravel 5.7应用程序中的api调用进行身份验证。我已经按照文档安装了Passport,我想我什么都没错过。每个API调用都会返回401未经身份验证的
。调试我发现问题是cookie中加密的csrf令牌(一旦被解密)与请求中的csrf标头不匹配。我知道这是因为我正在vendor/laravel/passport/src/Guards/TokenGuard.php的$this->validCsrf($token, $request)
方法内转储getTokenViaCookie($request)
,并且它的值是false。
我不能认为我做错了。
在我的layout.blade.php
中添加<meta name="csrf-token" content="{{ csrf_token() }}">
在Kernel.php
中,我在\Laravel\Passport\Http\Middleware\CreateFreshApiToken::class
之后添加\App\Http\Middleware\EncryptCookies::class
在望远镜中,我可以在请求中看到x-xsrf-token
标头和laravel_token
cookie在这里。
任何关于问题可能是什么或以任何方式对其进行调试的想法都将受到欢迎。
我对代码进行了更深入的研究,发现令牌已加密并保存到cookie seems to be the session token中。在通行证/src/Http/Middleware/CreateFreshApiToken.php中:
public function handle($request, Closure $next, $guard = null)
{
$this->guard = $guard;
$response = $next($request);
if ($this->shouldReceiveFreshToken($request, $response)) {
$response->withCookie($this->cookieFactory->make(
$request->user($this->guard)->getKey(), $request->session()->token()
));
}
return $response;
}
所以看来我的问题是,加密的令牌是会话的第一个会话,然后将它与csrf标头进行比较,当然认证失败。
如果这是正常行为,我会想念我,或者我遗漏了什么东西?或者是错了?
答案 0 :(得分:0)
我发现了问题所在。
因为我使用的是bootstrap-vue,所以我停止使用bootstrap。我没有意识到的是,在the vue app中,当它需要./bootstrap.js
时,它不仅加载了引导程序,还设置了一些标头。