获得401未经授权的Laravel圣所

时间:2020-04-25 05:53:19

标签: vue.js axios laravel-7 laravel-sanctum

我正在将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,

有人可以帮我吗?

4 个答案:

答案 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 中: