該Authorization: Basic ...
頭可以被用于發送用戶名和密碼憑據進行身份驗證。
此頁面將向您展示如何在您的網絡應用程序中使用此類型的身份驗證。
注意
應盡可能避免發送和存儲密碼。使用令牌或會話持久性,以防止在每個請求中發送密碼。
密碼認證(Password Authenticatable)
首先將您的用戶模型繼承PasswordAuthenticatable協議。
import AuthProvider
extension User: PasswordAuthenticatable { }
自定義(Custom)
如果您的用戶符合Model
要求,則所有必需的方法將自動實現。
但是,如果你想做一些自定義的操作,你可以實現它們。
extension User: PasswordAuthenticatable {
/// Return the user matching the supplied
/// username and password
///返回用戶匹配提供的用戶名和密碼
static func authenticate(_: Password) throws -> Self {
// something custom 自定義的東西
}
/// The entity's hashed password used for
/// validating against Password credentials
/// with a PasswordVerifier
/// 實體的散列密碼用于驗證密碼PasswordVerifier憑證
var hashedPassword: String? {
// something custom 自定義的東西
}
/// The key under which the user's username,
/// email, or other identifing value is stored.
/// 的關鍵用戶的用戶名、電子郵件或其他鑒別值存儲。
static var usernameKey: String {
// something custom 自定義的東西
}
/// The key under which the user's password
/// is stored.
/// 的關鍵是存儲用戶的密碼。
static var passwordKey: String {
// something custom 自定義的東西
}
/// Optional password verifier to use when
/// comparing plaintext passwords from the
/// Authorization header to hashed passwords
/// in the database.
/// 可選的密碼校驗時使用比較的明文密碼授權頭哈希密碼在數據庫中。
static var passwordVerifier: PasswordVerifier? {
// some hasher
}
}
中間件(Middleware)
一旦您的model符合PasswordAuthenticatable
協議,就可以創建中間件。
import Vapor
import AuthProvider
let drop = try Droplet()
let passwordMiddleware = PasswordAuthenticationMiddleware(User.self)
let authed = try drop.grouped(passwordMiddleware)
try drop.run()
添加到authed
路由組的所有路由將受到密碼中間件的保護。
瞧一瞧
如果您只想全局要求密碼中間件,請檢查HTTP文檔中
的中間件配置部分。
路由(Route)
現在,您可以添加路由以返回經過身份驗證的用戶。
authed.get("me") { req in
// return the authenticated user
return try req.auth.assertAuthenticated(User.self)
}
調用req.user.authenticated(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
Vapor