持久認(rèn)證意味著用戶不需要在每個(gè)請(qǐng)求中提供其憑據(jù)欢搜。這對(duì)于用戶只需要登錄一次的網(wǎng)絡(luò)應(yīng)用程序很有用很泊。
注意
對(duì)于API乙嘀,建議用戶每次請(qǐng)求發(fā)送令牌凳宙。有關(guān)令牌身份驗(yàn)證的示例当叭,請(qǐng)參閱認(rèn)證入門茬故。
會(huì)話(Sessions)
默認(rèn)情況下,會(huì)話(Sessions)內(nèi)置在Vapor中蚁鳖,是在Web應(yīng)用程序中持久保留用戶的簡(jiǎn)單方法磺芭。
會(huì)話可持久化(SessionPersistable)
第一步是將用戶模型繼承SessionPersistable
協(xié)議。
import AuthProvider
extension User: SessionPersistable {}
如果您的用戶是一個(gè)Model醉箕,則協(xié)議方法將自動(dòng)實(shí)現(xiàn)钾腺。但是率翅,如果你想做一些自定義的操作临谱,你可以實(shí)現(xiàn)這些。
import AuthProvider
import HTTP
extension User: SessionPersistable {
func persist(for: Request) throws {
// something custom
}
static func fetchPersisted(for: Request) throws -> Self? {
// something custom
}
}
中間件(Middleware)
現(xiàn)在用戶是SessionPersistable
首繁,我們可以創(chuàng)建我們的中間件坞琴。
會(huì)話(Sessions)
首先讓我們從創(chuàng)建開始SessionsMiddleware
哨查。我們將使用它MemorySessions()
來開始。
let memory = MemorySessions()
let sessionsMiddleware = SessionsMiddleware(memory)
持久(Persist)
現(xiàn)在我們來創(chuàng)建PersistMiddleware
剧辐。這將會(huì)在驗(yàn)證了用戶的身份后寒亥,將其持久化邮府。
let persistMiddleware = PersistMiddleware(User.self)
由于我們的用戶繼承SessionPersistable
(因此是持久的(Persistable
)),我們可以將其傳遞給這個(gè)中間件的init溉奕。
認(rèn)證(Authentication)
現(xiàn)在創(chuàng)建您選擇的身份認(rèn)證中間件褂傀。我們將使用PasswordAuthenticationMiddleware
它需要使用Authorization: Basic ...
帶有用戶的用戶名和密碼的頭。
let passwordMiddleware = PasswordAuthenticationMiddleware(User.self)
注意
User
必須繼承PasswordAuthenticatable
該中間件的使用加勤。請(qǐng)參閱認(rèn)證密碼(Password) 部分了解更多信息仙辟。
Droplet
現(xiàn)在我們可以創(chuàng)建一個(gè)Droplet并添加所有的中間件。
import Vapor
import Sessions
import AuthProvider
let drop = try Droplet()
let authed = drop.grouped([sessionsMiddleware, persistMiddleware, passwordMiddleware])
瞧一瞧
如果您只想全局要求密碼中間件鳄梅,請(qǐng)檢查HTTP文檔中的 Middleware Config部分叠国。
路由(Route)
現(xiàn)在,您可以添加路由以返回經(jīng)過身份驗(yàn)證的用戶戴尸。
authed.get("me") { req in
// return the authenticated user
return try req.auth.assertAuthenticated(User.self)
}
請(qǐng)求(Request)
現(xiàn)在我們可以向我們的Vapor應(yīng)用程序發(fā)出請(qǐng)求粟焊。
GET /me HTTP/1.1
Authorization: Basic dmFwb3I6Zm9v
注意
dmFwb3I6Zm9v
是“vapor:foo”base64編碼,其中“vapor”是用戶名孙蒙,“foo”是密碼项棠。這是基本授權(quán)標(biāo)頭的格式。
我們應(yīng)該得到一個(gè)回應(yīng)挎峦。
HTTP/1.1 200 OK
Content-Type: text/plain
Set-Cookie: vapor-session=...
Vapor
請(qǐng)注意在回應(yīng)中的vapor-session
香追。這可以在隨后的請(qǐng)求中使用,而不是用戶名和密碼坦胶。