Example Facebook Login

This is a working example of implementing login and registering of a user using Vouchr’s Sandbox Login. Creating of the views has been ommitted to show just the steps for actually logging in.

Implementation steps:

  1. Implement VOAuthClient.
  2. Create a JWT Token.
  3. Create a Credential with the JWT Token.
  4. Call login on VouchrEngine‘s UserManager with the Credential.

Source code:

import UIKit
import VouchrSDK

class VouchrSDKLoginManager: NSObject, VOAuthClient {
    var vouchrSDK:VouchrEngine
    var credential:Credential?
    var username:String?

    override init() {
        vouchrSDK = VouchrEngine.instance();
    }

    func login(viewController:UIViewController, completion:@escaping (User) -> Void) {
            let username:String? = "someusername"
            let password:String? = "somepassword"
            self.loginToVouchrSDK(username: username, password: password, completion: completion)
    }

    func loginToVouchrSDK(username:String?, password:String?, completion:@escaping (User) -> Void) {
        self.username = username;

        // step 2
        let jwtToken = self.createJWTToken(username: username!, password: password!)
        // step 3
        self.credential = Credential(dictionary: ["networkId": username!,
                                                  "network": "JWT_TEST",
                                                  "idToken": jwtToken]);

        // step 4
        self.vouchrSDK.userManager.login(withCredentials: self.credential, authClient: self, onSuccess: {[unowned self] (user) -> Void in
                completion(user);
            }, onError: { [unowned self] (error) -> Void in
                // error handling here
        });
    }

    // step 1
    func userForRegistration(with credential: Credential!, onSuccess: ((Credential?, SimpleUser?) -> Void)!, onError: ((Error?) -> Void)!) {
        onSuccess(credential, SimpleUser(firstName: "test", lastName: "user", email: self.username!, profileImageUrl: nil, birthday: nil));
    }

    // CRITICAL: for production uses, jwt must be created/signed by partner login service, not created locally and should be encrypted
    private func createJWTToken(username:String, password:String) -> String {
        let header:[String: String] = ["alg": "none", "typ": "JWT"]
        let payload:[String: String] = ["sub": username]

        let headerJWTData:Data = try! JSONSerialization.data(withJSONObject: header,options: JSONSerialization.WritingOptions.prettyPrinted)
        let payloadJWTData:Data = try! JSONSerialization.data(withJSONObject: payload, options: JSONSerialization.WritingOptions.prettyPrinted)
        let headerJWTBase64:String =  headerJWTData.base64EncodedString().replacingOccurrences(of: "=", with: "");
        let payloadJWTBase64:String = payloadJWTData.base64EncodedString().replacingOccurrences(of: "=", with: "");

        return String(format: "%@.%@", headerJWTBase64, payloadJWTBase64)
    }
}