Laravel Sanctum登录异常求助:输入正确信息仍返回401错误
Laravel Sanctum登录返回401(凭证正确)排查方案
以下是针对这个问题的具体排查步骤,按优先级排序:
1. 基础配置检查
- 确认
config/sanctum.php中stateful配置包含你的前端域名(前后端分离场景),示例:'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', 'localhost,127.0.0.1:3000')), - 检查
app/Http/Kernel.php的api中间件组,确保EnsureFrontendRequestsAreStateful::class已添加且在throttle中间件之前:'api' => [ \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class, 'throttle:api', \Illuminate\Routing\Middleware\SubstituteBindings::class, ], - 确认
.env中SESSION_DRIVER设置为cookie(SPA认证模式必填),SESSION_DOMAIN配置正确(本地开发可设为.localhost)。
2. 登录接口实现校验
- 排查登录接口是否错误添加了
auth:sanctum中间件——登录接口本身不需要该中间件,否则未携带token时直接返回401。 - 检查凭证验证逻辑是否正确,示例代码:
public function login(Request $request) { $validated = $request->validate([ 'email' => 'required|email', 'password' => 'required', ]); if (!Auth::attempt($validated)) { return response()->json(['message' => 'Unauthorized'], 401); } // 生成token(API token模式) $token = Auth::user()->createToken('auth-token')->plainTextToken; return response()->json(['access_token' => $token]); } - 确认使用的Guard正确:SPA模式默认用
webGuard,API token模式用apiGuard,可通过Auth::guard('api')->attempt(...)指定。
3. 用户模型与密码校验
- 确认用户模型
App\Models\User引入了HasApiTokenstrait:use Laravel\Sanctum\HasApiTokens; class User extends Authenticatable { use HasApiTokens, HasFactory, Notifiable; // ... } - 验证用户密码是否为哈希存储:在项目根目录执行
php artisan tinker,输入Hash::check('你的密码', User::find(1)->password),若返回false说明密码未正确哈希,需重新生成哈希密码存储。
4. 请求与跨域配置
- 前端请求需携带
Accept: application/json头,避免Laravel返回HTML重定向(导致看似401的错误响应)。 - 跨域配置检查:
config/cors.php中需确保:'paths' => ['api/*', 'sanctum/csrf-cookie'], 'allowed_origins' => ['你的前端域名'], 'supports_credentials' => true, - SPA模式下,前端需开启携带cookie(如Axios设置
withCredentials: true),且请求前先调用GET /sanctum/csrf-cookie获取CSRF令牌。
内容的提问来源于stack exchange,提问作者Florian De Haro
相关产品推荐
相关产品推荐

