Laravel非API路由无法检测已认证用户问题排查
问题原因
认证机制完全隔离:web guard采用session认证,api guard采用Passport Token认证,两者是独立的认证体系。SPA通过api guard登录后,仅在本地存储了Token,web端的session中没有任何登录状态,因此
auth()->check()返回false;而auth('api')->check()需要请求头携带Token才能验证,web页面请求时没带这个Token,所以也返回false。CreateFreshApiToken中间件的逻辑不匹配你的场景:这个中间件的核心作用是为已通过web guard登录的请求,附加
laravel_tokenCookie,让SPA后续请求能自动带上这个Cookie实现无感知认证。但你是先通过api guard登录,此时web端没有session登录状态,中间件执行时$request->user($this->guard)(默认使用web guard)拿不到用户实例,自然不会生成Cookie。跨子域状态不共享:虽然
session_domain设为.foo.com,但只有当用户通过web guard完成登录流程时,才会生成对应的session Cookie。你当前的登录走的是api guard,不会触发web session的创建,所以foo.com的web页面无法感知登录状态。
简单总结:你用两套互不关联的认证方式登录,自然没法打通状态;CreateFreshApiToken是给web登录后的SPA用的,不是给api登录后的web页面用的。
内容的提问来源于stack exchange,提问作者user9040160

