April 5, 2021

x5SSOSDK iOS framework v1.2

Использование:

Вся работа с авторизацией происходит через класс AuthManager. Для его инициализации необходимо передать исходный ViewControler и объект конфигурации, который представлен классом Configuration.

Пример:

var manager: AuthManager?
override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        let config = Configuration(
            webAuthUrl: webAuthUrl,
            tokenUrl: tokenUrl,
            callBackUrl: callBackUrl,
            exchangeLegacyTokenUrl: exchangeLegacyTokenUrl,
            manageAgreementsUrl: manageAgreementsUrl,
            clientID: clientID,
            flow: AuthorizationFlow)
        manager = AuthManager(viewControler: self, config: config)
}

В примере (SSOX5ExampleFirst) используются следующие параметры конфигурации:

let webAuthUrl = URL(string: "http://85.192.35.25:33000/scan-go?redirect_url=ru.ramax.a5ka://oauth2redirect")!
let tokenUrl = URL(string: "http://85.192.35.25:33000/auth/realms/ssox5id/protocol/openid-connect/token")!
let callBackUrl = URL(string: "ru.ramax.a5ka://oauth2redirect")!
let exchangeLegacyTokenUrl = URL(string: "http://85.192.35.25:33000/migration/save/token")!
let manageAgreementsUrl = URL(string: "http://85.192.35.25:33000/migration/save/agreement")!
let clientID = "scan-go"
let flow = .token

*AuthorizationFlow: flow может принимать значения AuthorizationFlow.token либо AuthorizationFlow.code. Соответственно для методов 'auth' и 'exchangeLegacyToken':

  • Для значения .token будет выполнен стандартный процесс авторизации с получением authorizationCode и последующим обменом его на token. В случае успеха в result будет возвращен token.
  • Для значения .code в процессе авторизации будет получен только authorizationCode. Обмен на token не будет выполнен. В случае успеха в result будет возвращен authorizationCode.

Auth:

Для авторизации используется метод:

public func auth(completion: @escaping (Result<String, Error>) -> Void)

Пример использования:

func startAuth() {
        manager?.auth() { (result) in
            switch result {
            case .success(let token):
                print("Success. Token: " + token)
            case .failure(let error):
                print("Failure. Error: " + b.localizedDescription)
            }
        }   
}

IsAuthorized:

Для проверки авторизован ли пользователь используется свойство:

public var isAuthorized: Bool { get }

*AuthorizationFlow: Данное свойство актуально только для 'flow = AuthorizationFlow.token'. Для 'flow = AuthorizationFlow.token' isAuthorized всегда будет равно false.

Пример использования:

let isHiddenLogin = manager?.isAuthorized ?? false

RefreshToken:

Для получения RefreshToken используется метод:

public func refreshToken(completion: @escaping (Result<String, Error>) -> Void)

Пример использования:

manager?.refreshToken { (result) in
            switch result {
            case .success(let token):
                print("token: " + token)
            case .failure(let error):
                print("error: " + error.localizedDescription )
            }
}

AccessToken:

Для получения AccessToken используется свойство:

public var accessToken: String? { get }

Пример использования:

print("AccessToken: ", manager?.accessToken)

СheckToken:

Для расшифровки JWT токена используется метод:

public func checkToken(_ token: String) -> JWTCheckResult

JWTCheckResult содержит следующие параметры:

public let isX5ssoToken: Bool
public let permissionMarketing: Bool
public let isUnifiedAgreement: Bool

Пример использования:

let checkResult = manager?.checkToken(token)

ExchangeLegacyToken:

Для обмена legacy token'а на код используется метод:

public func exchangeLegacyToken(_ token: String, completion: @escaping (Result<String, Error>) -> Void )

Пример использования:

manager?.exchangeLegacyToken(token, completion: { [weak self] (result) in
            switch result {
            case .success(let accessToken):
                self?.showAlert(title: "Success",
                                message: accessToken)
            case .failure(let error):
                self?.showAlert(title: "Failure",
                                message: error.localizedDescription)
            }
})

ManageAgreements:

Для передачи соглашений используется метод:

public func manageAgreements(_ agreements: Agreements, 
                              accessToken: String? = nil,
                               completion: @escaping (Result<String, Error>) -> Void )

*AuthorizationFlow: параметр accessToken необходим только для 'flow = AuthorizationFlow.code'.

Пример использования:

let adsAgreementChannels = AdsAgreementChannels(sms: true,
                                               mail: true,
                                               push: true,
                                              phone: true,
                                              offer: true)
let agreements = Agreements(     userIP: "192.168.0.1",
                             userDevice: "iPhone",
                      commercialNetwork: "exapmle_name",
            userAgreementLoyaltyProgram: true,
                        isBaseAgreement: true,
                    isExtendedAgreement: true,
                     isUnifiedAgreement: true,
                 isAdsAgreementChannels: adsAgreementChannels)
            manager?.manageAgreements(agreements, completion: { [weak self] (result) in
            switch result {
            case .success(let dataString):
                self?.showAlert(title: "Success",
                                message: dataString)
            case .failure(let error):
                self?.showAlert(title: "Failure",
                                message: error.localizedDescription)
            }
})

Обработка ошибок:

  • Ошибки представлены объектами класса NSError из Foundation и передаются в failure result completion блока.
  • При работе с сервисами в первую очередь x5SSOSDK проверяет наличие подключения и в случае его отсутствия возвращает ошибку с кодом 617.
  • Если ошибка возникает на уровне AppAuth, то она будет передана в completion блок без дополнительной обработки.
  • Если ошибка возникает на уровне x5SSOSDK, то при наличии тела http ответа, оно будет добавлено в словарь NSError.userInfo с ключом "x5SSOSDK_HTTPResponseData".

Коды ошибок x5SSOSDK:

617 - Отсутствует подключение к сети.

401 - Не валидный токен.

500 - Любая другая ошибка.