在蒸气中使用API​​密钥

时间:2018-11-23 23:38:59

标签: vapor

我正在用Vapor开发一个简单的Web API。为了提供更多背景信息,我是后端开发的新手。

API的使用者将是一个iOS应用程序。目前,我不需要用户注册即可使用该应用程序。我希望保持这种状态。

另一方面,我想进行一些身份验证,以避免任何人都可以使用我正在开发的API。

寻找信息,我发现了如何实现身份验证。但是我看到的示例都是基于在后端为应用程序的每个用户创建用户。我不想做什么。我想像通常使用第三方api一样使用api密钥。

我如何通过Vapor进行“ API密钥身份验证”?

或者,我是否应该创建一个唯一的用户/密码,并由所有iOS应用程序(使用API​​)的用户共享,然后使用基本身份验证或令牌身份验证?

非常感谢您!

卡洛斯

2 个答案:

答案 0 :(得分:3)

解决此问题的一种方法是创建一个伪造的令牌,并使用TokenAuthenticationMiddleware或更可能使用一种自定义中间件来检查传入的令牌。

但是,请注意,没有什么可以阻止任何人检查来自您应用程序的流量以查看令牌,然后使用该令牌访问您的API。

答案 1 :(得分:1)

按照Tim的想法和带有蒸汽的服务器端(由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)
}
}