在 Vapor 中使用 API-Key
Using API-Key in Vapor
我正在使用 Vapor 开发一个简单的网络 API。为了提供更多背景信息,我是后端开发的新手。
API 的消费者将成为 iOS 应用程序。目前,我不需要用户注册即可使用该应用程序。我想保持这样。
另一方面,我想进行一些身份验证以避免任何人使用我正在开发的API。
通过查找信息,我发现了如何实施身份验证。但我看到的例子是基于在后端为应用程序的每个用户创建用户。我不想做什么。当我们使用第三方 api 时,我想像往常一样使用 api 密钥。
我怎么可能 "api-key authentication" 有 Vapor ??
或者,我是否应该创建一个唯一的 user/password 供 iOS 应用程序(使用 API)的所有用户共享,然后使用基本或令牌身份验证?
非常感谢!
卡洛斯
解决此问题的一种方法是创建一个假令牌并使用 TokenAuthenticationMiddleware
或更可能是检查传入令牌的自定义中间件。
但是,请注意,没有什么可以阻止任何人检查来自您的应用程序的流量以查看令牌,然后使用它来访问您的 API。
根据 Tim 的想法和书中的示例 Server Side with Vapor(由 Raywenderlich.com 教程团队提供),我创建了这个自定义中间件来完成工作:
final class SecretMiddleware: Middleware {
let secret: String
init(secret: String) {
self.secret = secret
}
func respond(to request: Request, chainingTo next: Responder) throws -> Future<Response> {
guard let bearerAuthorization = request.http.headers.bearerAuthorization else {
throw Abort(.unauthorized, reason: "Missing token")
}
guard bearerAuthorization.token == secret else {
throw Abort(.unauthorized, reason: "Wrong token")
}
return try next.respond(to: request)
}
}
extension SecretMiddleware: ServiceType {
static func makeService(for worker: Container) throws -> SecretMiddleware {
let secret: String
switch worker.environment {
case .development:
secret = "foo"
default:
guard let envSecret = Environment.get("SECRET") else {
let reason = "No SECRET set on environment."
throw Abort(.internalServerError, reason: reason)
}
secret = envSecret
}
return SecretMiddleware(secret: secret)
}
}
我正在使用 Vapor 开发一个简单的网络 API。为了提供更多背景信息,我是后端开发的新手。
API 的消费者将成为 iOS 应用程序。目前,我不需要用户注册即可使用该应用程序。我想保持这样。
另一方面,我想进行一些身份验证以避免任何人使用我正在开发的API。
通过查找信息,我发现了如何实施身份验证。但我看到的例子是基于在后端为应用程序的每个用户创建用户。我不想做什么。当我们使用第三方 api 时,我想像往常一样使用 api 密钥。
我怎么可能 "api-key authentication" 有 Vapor ??
或者,我是否应该创建一个唯一的 user/password 供 iOS 应用程序(使用 API)的所有用户共享,然后使用基本或令牌身份验证?
非常感谢!
卡洛斯
解决此问题的一种方法是创建一个假令牌并使用 TokenAuthenticationMiddleware
或更可能是检查传入令牌的自定义中间件。
但是,请注意,没有什么可以阻止任何人检查来自您的应用程序的流量以查看令牌,然后使用它来访问您的 API。
根据 Tim 的想法和书中的示例 Server Side with Vapor(由 Raywenderlich.com 教程团队提供),我创建了这个自定义中间件来完成工作:
final class SecretMiddleware: Middleware {
let secret: String
init(secret: String) {
self.secret = secret
}
func respond(to request: Request, chainingTo next: Responder) throws -> Future<Response> {
guard let bearerAuthorization = request.http.headers.bearerAuthorization else {
throw Abort(.unauthorized, reason: "Missing token")
}
guard bearerAuthorization.token == secret else {
throw Abort(.unauthorized, reason: "Wrong token")
}
return try next.respond(to: request)
}
}
extension SecretMiddleware: ServiceType {
static func makeService(for worker: Container) throws -> SecretMiddleware {
let secret: String
switch worker.environment {
case .development:
secret = "foo"
default:
guard let envSecret = Environment.get("SECRET") else {
let reason = "No SECRET set on environment."
throw Abort(.internalServerError, reason: reason)
}
secret = envSecret
}
return SecretMiddleware(secret: secret)
}
}