GitHub - kishikawakatsumi/KeychainAccess: Simple Swift wrapper for Keychain that...
source link: https://github.com/kishikawakatsumi/KeychainAccess
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
README.md
KeychainAccess
KeychainAccess is a simple Swift wrapper for Keychain that works on iOS and OS X. Makes using Keychain APIs extremely easy and much more palatable to use in Swift.
? Features
- Simple interface
- Support access group
- Support accessibility
- Support iCloud sharing
- Support TouchID and Keychain integration (iOS 8+)
- Support Shared Web Credentials (iOS 8+)
- Works on both iOS & OS X
- watchOS and tvOS are supported
- Swift 4 & Swift 3 compatible
? Usage
? See also:
? Basics
Saving Application Password
let keychain = Keychain(service: "com.example.github-token") keychain["kishikawakatsumi"] = "01234567-89ab-cdef-0123-456789abcdef"
Saving Internet Password
let keychain = Keychain(server: "https://github.com", protocolType: .https) keychain["kishikawakatsumi"] = "01234567-89ab-cdef-0123-456789abcdef"
? Instantiation
Create Keychain for Application Password
let keychain = Keychain(service: "com.example.github-token")
let keychain = Keychain(service: "com.example.github-token", accessGroup: "12ABCD3E4F.shared")
Create Keychain for Internet Password
let keychain = Keychain(server: "https://github.com", protocolType: .https)
let keychain = Keychain(server: "https://github.com", protocolType: .https, authenticationType: .htmlForm)
? Adding an item
subscripting
for String
keychain["kishikawakatsumi"] = "01234567-89ab-cdef-0123-456789abcdef"
keychain[string: "kishikawakatsumi"] = "01234567-89ab-cdef-0123-456789abcdef"
for NSData
keychain[data: "secret"] = NSData(contentsOfFile: "secret.bin")
set method
keychain.set("01234567-89ab-cdef-0123-456789abcdef", key: "kishikawakatsumi")
error handling
do { try keychain.set("01234567-89ab-cdef-0123-456789abcdef", key: "kishikawakatsumi") } catch let error { print(error) }
? Obtaining an item
subscripting
for String (If the value is NSData, attempt to convert to String)
let token = keychain["kishikawakatsumi"]
let token = keychain[string: "kishikawakatsumi"]
for NSData
let secretData = keychain[data: "secret"]
get methods
as String
let token = try? keychain.get("kishikawakatsumi")
let token = try? keychain.getString("kishikawakatsumi")
as NSData
let data = try? keychain.getData("kishikawakatsumi")
? Removing an item
subscripting
keychain["kishikawakatsumi"] = nil
remove method
do { try keychain.remove("kishikawakatsumi") } catch let error { print("error: \(error)") }
? Set Label and Comment
let keychain = Keychain(server: "https://github.com", protocolType: .https) do { try keychain .label("github.com (kishikawakatsumi)") .comment("github access token") .set("01234567-89ab-cdef-0123-456789abcdef", key: "kishikawakatsumi") } catch let error { print("error: \(error)") }
? Obtaining Other Attributes
PersistentRef
let keychain = Keychain() let persistentRef = keychain[attributes: "kishikawakatsumi"].persistentRef ...
Creation Date
let keychain = Keychain() let creationDate = keychain[attributes: "kishikawakatsumi"].creationDate ...
All Attributes
let keychain = Keychain() do { let attributes = try keychain.get("kishikawakatsumi") { $0 } print(attributes.comment) print(attributes.label) print(attributes.creator) ... } catch let error { print("error: \(error)") }
subscripting
let keychain = Keychain() let attributes = keychain[attributes: "kishikawakatsumi"] print(attributes.comment) print(attributes.label) print(attributes.creator)
? Configuration (Accessibility, Sharing, iCloud Sync)
Provides fluent interfaces
let keychain = Keychain(service: "com.example.github-token") .label("github.com (kishikawakatsumi)") .synchronizable(true) .accessibility(.afterFirstUnlock)
Accessibility
Default accessibility matches background application (=kSecAttrAccessibleAfterFirstUnlock)
For background application
Creating instance One-shotFor foreground application
Creating instance One-shot? Sharing Keychain items
? Synchronizing Keychain items with iCloud
Creating instance One-shot? Touch ID integration
? Adding a Touch ID protected item
? Updating a Touch ID protected item
? Obtaining a Touch ID protected item
? Removing a Touch ID protected item
? Shared Web Credentials
Shared web credentials is a programming interface that enables native iOS apps to share credentials with their website counterparts. For example, a user may log in to a website in Safari, entering a user name and password, and save those credentials using the iCloud Keychain. Later, the user may run a native app from the same developer, and instead of the app requiring the user to reenter a user name and password, shared web credentials gives it access to the credentials that were entered earlier in Safari. The user can also create new accounts, update passwords, or delete her account from within the app. These changes are then saved and used by Safari.
https://developer.apple.com/library/ios/documentation/Security/Reference/SharedWebCredentialsRef/
let keychain = Keychain(server: "https://www.kishikawakatsumi.com", protocolType: .HTTPS) let username = "[email protected]" // First, check the credential in the app's Keychain if let password = try? keychain.get(username) { // If found password in the Keychain, // then log into the server } else { // If not found password in the Keychain, // try to read from Shared Web Credentials keychain.getSharedPassword(username) { (password, error) -> () in if password != nil { // If found password in the Shared Web Credentials, // then log into the server // and save the password to the Keychain keychain[username] = password } else { // If not found password either in the Keychain also Shared Web Credentials, // prompt for username and password // Log into server // If the login is successful, // save the credentials to both the Keychain and the Shared Web Credentials. keychain[username] = inputPassword keychain.setSharedPassword(inputPassword, account: username) } } }
Request all associated domain's credentials
Keychain.requestSharedWebCredential { (credentials, error) -> () in }
Generate strong random password
Generate strong random password that is in the same format used by Safari autofill (xxx-xxx-xxx-xxx).
let password = Keychain.generatePassword() // => Nhu-GKm-s3n-pMx
How to set up Shared Web Credentials
- Add a com.apple.developer.associated-domains entitlement to your app. This entitlement must include all the domains with which you want to share credentials.
- Add an apple-app-site-association file to your website. This file must include application identifiers for all the apps with which the site wants to share credentials, and it must be properly signed.
- When the app is installed, the system downloads and verifies the site association file for each of its associated domains. If the verification is successful, the app is associated with the domain.
More details:
https://developer.apple.com/library/ios/documentation/Security/Reference/SharedWebCredentialsRef/
? Debugging
Display all stored items if print keychain object
let keychain = Keychain(server: "https://github.com", protocolType: .https) print("\(keychain)")
=>
[
[authenticationType: default, key: kishikawakatsumi, server: github.com, class: internetPassword, protocol: https]
[authenticationType: default, key: hirohamada, server: github.com, class: internetPassword, protocol: https]
[authenticationType: default, key: honeylemon, server: github.com, class: internetPassword, protocol: https]
]
Obtaining all stored keys
let keychain = Keychain(server: "https://github.com", protocolType: .https) let keys = keychain.allKeys() for key in keys { print("key: \(key)") }
=>
key: kishikawakatsumi
key: hirohamada
key: honeylemon
Obtaining all stored items
let keychain = Keychain(server: "https://github.com", protocolType: .https) let items = keychain.allItems() for item in items { print("item: \(item)") }
=>
item: [authenticationType: Default, key: kishikawakatsumi, server: github.com, class: InternetPassword, protocol: https]
item: [authenticationType: Default, key: hirohamada, server: github.com, class: InternetPassword, protocol: https]
item: [authenticationType: Default, key: honeylemon, server: github.com, class: InternetPassword, protocol: https]
Requirements
OS Swift v1.1.x iOS 7+, OSX 10.9+ 1.1 v1.2.x iOS 7+, OSX 10.9+ 1.2 v2.0.x iOS 7+, OSX 10.9+, watchOS 2+ 2.0 v2.1.x iOS 7+, OSX 10.9+, watchOS 2+ 2.0 v2.2.x iOS 8+, OSX 10.9+, watchOS 2+, tvOS 9+ 2.0, 2.1 v2.3.x iOS 8+, OSX 10.9+, watchOS 2+, tvOS 9+ 2.0, 2.1, 2.2 v2.4.x iOS 8+, OSX 10.9+, watchOS 2+, tvOS 9+ 2.2, 2.3 v3.0.x iOS 8+, OSX 10.9+, watchOS 2+, tvOS 9+ 3.x v3.1.x iOS 8+, OSX 10.9+, watchOS 2+, tvOS 9+ 4.0, 4.1, 4.2
Installation
CocoaPods
KeychainAccess is available through CocoaPods. To install it, simply add the following lines to your Podfile:
use_frameworks!
pod 'KeychainAccess'
Carthage
KeychainAccess is available through Carthage. To install it, simply add the following line to your Cartfile:
github "kishikawakatsumi/KeychainAccess"
Swift Package Manager
KeychainAccess is also available through Swift Package Manager.
First, create Package.swift
that its package declaration includes:
import PackageDescription let package = Package( dependencies: [ .Package(url: "https://github.com/kishikawakatsumi/KeychainAccess.git", majorVersion: 2) ] )
Then, type
$ swift build
To manually add to your project
- Add
Lib/KeychainAccess.xcodeproj
to your project - Link
KeychainAccess.framework
with your target - Add
Copy Files Build Phase
to include the framework to your application bundle
See iOS Example Project as reference.
Author
kishikawa katsumi, [email protected]
License
KeychainAccess is available under the MIT license. See the LICENSE file for more info.
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK