这是 Soto Cognito Authentication Kit 的 Vapor 封装器。它为配置提供应用程序存储,并在请求时进行身份验证调用。有关 Soto Cognito Authentication Kit 的文档可以在这里找到。
将您的 CognitoConfiguration
存储在 Application 对象上。在 configure.swift 中添加以下内容以及您的配置详细信息
let awsClient = AWSClient(httpClientProvider: .shared(app.http.client.shared))
let awsCognitoConfiguration = CognitoConfiguration(
userPoolId: String = "eu-west-1_userpoolid",
clientId: String = "23432clientId234234",
clientSecret: String = "1q9ln4m892j2cnsdapa0dalh9a3aakmpeugiaag8k3cacijlbkrp",
cognitoIDP: CognitoIdentityProvider = CognitoIdentityProvider(client: awsClient, region: .euwest1),
adminClient: true
)
app.cognito.authenticatable = CognitoAuthenticatable(configuration: awsCognitoConfiguration)
CognitoIdentity 配置可以使用类似的方式进行设置。
let awsCognitoIdentityConfiguration = CognitoIdentityConfiguration(
identityPoolId: String = "eu-west-1_identitypoolid",
userPoolId: String = "eu-west-1_userpoolid",
region: .euwest1,
cognitoIdentity: CognitoIdentity = CognitoIdentity(client: awsClient, region: .euwest1)
)
let app.cognito.identifiable = CognitoIdentifiable(configuration: awsCognitoIdentityConfiguration)
诸如 createUser
、signUp
、使用用户名和密码进行 authenticate
以及 responseToChallenge
等功能都可以通过 request.application.cognito.authenticatable
访问。以下登录路由将返回来自 CognitoAuthenticable.authenticate
的完整响应。
func login(_ req: Request) async throws -> CognitoAuthenticateResponse {
let user = try req.content.decode(User.self)
return try await req.application.cognito.authenticatable.authenticate(
username: user.username,
password: user.password,
context: req,
on:req.eventLoop)
}
如果在 'Authorization' 标头中以 Bearer 令牌形式提供了 id、访问或刷新令牌,则可以使用 Request 中的以下函数来验证它们:authenticate(idToken:)
、authenticate(accessToken:)
、refresh
。如下所示
func authenticateAccess(_ req: Request) async throws {
let token = try await req.cognito.authenticateAccess()
}
有三种身份验证器可用。有关 Vapor 中身份验证的更多详细信息,请参阅 Vapor 文档。CognitoBasicAuthenticator
将执行用户名、密码身份验证,并返回 CognitoAuthenticateResponse
。CognitoAccessAuthenticator
将执行访问令牌身份验证,并返回 CognitoAccessToken
,其中包含可以从访问令牌中提取的所有信息。CognitoIdAuthenticator<Payload>
执行 id 令牌身份验证,并将信息从 id 令牌提取到您自己的 Payload
类型中。可以在 id 令牌中找到的标准声明列表在 [OpenID 规范] (https://openid.net/specs/openid-connect-core-1_0.html#StandardClaims) 中详细说明。您的 Payload
类型需要使用这些标签进行解码,包括用户名标签 "cognito:username" 以及您可能为用户池设置的任何自定义标签。下面是使用 id 令牌身份验证器的示例。
首先创建一个 User 类型来存储您的 id 令牌 payload。
struct User: Content & Authenticatable {
let username: String
let email: String
private enum CodingKeys: String, CodingKey {
case username = "cognito:username"
case email = "email"
}
}
添加一个使用身份验证器的路由。CognitoIdAuthenticator
验证请求,guardMiddleware
确保用户已通过身份验证。实际函数通过 req.auth.require
访问 User
类型。
app.grouped(CognitoIdAuthenticator<User>())
.grouped(User.guardMiddleware())
.get("user") { (req) throws -> EventLoopFuture<User> in
let user = try req.auth.require(User.self)
return req.eventLoop.next().makeSucceededFuture(user)
}