持久认证意味着用户不需要在每个请求中提供其凭据。这对于用户只需要登录一次的网络应用程序很有用。
注意
对于API,建议用户每次请求发送令牌。有关令牌身份验证的示例,请参阅认证入门。
会话(Sessions)
默认情况下,会话(Sessions)内置在Vapor中,是在Web应用程序中持久保留用户的简单方法。
会话可持久化(SessionPersistable)
第一步是将用户模型继承SessionPersistable
协议。
import AuthProvider
extension User: SessionPersistable {}
如果您的用户是一个Model,则协议方法将自动实现。但是,如果你想做一些自定义的操作,你可以实现这些。
import AuthProvider
import HTTP
extension User: SessionPersistable {
func persist(for: Request) throws {
// something custom
}
static func fetchPersisted(for: Request) throws -> Self? {
// something custom
}
}
中间件(Middleware)
现在用户是SessionPersistable
,我们可以创建我们的中间件。
会话(Sessions)
首先让我们从创建开始SessionsMiddleware
。我们将使用它MemorySessions()
来开始。
let memory = MemorySessions()
let sessionsMiddleware = SessionsMiddleware(memory)
持久(Persist)
现在我们来创建PersistMiddleware
。这将会在验证了用户的身份后,将其持久化。
let persistMiddleware = PersistMiddleware(User.self)
由于我们的用户继承SessionPersistable
(因此是持久的(Persistable
)),我们可以将其传递给这个中间件的init。
认证(Authentication)
现在创建您选择的身份认证中间件。我们将使用PasswordAuthenticationMiddleware
它需要使用Authorization: Basic ...
带有用户的用户名和密码的头。
let passwordMiddleware = PasswordAuthenticationMiddleware(User.self)
注意
User
必须继承PasswordAuthenticatable
该中间件的使用。请参阅认证密码(Password) 部分了解更多信息。
Droplet
现在我们可以创建一个Droplet并添加所有的中间件。
import Vapor
import Sessions
import AuthProvider
let drop = try Droplet()
let authed = drop.grouped([sessionsMiddleware, persistMiddleware, passwordMiddleware])
瞧一瞧
如果您只想全局要求密码中间件,请检查HTTP文档中的 Middleware Config部分。
路由(Route)
现在,您可以添加路由以返回经过身份验证的用户。
authed.get("me") { req in
// return the authenticated user
return try req.auth.assertAuthenticated(User.self)
}
请求(Request)
现在我们可以向我们的Vapor应用程序发出请求。
GET /me HTTP/1.1
Authorization: Basic dmFwb3I6Zm9v
注意
dmFwb3I6Zm9v
是“vapor:foo”base64编码,其中“vapor”是用户名,“foo”是密码。这是基本授权标头的格式。
我们应该得到一个回应。
HTTP/1.1 200 OK
Content-Type: text/plain
Set-Cookie: vapor-session=...
Vapor
请注意在回应中的vapor-session
。这可以在随后的请求中使用,而不是用户名和密码。