Authomatek

Authomatek 是一个用于 Vapor 的 Swift 包,为关系型数据库提供预配置的身份验证。它自动化了创建所有必要路由、控制器和模型的流程,使您能够快速轻松地为您的 Vapor 应用程序设置身份验证。

借助 Authomatek,您可以立即启动并运行安全的用户身份验证。此外,Authomatek 支持 JSON Web 令牌 (JWT) 以实现安全的用户身份验证和授权。

功能特性


路由


URL HTTP 方法 描述 内容 (请求体)
/auth/register POST 注册新用户 User.DTO.Register
/auth/login POST 使用现有用户登录 User.DTO.Login
/auth/logout GET 使用现有用户登出 Bearer Token
/auth/refresh GET 刷新现有 JWT 令牌 Bearer Token

安装


Authomatek 可以使用 Swift Package Manager 安装。只需将以下行添加到您的 Package.swift 文件中

dependencies: [
    .package(url: "https://github.com/tugcanonbas/authomatek.git", from: "0.0.1")
]
dependencies: [
    .product(name: "Authomatek", package: "authomatek"),
],

环境变量


默认值 描述
SECRET_KEY_FILE_PATH JWT 的 .pem 文件路径
ACCESS_EXPIRATION_DATE_INTERVAL 3600 访问令牌过期时间
REFRESH_EXPIRATION_DATE_INTERVAL 604800 刷新令牌过期时间

配置


ssh-keygen -t rsa -b 4096 -m PEM -f {{name_of_file}}.key
SECRET_KEY_FILE_PATH="{{.pem file path}}"
import Authomatek
...
...
try Authomatek.configure(app)

Authomatek 将自动为您创建必要的路由、控制器、模型和迁移。

自定义


struct AuthoConnectable: AuthoControllable {
// Custom controller code
}
let config = RouteConfig(path: "api", "v1", "authomatek", register: "register", login: "login", logout: "logout", refresh: "refresh")
let controller = AuthoConnectable()
try Authomatek.configure(app, configuration: config, controller: controller)

模型


用户协议

protocol User {
    var id: UUID? { get }
    var email: String { get }
    var username: String { get }
    var passwordHash: String { get }
    var status: UserStatus { get }
    var createdAt: Date? { get }
    var updatedAt: Date? { get }
    var deletedAt: Date? { get }
}

UserStatus 枚举

enum UserStatus: String, Codable {
    case active
    case inactive
    case deleted
}

用户 DTO

public extension UserModel {
    enum DTO {
        public struct User: Content {
            let id: UUID
            let email: String
            let username: String
            let status: UserStatus
            let createdAt: Date
            let updatedAt: Date
            let deletedAt: Date?
        }

        public struct Users: Content {
            let count: Int
            let users: [User]

            ...
        }

        public struct Register: Content, Validatable {
            let email: String
            let username: String
            let password: String

            ...
        }

        public struct Login: Content, Validatable {
            let email: String?
            let username: String?
            let password: String

            ...
        }
    }
}

验证

let usernameValidators: Validator<String> = .count(3...) && .alphanumeric && .pattern(#"^[a-zA-Z0-9-_.]*$"#)

validations.add(ValidationKeys.email, as: String.self, is: .email, required: false)
validations.add(ValidationKeys.username, as: String.self, is: usernameValidators, required: false)
validations.add(ValidationKeys.password, as: String.self, is: .count(8...), required: true)

许可协议

ConnectableKit 遵循 MIT 许可协议。有关更多信息,请参阅 LICENSE 文件。