 
     @discardableResult
     public func logout() -> Bool {
-        return keychain.delete(Keychain.key)
+        return deleteAccessToken()
+    }
+
+    // MARK: - Access Token
+
+    func storeAccessToken(_ accessToken: String) -> Bool {
+        return keychain.set(accessToken, forKey: Keychain.accessTokenKey)
+    }
+
+    func retrieveAccessToken() -> String? {
+        return keychain.get(Keychain.accessTokenKey)
+    }
+
+    func deleteAccessToken() -> Bool {
+        return keychain.delete(Keychain.accessTokenKey)
     }
 
     // MARK: -

    public func login(from controller: UINavigationController, withScopes scopes: [InstagramScope] = [.basic], success: EmptySuccessHandler?, failure: FailureHandler?) {
        if let authURL = buildAuthURL(scopes: scopes) {
            let vc = InstagramLoginViewController(authURL: authURL, success: { accessToken in
                if !self.keychain.set(accessToken, forKey: Keychain.key) {
                    failure?(InstagramError(kind: .keychainError(code: self.keychain.lastResultCode), message: "Error storing access token into keychain."))
                } else {
                    controller.popViewController(animated: true)

    }

    private enum Keychain {
        static let accessTokenKey = "AccessToken"
    }

    // MARK: - Properties

    private let urlSession = URLSession(configuration: .default)
    private let keychain = KeychainSwift(keyPrefix: "SwiftInstagram")
    private let decoder = JSONDecoder()

    private var client: InstagramClient?
