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,提问作者蔡濡安
相关产品推荐
相关产品推荐

