         }
     }
     
-    public func signIn(email: String, password: String, completion: @escaping (PyroAuthResult) -> Void) {
+    public func signIn(email: String, password: String, completion: @escaping (PyroAuthResult<PyroAuthContent>) -> Void) {
         let data: [AnyHashable: Any] = ["email": email, "password": password, "returnSecureToken": true]
         let path = "\(signInPath)?key=\(key)"
         request.write(path: path, method: .post, data: data) { result in

    internal var request: RequestProtocol
    internal var signInPath: String
    internal var registerPath: String
    
    public init(key: String, request: RequestProtocol, signInPath: String, registerPath: String) {
        self.key = key
        self.request = request
        self.signInPath = signInPath
        self.registerPath = registerPath
    }
    
    public func register(email: String, password: String, completion: @escaping (PyroAuthResult) -> Void) {
        let data: [AnyHashable: Any] = ["email": email, "password": password, "returnSecureToken": true]
        let path = "\(registerPath)?key=\(key)"
        request.write(path: path, method: .post, data: data) { result in

        }
    }
    
    public func refresh(token: String, completion: @escaping (PyroAuthResult<PyroAuthTokenContent>) -> Void) {
        let data: [AnyHashable: Any] = ["grant_type": "refresh_token", "refresh_token": token]
        let path = "\(refreshPath)?key=\(key)"
        request.write(path: path, method: .post, data: data) { result in
            switch result {
            case .succeeded(let info):
                guard let resultInfo = info as? [AnyHashable: Any] else {
                    completion(.failed(PyroAuthError.unexpectedContent))
                    return
                }
                
                guard let accessToken = resultInfo["access_token"] as? String,
                    let refreshToken = resultInfo["refresh_token"] as? String,
                    let expiration = resultInfo["expires_in"] as? String else {
                    return completion(.failed(PyroAuthError.incompleteContent))
                }
                
                var content = PyroAuthTokenContent()
                content.accessToken = accessToken
                content.refreshToken = refreshToken
                content.expiration = expiration
                
                completion(.succeeded(content))
            
            case .failed(let info):
                completion(.failed(info))
            }
        }
    }
    
    internal func handleRequestResult(_ result: RequestResult, completion: @escaping (PyroAuthResult<PyroAuthContent>) -> Void) {
        switch result {
        case .succeeded(let info):
            guard let resultInfo = info as? [AnyHashable: Any] else {
