我是 Vapor 的新手,我正在嘗試添加一個登錄端點。我正在關注來自https://docs.vapor.codes/security/authentication/#bearer的關于承載身份驗證的 Vapor 檔案
到目前為止我的實作:
struct UserAuthenticator: AsyncBearerAuthenticator {
func authenticate(bearer: BearerAuthorization, for request: Request) async throws {
typealias User = App.User
let loginUser = try request.query.decode(LoginUserDTO.self)
guard let user = try await User.query(on: request.db)
.filter(\.$email == loginUser.email)
.first(),
let userId = user.id else {
throw Abort(.notFound)
}
guard let userToken = try await UserToken.query(on: request.db)
.filter(\.$user.$id == userId)
.first() else {
throw Abort(.notFound)
}
if bearer.token == userToken.value {
request.auth.login(loginUser.toUser())
}
}
}
我的用戶Model類有一個擴展名:
extension User: ModelAuthenticatable {
static var usernameKey = \User.$email
static var passwordHashKey = \User.$passwordHash
func verify(password: String) throws -> Bool {
self.passwordHash == password.generateHash(salt: salt)
}
}
我的路線檔案有這個受保護的路線:
let protected = app.grouped(UserAuthenticator())
protected.post("login") { request async throws -> ClientTokenReponse in
let user: User = try request.auth.require(User.self)
return ClientTokenReponse(token: "token")
}
當我嘗試使用郵遞員登錄時,我總是得到 401 Unauthorized,如果我嘗試除錯 UserAuthenticator 類,它甚至不會在斷點處停止。我究竟做錯了什么?
uj5u.com熱心網友回復:
你混合了兩個不同的東西,登錄和路由保護。
AsyncBearerAuthenticator不應用于登錄呼叫,僅用于用戶應已使用令牌登錄的路由。
首先,用戶應該呼叫 login 來獲取令牌。這仍然可以通過某種方式得到保護,通常用戶必須提供密碼。您可以在 Vapor 檔案中進一步了解這一點。
您UserAuthenticator應該只驗證令牌是否有效并將其與用戶匹配。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/494913.html
