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 - Любая другая ошибка.