我正在将Laravel Sanctum与Vuejs SPA一起使用。两者都位于同一顶级域上
Laravel backend : app.demo.localhost
Vue SPA : app-spa.demo.localhost
使用axios从VueJS SPA调用并成功设置XSRF-TOKEN时,登录和注销(端点)工作正常,但是当我调用其他api端点时,它使我未经授权401。
在axios中对此进行设置
axios.defaults.withCredentials = true;
我具有以下配置
在Laravel .env
SESSION_DRIVER=cookie
SESSION_DOMAIN=.demo.localhost
SANCTUM_STATEFUL_DOMAINS=app-spa.demo.localhost
在Routes / Api.php中
Route::middleware('auth:sanctum')->get('api/user', function (Request $request) {
return $request->user();
});
在cors.php中
'paths' => ['api/*', 'sanctum/csrf-cookie', 'login', 'logout'],
'allowed_methods' => ['*'],
'allowed_origins' => ['*'],
'allowed_origins_patterns' => [],
'allowed_headers' => ['*'],
'exposed_headers' => [],
'max_age' => 0,
'supports_credentials' => true,
有人可以帮我吗?
答案 0 :(得分:11)
如果您正在使用php artisan serve,请将端口号添加到SANCTUM_STATEFUL_DOMAINS。因此,如果您的端口号是8000:
SESSION_DRIVER=cookie
SESSION_DOMAIN=.demo.localhost
SANCTUM_STATEFUL_DOMAINS=app-spa.demo.localhost:8000
您的SANCTUM_STATEFUL_DOMAINS必须与浏览器中的网址匹配。端口号不应位于SESSION_DOMAIN上。
答案 1 :(得分:2)
对于任何与本地主机打交道的人:
SESSION_DRIVER=cookie
SESSION_DOMAIN=localhost
SANCTUM_STATEFUL_DOMAINS=localhost:8080(port number you use)
答案 2 :(得分:1)
我刚刚遇到了同样的问题。我根据官方文档配置了所有选项,但无法获得授权。
然后我使用routes / web.php而不是routes / api.php,因此我可以很好地使用圣所中间件。
现在问题似乎很明显,带有凭证的Axios可能需要以正确的方式放置。
const http = axios.create({
baseURL: API_URL,
withCredentials: true
})
可能不起作用。所以我像这样添加{withCredentials: true}
http.get('/api/whoami', {withCredentials: true})
.then(res => {
console.log(res.data)
})
然后它起作用。
但是非常奇怪的是,现在很正常,无论我清除浏览器缓存,Cookie还是Laravel的各种缓存,都没有以前的情况
答案 3 :(得分:0)
我的问题是....(没有注意阅读)
如果您的 SPA 需要通过私有/在线广播频道进行身份验证,您应该将 Broadcast::routes 方法调用放在您的 routes/api.php 文件e 中: