【问题标题】:Using API-Key in Vapor在 Vapor 中使用 API-Key
【发布时间】:2018-11-23 23:38:59
【问题描述】:

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

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

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

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

我如何使用 Vapor 进行“api-key 身份验证”??

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

非常感谢!

卡洛斯

【问题讨论】:

    标签: vapor


    【解决方案1】:

    按照 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)
    }
    }
    

    【讨论】:

    • 感谢您的提示和书籍推荐。但是,您的代码具有误导性,因为您检查的是承载授权令牌,而不是 Api-Key。问题是关于没有用户处理的应用程序,这里不需要使用 Bearer 令牌。
    【解决方案2】:

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

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

    【讨论】:

    • 同意,唯一可以减轻检查流量的不利因素是使用证书固定。但我怀疑这个应用程序需要那种级别的安全性。
    • 谢谢蒂姆!一个问题(也许很傻)。关于有人检查来自我的应用程序的流量。我总是会遇到这个问题,对吧?我的意思是,即使我实施了完全身份验证,也有人可以检查流量并获取特定用户的令牌,不是吗?
    • 是的,证书固定是一种解决方法,但您仍然可以反编译应用程序并取出密钥。您可以设置一些障碍,但基本上不可能完全阻止它。
    • @Carlos 是的,你总会遇到这个问题。但是,通过完全身份验证,您需要用户提供凭据才能获取密钥。这意味着您可以更好地锁定它。例如,您没有可以做所有事情的全局密钥,您可以添加授权,以便 API 密钥只能与某些部分进行交互。这有意义吗?
    • 如果流量通过 ssl,那么标头将被加密,并且令牌对流量不可见。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-14
    相关资源
    最近更新 更多