SwAuth
SwAuth is an OAuth 2.0 HTTP request library written in Swift iOS 15.0+, macOS 12.0+, watchOS 8.0+, and tvOS 15.0+.
Features
- Usable and beautiful syntax with async/await! Kiss completion handler hell and the closure jungle goodbye!
- Supports Authorization Code Grant (RFC 6749/6750), Proof Key for Code Exchange (PKCE) extension for Authorization Code Grant (RFC 7636), and the Device Authorization Grant (RFC 8628).
- Support for all Apple device platforms.
- Retry errored requests.
- Automatically refreshes tokens.
- Tokens stored on Keychain and cross-site request forgery mitigation by default.
- Easily deal with JSON responses with SwiftyJSON built-in.
- Easily integrate with SwiftUI.
- Complete, meticulous, thorough, documentation.
- Errors that are probably, maybe actually useful.
- Built on SwiftNIO with AsyncHTTPClient.
- QR Code for the Device Authorization Flow (tvOS/watchOS).
- Sample/Example Apps.
Requirements
- Xcode 13+
- iOS 15.0+ | macOS 12.0+ | watchOS 8.0+ | tvOS 15.0+
Installation/Integration
Use the Swift Package Manager to add SwAuth to your project! Simply add the package to dependencies in your Package.swift
:
let package = Package(
name: "YOUR_PROJECT_NAME",
dependencies: [
.package(url: "https://github.com/Colaski/SwAuth.git", from: "1.0.0"),
]
)
Basic Usage
- Import SwAuth in files you wish to use it's amazing features:
import SwAuth
- Create an instance of keychain:
let keychain = Keychain(service: "com.your.bundleID",
accessGroup: "appIdentifierPrefix.com.your.bundleID").label("Your App Name")
- Create an instance of the proper authorization flow for your Web API.
let keychain = Keychain(service: "com.your.bundleID",
accessGroup: "appIdentifierPrefix.com.your.bundleID").label("Your App Name")
let spotify = PKCEAuthorizationFlow(clientID: "YourClientID",
authorizationEndpoint: URL(string: "https://accounts.spotify.com/authorize")!,
tokenEndpoint: URL(string: "https://accounts.spotify.com/api/token")!,
redirectURI: "someapp://callback",
keychain: keychain,
scopes: "user-follow-modify")
- Start an ASWebAuthenticationSession like in the example app with the instance's authorization URL:
spotify.authorizationURL
- Pass the callback URL from the ASWebAuthenticationSession into the provided handler method:
do {
try await spotify.authorizationResponseHandler(for: callbackURL)
} catch {
print(error.localizedDescription)
}
- Make an authorized request:
do {
// https://developer.spotify.com/documentation/web-api/reference/#/operations/follow-artists-users
var request = HTTPRequest(endpoint: URL(sting: "https://api.spotify.com/v1/me/following")!)
request.httpMethod = .PUT
request.endpointQueryItems = ["type": "artist"]
request.httpBody = ["ids": ["5K4W6rqBFWDnAN6FQUkS6x"]]
request.bodyEncoding = .JSON
// Send an authenticated HTTP request, this one will follow the artist Kanye on Spotify.
let json = try await spotify.authenticatedRequest(for: request, numberOfRetries: 2).json()
// Prints the JSON output
print(json)
} catch {
print(error.localizedDescription)
}
For more information, read my beautiful documentation: https://swauth.netlify.app/documentation/Swauth
Contributing
Contributions are welcome!
Make sure swift is installed and then
git clone https://github.com/Colaski/SwAuth.git
cd SwAuth
swift build
Make your changes and submit and a PR for review!
Nice to have list:
-
Include ready to go implementations of Web API's with endpoints like in the example app
- Perhaps Spotify, Google, Azure/Microsoft, Github etc.
-
OAuth 1.0 support