Laravel Sanctum 做 SPA 认证时报 The MAC is invalid. 错误

使用 Laravel Sanctum 做 SPA 认证时,在 config/sanctum 中配置 stateful 后,访问 login 接口报 The MAC is invalid. 错误。配置后,post 请求都会报这个错误。

环境:

  • homestead 环境(php7.3 nginx laravel7.22.4)
  • 接口域: jiujiu.cn
  • spa 页面域 test.jiujiu.cn

配置

  • cors 配置 ok,也开启了 supports_credentials
  • 前端 axios 设置了 axios.defaults.withCredentials = true
  • config/session 设置 domain 为 .jiujiu.cn
  • config/sanctum 设置 stateful 为 test.jiujiu.cn

调用栈

 {
    "message": "The MAC is invalid.",
    "exception": "Illuminate\\Contracts\\Encryption\\DecryptException",
    "file": "/home/vagrant/code/work/jiujiu.cn/vendor/laravel/framework/src/Illuminate/Encryption/Encrypter.php",
    "line": 199,
    "trace": [
        {
            "file": "/home/vagrant/code/work/jiujiu.cn/vendor/laravel/framework/src/Illuminate/Encryption/Encrypter.php",
            "line": 136,
            "function": "getJsonPayload",
            "class": "Illuminate\\Encryption\\Encrypter",
            "type": "->"
        },
        {
            "file": "/home/vagrant/code/work/jiuxin.cn/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php",
            "line": 155,
            "function": "decrypt",
            "class": "Illuminate\\Encryption\\Encrypter",
            "type": "->"
        },
        {
            "file": "/home/vagrant/code/work/jiujiu.cn/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php",
            "line": 137,
            "function": "getTokenFromRequest",
            "class": "Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken",
            "type": "->"
        },

具体看 VerifyCsrfToken

     /**
     * Get the CSRF token from the request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return string
     */
    protected function getTokenFromRequest($request)
    {
        $token = $request->input('_token') ?: $request->header('X-CSRF-TOKEN');

        if (! $token && $header = $request->header('X-XSRF-TOKEN')) {
            $token = CookieValuePrefix::remove($this->encrypter->decrypt($header, static::serialized()));
        }

        return $token;
    }

是 decrypt 报错。

请求 login 报 The MAC is invalid. 错误。 使用 Laravel Sanctum 的小伙伴有遇到这个问题么。

XSRF-TOKEN 自己颁发的,到 decrypt 就报错。这啥鬼呢。

直播间 熊猫血 虚幻之物对应着冥冥之路!
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 3

应该是你的APP_KEY有问题

3年前 评论

@pigzzz APP_KEY 重新生成,重新清理几次了。还是不好。

3年前 评论

同域下, Sanctum SPA 方案是可行的。不会报这个错。可有时候不一定是同域的。

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!