Процесс авторизации
Авторизация пользователей через Сбер ID в вашем приложении включает несколько ключевых шагов, начиная с подготовки запроса и заканчивая обработкой полученного ответа.
При возникновении вопросов рекомендуем заглянуть в наш раздел FAQ по сценарию OIDC to App
1. Подготовка запроса на авторизацию
Для начала процесса авторизации необходимо создать объект SIDAuthRequest
, который будет содержать все необходимые параметры для выполнения авторизации.
- Swift
- Objective C
let verifier = SIDUtils.createVerifier()
let challenge = SIDUtils.createChallenge(verifier)
let challengeMethod = SIDAuthRequest.challengeMethod
let request = SIDAuthRequest(scope: "openid profile email",
state: "random_state",
nonce: "random_nonce",
redirectUri: "myapp://callback",
codeChallenge: challenge,
codeChallengeMethod: challengeMethod)
SIDAuthRequest *request = [[SIDAuthRequest alloc] init];
request.scope = @"openid profile email";
request.state = @"random_state";
request.nonce = @"random_nonce";
request.redirectUri = @"myapp://callback";
request.codeChallenge = @"code_challenge";
request.codeChallengeMethod = SIDAuthRequest.challengeMethod;
Полный перечень параметров scope доступен в разделе Перечень допустимых параметров Scope
2. Запуск процесса авторизации
После подготовки объекта SIDAuthRequest
, используйте его для запуска авторизации. Вы можете выбрать один из двух доступных методов: стандартную авторизацию через Сбербанк Онлайн или через единый web-портал авторизации (OIDC).
Стандартная авторизация через Сбербанк Онлайн:
Метод откроет приложение Сбербанка для авторизации, если приложение на устройстве отсутствует, откроется единое web-окно авторизации.
- Swift
- Objective C
SID.login.auth(withSberId: request, viewController: viewController)
[SID.login authWithSberId:request viewController:viewController];
Авторизация напрямую (без UI) через Сбербанк Онлайн
Используйте для фоновой инициализации авторизации(пользователь не нажимает на кнопку авторизации) через приложение Сбербанка. Передайте замыкание, для обработки случая, когда приложение Сбербанка отсутствует на устройстве.
- Swift
- Objective C
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, время, необходимое для авторизации, сокращается, так как повторные авторизации выполняются еще быстрее.
Используйте метод soleLoginWebPageAuth
для авторизации через единый web-портал, который обеспечивает унифицированный пользовательский опыт на различных платформах.
- Swift
- Objective C
class YourViewController: UIViewController, SIDSafariViewControllerDelegate {
func initiateSberIDAuthorization() {
let request = SIDAuthRequest(/* Настройка запроса */)
let success = SID.login.soleLoginWebPageAuth(
sberIdRequest: request,
svcRedirectUrlString: "Ваш диплинк",
viewController: self
)
if success {
// Авторизация была успешно инициирована
} else {
// Обработка ошибки инициации авторизации
}
}
// Дополнительные методы делегата SIDSafariViewControllerDelegate, если необходимо
}
#import <SberIdSDK/SberIdSDK.h>
@interface YourViewController () <SIDSafariViewControllerDelegate>
@end
@implementation YourViewController
- (void)initiateSberIDAuthorization {
SIDAuthRequest *request = [[SIDAuthRequest alloc] init];
// Настройка запроса...
BOOL success = [SID.login soleLoginWebPageAuthWithSberIdRequest:request
svcRedirectUrlString:@"Ваш диплинк"
viewController:self];
if (success) {
// Авторизация была успешно инициирована
} else {
// Обработка ошибки инициации авторизации
}
}
// Дополнительные методы делегата SIDSafariViewControllerDelegate, если необходимо
@end
Подписка на протокол SIDSafariViewControllerDelegate не является обязательной, но может предоставить дополнительные возможности для контроля над процессом авторизации:
- Обработка закрытия веб-окна: Позволяет отслеживать момент закрытия SafariViewController пользователем. Это может быть полезно для реализации дополнительной логики в вашем приложении, например, для возвращения пользователя на определенный экран или отображения сообщения после попытки авторизации.
- Возврат на предыдущий экран: Если в вашем приложении предусмотрена последовательность экранов или определенный путь пользователя, подписка на делегата позволит вам точно контролировать возвращение пользователя на экран, с которого была инициирована авторизация, поддерживая непрерывность пользовательского опыта.
Обработка ответа авторизации
После успешной авторизации пользователь будет перенаправлен обратно в ваше приложение. Вам необходимо обработать ответ, используя URL, на который произошло перенаправление, и извлечь из него данные авторизации.
- Swift
- Objective C
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;
}
Модель ответа:
- Swift
- Objective C
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
).
- Swift
- Objective C
let ssoBaseUrl = SIDUtils.getSSOUrlStringFrom(receivedUrl)
NSString *ssoBaseUrl = [SIDUtils getSSOUrlStringFrom:receivedUrl];
- Использование базового URL: Далее, вам нужно передать этот базовый URL в объект
SIDAuthRequest
, который используется для настройки запроса на авторизацию.
- Swift
- Objective C
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 | Наименование параметра в ответе | Описание | Пример ответа |
---|---|---|---|
name | family_name , given_name , middle_name | Фамилия, Имя, Отчество | "family_name":"Фамилия" "given_name":"Имя" "middle_name":"Отчество" |
birthdate | birthdate | Дата рождения (формат ГГГГ-ММ-ДД) | "birthdate":"0000-00-00" |
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" } |
mobile | phone_number | Номер телефона | "phone_number":"+7 (000) 000000” |
email | Адрес электронной почты | "email":“personal@mail.ru” | |
gender | gender | Пол: 1 – мужчина; 2 – женщина; | "gender":1, |
driving_license | driving_license | Номер водительского удостоверения | "driving_license":{ "number":"111111" } |
international_passport | international_passport | Заграничный паспорт гражданина РФ: | "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 | Данные документа, удостоверяющего личность: | "priority_doc":{ "type":17, "series":"777", "number":"333", "issued_by":"рога и копыта", "issued_date":"1981-01-01", "code":"adasd" } |
citizenship | citizenship | Гражданство: | "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" } |
is_self_employed | is_self_employed | Признак самозанятого | "is_self_employed":true |
previous_maindoc | 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":"холост" } |
proposition | proposition | Сведения для формирования рекламных предложений (признак VIP-клиента) | "proposition": true |
salary_status | salary_status | Признак зарплатного клиента | "salary_status": true |