         }
     }
     
-    internal func handleRequestResult(_ result: RequestResult, completion: @escaping (PyroAuthResult) -> Void) {
+    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 {

    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 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
