如何使用 Vapor 创建登录和注销(基本身份验证)

How to Create login and logout using Vapor (Basic Authentication)

我想创建登录和注销方法和路由。我已经完成了基本身份验证,但现在不知道如何继续。我应该怎么做,我应该使用会话吗?

我正在使用 Vapor 3、Swift 4 和 PostgreSQL,并遵循了本教程 https://medium.com/rocket-fuel/basic-authentication-with-vapor-3-c074376256c3。我是新手,所以如果你能帮助我,我将不胜感激!

我的用户模型

struct User : Content, PostgreSQLModel, Parameters {
    var id : Int?
    private(set) var email: String
    private(set) var password: String
}

extension User: BasicAuthenticatable {
    static let usernameKey: WritableKeyPath<User, String> = \.email
    static let passwordKey: WritableKeyPath<User, String> = \.password
}

UserController.swift,注册用户。

private extension UserController {

    func registerUser(_ request: Request, newUser: User) throws -> Future<HTTPResponseStatus> {

        return try User.query(on: request).filter(\.email == newUser.email).first().flatMap { existingUser in

            guard existingUser == nil else {
                throw Abort(.badRequest, reason: "a user with this email already exists" , identifier: nil)
            }

            let digest = try request.make(BCryptDigest.self)
            let hashedPassword = try digest.hash(newUser.password)
            let persistedUser = User(id: nil, email: newUser.email, password: hashedPassword)

            return persistedUser.save(on: request).transform(to: .created)
        }
    }
}

所以在基本身份验证中没有 'logout' 本身,因为没有登录。使用 HTTP Basic Auth,您可以在每个请求中传输用户的凭据,并在每个请求中验证这些凭据。

您提到 sessions,但首先了解您提供的服务类型很重要?您提供的是 API 还是网站?它们是不同的用例,并且具有不同的(通常)身份验证和登录方法。

对于 API,您可以使用基本身份验证,通常在您的登录功能中,您可以将凭证交换为某种令牌。然后,客户端会在以后的请求中提供该令牌以验证用户身份。要注销,您只需在后端销毁令牌,使其不再有效。

对于网站,情况略有不同,因为您不能像处理普通客户端那样处理请求(例如在请求中设置 Authorization header)。 HTTP Basic 身份验证在网站中是可能的,尽管现在很少使用。传统上发生的事情是您通过 Web 表单提交用户的凭据,对其进行身份验证,然后将经过身份验证的用户保存在 session 中,并向浏览器提供一个 session cookie。这会在以后的请求中对用户进行身份验证。要注销用户,您只需从 session.

中删除该用户

Vapor 的 Auth 包提供了执行这两种情况所需的一切。有关两者的示例,请参阅 https://github.com/raywenderlich/vapor-til