Colaski / SwAuth

OAuth 2.0 library using async/await written in Swift.

Home Page:https://swauth.netlify.app/documentation/Swauth

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

This repository is now archived as my time has become limited and my interest in Apple development has waned.

SwAuth License Version

Codacy Badge Build SPM Platforms Swift

SwAuth is an OAuth 2.0 HTTP request library written in Swift for iOS 13.0+, macOS 10.15+, watchOS 6.0+, and tvOS 13.0+.

Features

  • Beautiful readable 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, useful.
  • Built on SwiftNIO with AsyncHTTPClient.
  • QR Code for the Device Authorization Flow (tvOS/watchOS).
  • Sample/Example Apps.
  • Built- in support for some popular Web APIs.

Built-in Support

SwAuth has build in support for some Web API's with more to come:

Requirements

  • Xcode 13.2+
  • iOS 13.0+ | macOS 10.15+ | watchOS 6.0+ | tvOS 13.0+

Installation/Integration

Swift Package

Use the Swift Package Manager to add SwAuth to your project! Simply add the package to dependencies in your Package.swift:

// swift-tools-version:5.5
import PackageDescription

let package = Package(
    name: "YourPackageName",
    products: [
        .library(name: "YourPackageName", targets: ["YourPackageName"]),
    ],
    dependencies: [
        .package(url: "https://github.com/Colaski/SwAuth.git", from: "1.0.1"),
    ],
    targets: [
        .target(name: "YourPackageName", dependencies: ["SwAuth"]),
    ]
)

App

Select File > Add Packages in Xcode and enter https://github.com/Colaski/SwAuth.git

Xcode should take care of the rest!

Basic Usage

  1. Import SwAuth in files you wish to use it's amazing features:

    import SwAuth
  2. Create an instance of keychain:

    let keychain = Keychain(service: "com.your.bundleID",
                            accessGroup: "appIdentifierPrefix.com.your.bundleID").label("Your App Name")

    SwAuth uses KeychainAccess to make setting up the keychain easy. You can see a full list of options for it here: https://github.com/kishikawakatsumi/KeychainAccess#key-configuration-accessibility-sharing-icloud-sync.

  3. 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")
    
    var 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")
    spotify.additionalRefreshTokenBodyParams = ["client_id": "YourClientID"] // Spotify specifically requires the client ID to be included in the refresh token's body parameters.
  4. Start an ASWebAuthenticationSession like in the example app with the instance's authorization URL:

    spotify.authorizationURL
  5. Pass the callback URL from the ASWebAuthenticationSession into the provided handler method:

    do {
        try await spotify.authorizationResponseHandler(for: callbackURL)
    } catch {
        print(error.localizedDescription)
    }
  6. 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 West 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

Check out CONTRIBUTING.md for information!

License

SwAuth its self is licensed under the MIT License, however please take notice of the NOTICE file in the root of this repository. Also, make sure to check the respective licenses of this library's dependencies before releasing your project.