You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vapor 4登录接口返回User not authenticated错误排查求助

问题排查和解决方法

1. 路由缺少认证中间件配置

你当前的login方法调用req.auth.require(User.self)需要Vapor提前对请求携带的账号密码做校验,所以你需要在注册login路由的时候,先挂载User.authenticator()中间件,示例代码:

// 正确的路由注册写法
let userRoutes = app.grouped("api", "user")
// 登录路由需要挂载User的认证中间件
userRoutes.grouped(User.authenticator()).post("login", use: userController.login)

只有加了这个中间件,Vapor才会自动从请求中提取账号密码,和数据库的用户数据做比对,校验通过后才会把用户写入req.auth,不然就会直接返回User not authenticated错误。

2. Postman调用方式错误

你如果用的是ModelAuthenticatable默认的Basic认证逻辑,不需要把account、password放到请求Body里,正确的调用方式是:

  • 打开Postman的Authorization标签,类型选择Basic Auth
  • Username字段填你的账号,Password字段填你的密码
  • 不需要在Body里传account、password、confirmPassword参数,confirmPassword是注册接口用的字段,登录用不到

如果你习惯把参数放到JSON Body里传递,需要自己改写登录逻辑:先从Body里取出account和password,手动查库、校验密码,不需要依赖req.auth.require的默认实现。

3. 数据库存储的密码未加密

你确认密码正确,但要注意创建用户的时候,必须对明文密码做Bcrypt哈希之后再存入数据库,不能存明文密码,因为你的verify方法用的是Bcrypt.verify(password, created: self.password),如果数据库存的是明文,校验肯定会失败。
注册用户的时候要按如下方式处理密码:

let hashedPassword = try Bcrypt.hash(userCreate.password)
let user = User(account: userCreate.account, password: hashedPassword)
// 再存入数据库

4. 字段映射问题

你的User模型里account和password的数据库字段名用的是中文「帳號」「密碼」,要确认你创建user表的时候,对应的字段名确实是这两个中文,没有拼写或者繁简差异,不然查询用户的时候会查不到,也会报认证失败。

内容的提问来源于stack exchange,提问作者蔡濡安

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 22:51:03