Kitura 插件,用于 Credentials 系统,通过令牌头部的用户名/密码启用连接管理。示例代码可以在 Sample 目录中找到。
这是令牌系统的包装器/插件。它处理身份验证中间件机制,并且相当透明和可配置。
String
):在用户名/密码身份验证页面中查找的表单字段名称。String
):传递令牌的头部名称(如果存在)。Bool
/String
):如果开发者想要将用户数据结构存储在会话字典中(还有其他方法可以获取,但这可能有助于缓存)。String
)(可选):有时我们想锁定或分离访问我们 API 的应用程序,因此将其包含在此处。这是系统的核心:根据令牌和用户名/密码组合的存储方式,开发者必须提供一个兼容的类型,以使插件正常运行。在示例中,我们使用了一个简单的(且愚蠢的)内存系统,但通常会使用文件/数据库/ ...
let memoryTokens = MemoryTokenAuth()
let memTokenCred = CredendialsToken(memoryTokens)
let credentials = Credentials()
credentials.register(plugin: memTokenCred)
(来自示例代码,只是一个愚蠢的内存用户管理类,它不会在重启后存活)
通过以下两种方式之一设置将使用此插件进行身份验证的路由
router.all("/hello.*", middleware: [credentials])
将这些路由设置为在每次请求时都必须具有令牌或用户名/密码(对于令牌验证的 API 非常有用)
router.all("/profile", handler: [credentials.authenticate(credentialsType: memTokenCred.name, successRedirect: nil, failureRedirect: "/login")])
将这些路由设置为必须在headers/表单数据或会话中具有身份验证,并在需要时将会话中的凭据存储在会话中。
您将需要一个登录(可能还有注册)路由来处理 POST 表单以生成或获取访问令牌。然后,所有受保护的路由都可以与 Credentials 中间件一起使用,并且将与相关头部中传递的令牌匹配。
您不能真正为此使用中间件机制。您将需要使用处理程序系统来保护路由,因为会话管理和可能重定向到登录页面。
当然,您可以混合使用这两种方式,使用通配符系统。唯一的问题是,您不能将中间件机制与重定向插件一起使用。如果混合使用这两种方式,您将需要决定该插件是否可能重定向,如果是,
handler
方法middleware
方法Credential 系统的工作方式是,您的程序可能必须与顶层凭证系统分开与 CredentialTokenVerifier
实例通信,例如,如果您想要有一个注册/登录机制来保存您的数据。
有时它可能会使代码有点笨拙,这就是为什么它是一个协议:您可以实现数据库连接类来处理所有加载/保存操作,并且它可以符合该协议,从而合并凭证插件和您无论如何都会使用的单例。