Soto Cognito 身份验证

Swift 6.0

这是 Soto Cognito Authentication Kit 的 Vapor 封装器。它为配置提供应用程序存储,并在请求时进行身份验证调用。有关 Soto Cognito Authentication Kit 的文档可以在这里找到。

与 Vapor 一起使用

配置

将您的 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)

访问功能

诸如 createUsersignUp、使用用户名和密码进行 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 将执行用户名、密码身份验证,并返回 CognitoAuthenticateResponseCognitoAccessAuthenticator 将执行访问令牌身份验证,并返回 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)
}