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