Авторизация пользователей через Сбер ID в вашем приложении включает несколько ключевых шагов, начиная с подготовки запроса и заканчивая обработкой полученного ответа.
При возникновении вопросов рекомендуем заглянуть в наш раздел FAQ по сценарию OIDC to App
1. Подготовка запроса на авторизацию
Для начала процесса авторизации необходимо создать объект SIDAuthRequest, который будет содержать все необходимые параметры для выполнения авторизации.
let verifier = SIDUtils.createVerifier()
let challenge = SIDUtils.createChallenge(verifier)
let challengeMethod = SIDAuthRequest.challengeMethod
/// Инициализатор
/// - Parameters:
/// - scope: Наименование групп данных, на которые подписана система
/// - state: Значение для предотвращения подделки межсайтовых запросов, случайно сгенерированное
/// - nonce: Значение, сгенерированное внешней АС для предотвращения атак повторения
/// - ssoBaseUrl: URI, который будет использован для запуска авторизации взамен дефолтного (бесшовная авторизация)
/// - redirectUri: Url на который будет перенаправлен клиент после успешной аутентификации (deeplink)
/// - codeChallenge: Хэшированное значение секретного кода
/// - codeChallengeMethod: Метод преобразования секретного кода
/// - standType: Тип стэнда к которому будет выполняться подключение
/// - loginHint: Номер телефона пользов ателя "79ХХХХХХХХХ"
let request = SIDAuthRequest(scope: "openid profile email",
state: "random_state",
nonce: "random_nonce",
redirectUri: "myapp://callback",
ssoBaseUrl: nil,
codeChallenge: challenge,
codeChallengeMethod: challengeMethod,
loginHint: "79012345678")
NSString *verifier = [SIDUtils createVerifier];
NSString *challenge = [SIDUtils createChallenge:verifier];
NSString *challengeMethod = [SIDAuthRequest challengeMethod];
SIDAuthRequest *request = [[SIDAuthRequest alloc] init];
request.scope = @"openid profile email";
request.state = @"random_state";
request.nonce = @"random_nonce";
request.redirectUri = @"myapp://callback";
request.ssoBaseUrl = nil; // правильно для объекта
request.codeChallenge = challenge;
request.codeChallengeMethod = challengeMethod;
request.loginHint = @"79012345678";
Полный перечень параметров scope доступен в разделе Перечень допустимых параметров Scope
2. Запуск процесса авторизации
После подготовки объекта SIDAuthRequest, используйте его для запуска авторизации. Вы можете выбрать один из двух доступных методов: стандартную авторизацию через Сбербанк Онлайн или через единый web-портал авторизации (OIDC).
Стандартная авторизация через Сбербанк Онлайн:
Метод откроет приложение Сбербанка для авторизации, если приложение на устройстве отсутствует, откроется единое web-окно авторизации.
/// Приоритетная авторизоваться с помощью мобильного приложения банка
/// - Parameters:
/// - request: модель запроса
/// - viewController: viewController для открытия SVC для авторизации через Web при отсутсвии приложения банка
SID.login.auth(withSberId: request, viewController: viewController)
[SID.login authWithSberId:request viewController:viewController];
Авторизация напрямую (без UI) через Сбербанк Онлайн
Используйте для фоновой инициализации авторизации(пользователь не нажимает на кнопку авторизации) через приложение Сбербанка. Передайте замыкание, для обработки случая, когда приложение Сбербанка отсутствует на устройстве.
/// Авторизация напрямую (без UI) с помощью мобильного приложения банка
/// - Parameters:
/// - request: модель запроса
/// - completion: Обработчик результата открытия приложения банка
SID.login.autoAuth(request: request) { success in
if success {
print("Аутентификация успешна")
// Выполнить действия после успешной аутентификации
} else {
print("Ошибка аутентификации")
// Обработать ошибку аутентификации
}
}
[SID.login autoAuthWithRequest:request completion:^(BOOL success) {
if (success) {
NSLog(@"Аутентификация успешна");
// Выполнить действия после успешной аутентификации
} else {
NSLog(@"Ошибка аутентификации");
// Обработать ошибку аутентификации
}
}];
Запуск авторизации через единый web-портал (OIDC):
Использование единого web-портала авторизации по Сбер ID (OIDC) через встроенное веб-окно в приложении позволяет пользователям проходить авторизацию без необходимости покидать ваше приложение. Благодаря кэшированию веб-окна и использованию SafariViewController, время, необходимое для авторизации, сокращается, так как повторные авторизации выполняются еще быстрее.
Используйте метод webAuth для авторизации через единый web-портал, который обеспечивает унифицированный пользовательский опыт на различных платформах.
class YourViewController: UIViewController, SIDSafariViewControllerDelegate {
/// SafariViewController для отслеживания состояния из делегата SIDSafariViewControllerDelegate
var safariViewController: SFSafariViewController?
func startSberIDAuthorization() {
let request = SIDAuthRequest(/* Настройка запроса */)
/// Приоритетная авторизация с помощью единого веб окна.
/// - Parameters:
/// - request: модель запроса
/// - svcRedirectUrlString: URL для возврата из приложения банка в МП партнера на
/// открытый SVC со страницей единого портала авторизации
/// - viewController: viewController необходимый для открытия SafariViewController
/// - Returns: статус успеха запуска авторизации
let success = SID.login.webAuth(
sberIdRequest: request,
svcRedirectUrlString: "Ваш диплинк",
viewController: self
)
if success {
// Авторизация была успешно инициирована
} else {
// Обработка ошибки инициации авторизации
}
}
}
#import <UIKit/UIKit.h>
#import <SafariServices/SafariServices.h>
@interface YourViewController : UIViewController <SIDSafariViewControllerDelegate>
@property (nonatomic, strong) SFSafariViewController *safariViewController;
@end
@implementation YourViewController
- (void)startSberIDAuthorization {
// Создание и настройка запроса авторизации
SIDAuthRequest *request = [[SIDAuthRequest alloc] init];
BOOL success = [SID.login webAuthWithSberIdRequest:request
svcRedirectUrlString:@"Ваш диплинк"
viewController:self];
if (success) {
// Авторизация была успешно инициирована
} else {
// Обработка ошибки инициации авторизации
}
}
@end
Подписка на протокол SIDSafariViewControllerDelegate не является обязательной, но может предоставить дополнительные возможности для контроля над процессом авторизации:
- Обработка закрытия веб-окна: Позволяет отслеживать момент закрытия SafariViewController пользователем. Это может быть полезно для реализации дополнительной логики в вашем приложении, например, для возвращения пользователя на определенный экран или отображения сообщения после попытки авторизации.
- Возврат на предыдущий экран: Если в вашем приложении предусмотрена последовательность экранов или определенный путь пользователя, подписка на делегата позволит вам точно контролировать возвращение пользователя на экран, с которого была инициирована авторизация, поддерживая непрерывность пользовательского опыта.
Запуск авторизации через WebView
Использование авторизации через WebView позволяет нативно авторизовать пользователя без необходимости покидать приложение или переключаться на браузер.
Применяйте метод loginWithIDToWebView если хотите дать пользователю user friendly experience во время авторизации. В случае если на каком-то этапе произойдет ошибка или пользователь сам закроет экран - web окно закроется и на делегат SIDWebViewDelegateProtocol отправится событие webViewReject.
class YourViewController: UIViewController, SIDWebViewDelegateProtocol {
func startSberIDAuthorization() {
let request = SIDAuthRequest(/* Настройка запроса */)
/// Авторизация через WebView
/// - Parameters:
/// - request: модель запроса
/// - viewController: viewController необходимый для открытия окна доавторизации
/// - delegate: Обработчик событий для webView
SID.login.loginWithIDToWebView(request: request, viewController: self, delegate: self)
}
func webViewReject() {
// Обработка закрытия webView
}
}
#import <UIKit/UIKit.h>
@interface YourViewController : UIViewController <SIDWebViewDelegateProtocol>
@end
@implementation YourViewController
- (void)startSberIDAuthorization {
SIDAuthRequest *request = [[SIDAuthRequest alloc] init];
// Настройка параметров запроса
/// Авторизация через WebView
/// - Parameters:
/// - request: модель запроса
/// - viewController: viewController необходимый для открытия окна доавторизации
/// - delegate: Обработчик событий для webView
[SID.login loginWithIDToWebViewWithRequest:request
viewController:self
delegate:self];
}
- (void)webViewReject {
// Обработка закрытия webView
}
@end
Обработка ответа авторизации
После успешной авторизации пользователь будет перенаправлен обратно в ваше приложение. Вам необходимо обработать ответ, используя URL, на который произошло перенаправление, и извлечь из него данные авторизации.
func application(_ app: UIApplication,
open url: URL,
options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool {
SID.login.getResponseFrom(url) { response in
if response.isSuccess {
// Обработка успешной авторизации
} else {
// Обработка ошибки авторизации
}
}
return true
}
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options {
[SID.login getResponseFrom:url completion:^(SIDAuthResponse *response) {
if (response.isSuccess) {
// Обработка успешной авторизации
} else {
// Обработка ошибки авторизации
}
}];
return YES;
}
Модель ответа:
class SIDAuthResponse : NSObject {
/// Значение, сгенерированное внешней АС для предотвращения атак повторения
var nonce: String { get }
/// Значение для предотвращения подделки межсайтовых запросов, случайно сгенерированное
var state: String? { get }
/// Код авторизации клиента
var authCode: String? { get }
/// Текст ошибки
var error: String? { get }
/// Статус операции
var isSuccess: Bool { get }
/// AppToken для бесшовной авторизации
var appToken: String? { get }
}
@interface SIDAuthResponse : NSObject
/// Значение, сгенерированное внешней АС для предотвращения атак повторения
@property (nonatomic, readonly, copy) NSString * _Nonnull nonce;
/// Значение для предотвращения подделки межсайтовых запросов, случайно сгенерированное
@property (nonatomic, readonly, copy) NSString * _Nullable state;
/// Код авторизации клиента
@property (nonatomic, readonly, copy) NSString * _Nullable authCode;
/// Текст ошибки
@property (nonatomic, readonly, copy) NSString * _Nullable error;
/// Статус операции
@property (nonatomic, readonly) BOOL isSuccess;
/// AppToken для бесшовной авторизации
@property (nonatomic, readonly, copy) NSString * _Nullable appToken;
- (instancetype)init NS_UNAVAILABLE;
+ (instancetype)new NS_UNAVAILABLE;
@end
Бесшовная авторизация
Автоматическая авторизация пользователей, приходящих из приложения Сбербанка, без необходимости нажимать на кнопку "Войти по Сбер ID". Этот процесс называется бесшовной авторизацией.
Как это работает:
-
Получение специальной ссылки: Когда пользователь переходит из приложения Сбербанка в ваше приложение, система отправляет вам специальную ссылку (диплинк), которая содержит
sberIDRedirectдля авторизации. -
Извлечение базового URL из ссылки: Чтобы начать процесс авторизации, вам нужно извлечь из этой ссылки специальный параметр — базовый URL (
ssoBaseUrl).
let ssoBaseUrl = SIDUtils.getSSOUrlStringFrom(receivedUrl)
NSString *ssoBaseUrl = [SIDUtils getSSOUrlStringFrom:receivedUrl];
- Использование базового URL: Далее, вам нужно передать этот базовый URL в объект
SIDAuthRequest, который используется для настройки запроса на авторизацию.
let request = SIDAuthRequest()
request.scope = "openid profile email"
request.state = "unique_state_value"
request.nonce = "unique_nonce_value"
request.ssoBaseUrl = ssoBaseUrl
request.redirectUri = "yourAppScheme://callback"
request.codeChallenge = "generated_code_challenge"
SIDAuthRequest *request = [SIDAuthRequest new];
request.scope = @"openid profile email";
request.state = @"unique_state_value";
request.nonce = @"unique_nonce_value";
request.ssoBaseUrl = ssoBaseUrl;
request.redirectUri = @"yourAppScheme://callback";
request.codeChallenge = @"generated_code_challenge";
- Запуск авторизации: С этими настройками вы готовы запустить процесс авторизации, вызвав соответствующий метод SDK Сбер ID.
Этот процесс позволяет вашему приложению эффективно работать с авторизацией пользователей, которые пришли из приложения Сбербанка, обеспечивая более гладкий и удобный опыт входа.
Перечень допустимых параметров Scope
Параметры scope в SIDAuthRequest позволяют указать, к каким данным пользователя вы хотите получить доступ в процессе авторизации. Это важно для соблюдения принципов минимальной необходимости и прозрачности обработки персональных данных. Ниже в таблице представлен список всех доступных scope для Сбер ID:
| Scope | Наименование поля в ответе | Описание | Пример |
|---|---|---|---|
| Пакет Light | |||
| openid (обязательно) | sub | Неизменный уникальный идентификатор клиента, передаваемый внешним потребителям. | "sub":"e327493e-979a-461f-9ca5-edfab9d6fbab" |
email | Адрес электронной почты | "email":“personal@mail.ru” | |
| mobile | phone_number | Номер телефона | "phone_number":"+7 (000) 000000” |
| Пакет Standart | |||
| birthdate | birthdate | Дата рождения (формат ГГГГ-ММ-ДД) | "birthdate":"0000-00-00" |
| name | family_name, given_name, middle_name | Фамилия Имя Отчество | "family_name":"Фамилия" "given_name":"Имя" "middle_name":"Отчество" |
| gender | gender | Пол: 1 – мужчина; 2 – женщина; | "gender":1, |
| Пакет Professional | |||
| maindoc | identification | Полные данные паспорта: серия,номер,орган, выдавший паспорт,дата выдачи паспорта (формат ГГГГ-ММ-ДД),код подразделения | "identification":{ "series":"00 00", "number":"000000", "issued_by":"Орган выдавший документ", "issued_date":"0000-00-00", "code":"000-000" } |
| inn | inn | ИНН номер | "inn":{ "number":"0000000" } |
| snils | snils | СНИЛС номер | "snils":{ "number":"0000000" } |
| driving_license | driving_license | Номер водительского удостоверения | "driving_license":{ "number":"111111" } |
| international_passport | international_passport | Заграничный паспорт гражданина РФ:серия документа (формат 00 00),номер документа(формат 000000),кем выдан, дата выдачи (формат ГГГГ-ММ-ДД),дата окончания (формат ГГГГ-ММ-ДД),имя,фамилия | "international_passport":{ "series":"777", "number":"333", "issued_by":"рога и копыта", "issued_date":"1981-01-01", "planned_end_date":"1999-02-01", "name":"name", "surname":"surname" } |
| priority_doc | priority_doc | Данные документа, удостоверяющего личность:тип,серия документа (формат 00 00),номер документа (формат 000000),кем выдан, дата выдачи (формат ГГГГ-ММ-ДД),код. Выводится один документ в соответствии со списком приоритетов:Паспорт РФ, Загранпаспорт гражданина РФ, Военный билет, Паспорт моряка, Временное удостоверение, Паспорт иностранного граданина, Вид на жительство иностранного гражданина. Доступные типы документов:
| "priority_doc":{ "type":17, "series":"777", "number":"333", "issued_by":"рога и копыта", "issued_date":"1981-01-01", "code":"adasd" } |
| citizenship | citizenship | Гражданство: последняя по актуальности страна гражданства (наименование на русском языке) и ее код (ОКСМ, буквенное обозначение – Альфа-3) | "citizenship":{ "country_code":"countryCode", "country_name":"countryName" } |
| place_of_birth | place_of_birth | Место рождения – город рождения клиента (текстовое поле, не кодируется) | "place_of_birth":”Nsk” |
| address_reg | address_reg | Адрес регистрации: полный адрес, код ФИАС, почтовый индекс, страна, регион, район, город, поселение, улица, дом, строение, корпус, квартира | "address_reg":{ "full_address":"fullAddress", "fias_code":"fiasCode", "post_index":"postIndex", "country":"country", "region":"region", "district":"district", "city":"city", "settlement":"settlement", "street":"street", "house":"house", "building":"building", "bulk":"bulk", "apartment":"apartment" } |
| work_address | work_address | Рабочий адрес: полный адрес, код ФИАС, почтовый индекс, страна, регион, район, город, поселение, улица, дом, строение, корпус, квартира | "work_address":{ "full_address":"fullAddress", "fias_code":"fiasCode", "post_index":"postIndex", "country":"country", "region":"region", "district":"district", "city":"city", "settlement":"settlement", "street":"street", "house":"house", "building":"building", "bulk":"bulk", "apartment":"apartment" } |
| address_of_actual_residence | address_of_actual_residence | Адрес места жительства/доставки: полный адрес,код ФИАС,почтовый индекс,страна,регион,район,город,поселение,улица,дом,строение,корпус,квартира | "address_of_actual_residence":{ "full_address":"fullAddress", "fias_code":"fiasCode", "post_index":"postIndex", "country":"country", "region":"region", "district":"district", "city":"city", "settlement":"settlement", "street":"street", "house":"house", "building":"building", "bulk":"bulk", "apartment":"apartment" } |
| delivery_address | delivery_address | Адрес для доставки: полный адрес,код ФИАС,почтовый индекс,страна,регион,район,город,поселение,улица,дом,строение,корпус,квартира | "delivery_address":{ "full_address":"fullAddress", "fias_code":"fiasCode", "post_index":"postIndex", "country":"country", "region":"region", "district":"district", "city":"city", "settlement":"settlement", "street":"street", "house":"house", "building":"building", "bulk":"bulk", "apartment":"apartment" } |
| is_company_employee | is_company_employee | Признак сотрудника ПАО "Сбербанк" | "is_company_employee":true, |
| sts | sts | Номер СТС | "sts":{ "number":"00 00 00000" } |
| previous_identification | previous_identification | Реквизиты ранее выданного паспорта гражданина РФ: Серия документа, Номер документа, Кем выдан, Дата выдачи | "previous_identification":{ "series":"00 00", "number":"000 000", "issued_by":"Орган выдавший документ", "issued_date":"0000-00-00" } |
| previous_name | previous_family_name, previous_given_name, previous_middle_name | Предыдущие фамилия, имя, отчество | "previous_family_name":"Фамилия" "previous_given_name":"Имя" "previous_middle_name":"Отчество" |
| education | education | Сведения об образовании:Код + описание,начальное,среднее,среднее специальное,высшее,магистратура и пр. | "education":{ "code":"1", "description":"начальное" } |
| place_of_work | place_of_work | Наименование организации(место работы) | "place_of_work": "место работы", |
| job_title | job_title | Наименование занимаемой должности | "job_title": "должность" |
| marital_status | marital_status | Семейное положение:Код + описание,холост,женат,разведен,вдовец/ вдова,раздельное проживание,гражданский брак и пр. | "marital_status":{ "code":"1", "description":"холост" } |
| is_self_employed | is_self_employed | Признак самозанятого | "is_self_employed":true |