首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Vapor 4认证

Vapor 4认证
EN

Stack Overflow用户
提问于 2021-07-20 20:39:59
回答 1查看 68关注 0票数 1

嘿,我在登录controllers.My代码时遇到了一些问题:

代码语言:javascript
复制
func login(_ req: Request) throws -> EventLoopFuture<UserToken>{
        let user = try req.auth.require(User.self)
        let token = try user.generateToken()
        return token.save(on: req.db).map { token }
    }

但我真的不知道postman.This中的函数是如何工作的是我的用户模型:

代码语言:javascript
复制
import Foundation
import Fluent
import Vapor
import FluentPostgresDriver


final class User:Model,Content{
    static let schema = "user"
    
    @ID(key: .id)
    var id:UUID?
    
    @Field(key:"帳號")
    var account:String
    
    
    @Field(key: "密碼")
    var password:String
    
    
    init() {}
    
    init(id: UUID?=nil, account:String, password:String){
        self.id=id
        self.account=account
        self.password=password
    }    
}

extension User: ModelAuthenticatable {
    // 要取帳號的欄位
    static var usernameKey: KeyPath<User, Field<String>> = \User.$account
    
    // 要取雜湊密碼的欄位
    static var passwordHashKey: KeyPath<User, Field<String>> = \User.$password

    // 驗證
    func verify(password: String) throws -> Bool {
        try Bcrypt.verify(password, created: self.password)
    }
}

extension User {
    struct Create: Content {
        var account: String
        var password: String
        var confirmPassword: String // 確認密碼
    }
    
    
}

extension User.Create: Validatable {
    
    static func validations(_ validations: inout Validations) {
        
        validations.add("account", as: String.self, is: .count(10...10))
        // password需為8~16碼
        validations.add("password", as: String.self, is: .count(8...16))
    }
}



extension User {
    func generateToken() throws -> UserToken {
        // 產生一組新Token, 有效期限為一天
        let calendar = Calendar(identifier: .gregorian)
        let expiryDate = calendar.date(byAdding: .day, value: 1, to: Date())

        return try UserToken(value: [UInt8].random(count: 16).base64, expireTime: expiryDate, userID: self.requireID())
    }
}

这是我的usertoken:

代码语言:javascript
复制
import Foundation
import Vapor
import Fluent

final class UserToken: Content, Model {
    static let schema: String = "user_tokens"

    @ID(key: .id)
    var id: UUID?

    @Field(key: "value")
    var value: String

    // oken過期時間
    @Field(key: "expireTime")
    var expireTime: Date?

    // 關聯到User
    @Parent(key: "user_id")
    var user: User

    init() { }

    init(id: UUID? = nil, value: String, expireTime: Date?, userID: User.IDValue) {
        self.id = id
        self.value = value
        self.expireTime = expireTime
        self.$user.id = userID
    }
}

extension UserToken: ModelTokenAuthenticatable {
    //Token的欄位
    static var valueKey = \UserToken.$value
    
    //要取對應的User欄位
    static var userKey = \UserToken.$user

    // 驗證,這裡只檢查是否過期
    var isValid: Bool {
        guard let expireTime = expireTime else { return false }
        return expireTime > Date()
    }
}

当我输入"account“、"password”和"confirmPassword“的值时,它一直告诉我"User not authenticated.”,而我的数据库中已经有这个值了。enter image description here

我敢肯定密码是对的。我有什么遗漏的吗?我是个蒸气新手。我关注了下面的文章:https://ken-60401.medium.com/vapor-4-authentication-server-side-swift-1f96b035a117

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-21 18:01:50

我认为链接的教程对登录路由使用HTTP基本身份验证,从显示的代码来看,我猜就是这种情况(最好显示如何注册登录路由)。

如果是这种情况,则需要将请求中的用户名和密码作为Authorization标头中的基本身份验证凭据发送。该值应为Basic <Credentials>,其中Credentialsusername:password base64编码。然而,you can get Postman to do it for you

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68455055

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档