Совместно используемая веб-ссылка учетных данных
Наследование
Не применимый
Соответствует
Не применимый
Оператор импорта
Swift
import Security
Objective C
@import Security;
Совместно используемые веб-учетные данные являются интерфейсом программирования, позволяющим собственным приложениям для iOS совместно использовать учетные данные со своими дубликатами веб-сайта. Например, пользователь может войти на сайт в Safari, введя имя пользователя и пароль, и сохранить те учетные данные с помощью Цепочки для ключей iCloud. Позже, пользователь может выполнить исходное приложение от того же разработчика, и вместо приложения, требующего, чтобы пользователь повторно вошел в имя пользователя и пароль, совместно использованные веб-учетные данные предоставляют ему доступ к учетным данным, вводившимся ранее в Safari. Пользователь может также создать новые учетные записи, пароли обновления, или удалить ее учетную запись из приложения. Эти изменения тогда сохраняются и используются Safari.
Совместно используемые веб-учетные данные, которые API определяет Базовые Основанные на основе функции для того, чтобы сохранить и запросить, совместно использовали основанные на пароле учетные данные. Существует четыре шага к совместному использованию учетных данных:
Добавьте a
com.apple.developer.associated-domainsправо на Ваше приложение. Это право должно включать все домены, с которыми Вы хотите совместно использовать учетные данные.Добавьте
apple-app-site-associationфайл к Вашему веб-сайту. Этот файл должен включать идентификаторы приложений для всех приложений, с которыми сайт хочет совместно использовать учетные данные, и это должно быть должным образом подписано.Когда приложение установлено, система загружает и проверяет файл ассоциации сайта для каждого из его связанных доменов. Если проверка успешна, приложение связано с доменом.
Приложение может совместно использовать учетные данные с любыми связанными доменами путем вызова
SecAddSharedWebCredentialиSecRequestSharedWebCredential.
Добавление связанного права доменов
Для включения совместно использованных учетных данных в приложении добавьте com.apple.developer.associated-domains ключ к правам Вашего приложения. Можно добавить это право с помощью области возможностей цели (см. рисунок 1).
Включайте список всех доменов, с которыми Ваше приложение хочет совместно использовать учетные данные. Каждая запись использует следующий формат:
<service>:<fully qualified domain>[:port number]
Для совместно используемых веб-учетных данных всегда используйте webcredentials служба.
Добавление файла ассоциации сайта
Поместите названный файл JSON со знаком apple-app-site-association на веб-сайте, соответствующем один из доменов в связанном праве доменов Вашего приложения. URL файла должен соответствовать следующий формат:
https://<fully qualified domain>/apple-app-site-association
Содержание файла JSON должно содержать a webcredentials словарь с apps массив. apps списки массива идентификаторы приложений для всех приложений, которые могут получить доступ к совместно используемым учетным данным для этого сайта. Для примера см. Перечисление 1.
{"webcredentials": {"apps": [ "D3KQX62K1A.com.example.DemoApp","D3KQX62K1A.com.example.DemoAdminApp" ]}}
Файл должен удовлетворить следующие требования:
Файл должен быть размещен на
https://сайт с допустимым сертификатом (например, Safari не должен выпускать сертификат, предупреждающий при просмотре сайта).Файл не должен использовать перенаправления.
Файл должен иметь тип MIME
application/pkcs7-mime.Файлом должен быть CMS, подписанный допустимым сертификатом TLS.
Можно подписать файл JSON с помощью команд Terminal, таких как показанные в Перечислении 2. echo команда помещает веб-учетные данные серверной стороны от Перечисления 2 в названный файл json.txt, удаление большей части пробела из текста для минимизации требуемой пропускной способности. Строка, начинающаяся cat команда читает файл и передает вывод по каналу к openssl команда, подписывающая файл с помощью сертификата и ключа для идентификационных данных, допустимых для example.com.
echo '{"webcredentials":{"apps":["D3KQX62K1A.com.example.DemoApp","D3KQX62K1A.com.example.DemoAdminApp"]}}' > json.txtcat json.txt | openssl smime -sign -inkey example.com.key -signer example.com.cert -certfile intermediate.cert -noattr -nodetach -outform DER > apple-app-site-association
Вывод openssl команда является файлом JSON со знаком, что Вы ставите свой веб-сайт в apple-app-site-association URL, в этом примере https://example.com/apple-app-site-association.
Сертификат, используемый для подписания файла JSON, должен удовлетворить следующие требования:
Сертификат должен быть допустимым сертификатом TLS для доменного имени. Например, сертификат должен иметь Общее название или Подчиненное Альтернативное Имя, соответствующее домен (example.com в примере).
Сертификат не должен истекать.
Цепочка сертификата сервера должна привести к корневому сертификату, выпущенному центром сертификации, которому доверяет iOS.
Некоторые, доверенные центры сертификации упоминаются ниже. Для полного списка центров сертификации, которым доверяет iOS, посмотрите http://support.apple.com/kb/ht5012.
Symantec Corporation. www.verisign.com
Go Daddy Group, Inc. www.godaddy.com
DigiCert, Inc. www.digicert.com
Comodo Group, Inc. www.comodo.com
GlobalSign Ltd. www.globalsign.com
Проверка файла ассоциации сайта
Когда приложение установлено, iOS пытается связать его со всеми доменами, перечисленными в его связанном праве доменов. iOS выполняет следующие шаги:
Берет каждый домен от связанного элемента доменов.
Добавляет
“/apple-app-site-association”до конца домена и загрузок содержание в получающемся URL.Заверяет подпись файла JSON.
Удостоверяется, что файл JSON включает идентификатор приложения приложения.
Если все эти шаги успешно выполняются, приложение связано с доменом, и можно использовать SecAddSharedWebCredential и SecRequestSharedWebCredential получить доступ и изменить совместно используемые веб-учетные данные. После того, как приложение успешно связано с доменом, это остается связанным, пока приложение не удалено из устройства.
Много проблем могли бы заставить проверку перестать работать.
Подпись JSON недопустима. Ассоциации отказывают.
Файл JSON недопустим или не содержит идентификатор приложения. Ассоциации отказывают.
Сервер возвращает код 300-499. Это включает перенаправления. Ассоциации отказывают.
Сервер возвращает код 500-599. Система предполагает, что файл временно недоступен и попробовал еще раз. По умолчанию система пробует каждые 3 часа максимум за восемь попыток. Это также пробует каждый раз, когда приложение вызывает
SecAddSharedWebCredentialилиSecRequestSharedWebCredentialметод.
Совместное использование учетных данных
Существует широкий диапазон общих ситуаций, где можно хотеть использовать совместно использованные веб-учетные данные. Этот раздел покрывает четыре: вход в удаленный сервер, создание учетной записи пользователя в приложении, изменение пароля пользователя и удаление учетной записи пользователя.
Вход в удаленный сервер
Как правило, когда приложение должно войти в систему удаленной службы, Вы запускаете путем проверки на учетные данные пользователя в цепочке для ключей iOS. Если у Вас есть текущие учетные данные для пользователя, можно зарегистрировать их в непосредственно. В противном случае предложите пользователям их имя пользователя и пароль, и затем попытайтесь зарегистрировать их в. Вы также захотите сохранить их учетные данные после того, как вход в систему будет успешен. Этот поток операций показан на рисунке 2.
При использовании совместно используемых веб-учетных данных Вы добавляете два шага к этой процедуре. Как прежде, Вы запускаете путем проверки, сохранены ли учетные данные пользователя в цепочке для ключей. Если Вы не можете найти учетные данные пользователя, Вы проверяете на совместно используемые веб-учетные данные. Если Вы все еще не можете найти учетные данные, или если пользователь отказывается использовать совместно используемые учетные данные, необходимо предложить пользователю ее имя и пароль. Попытайтесь зарегистрировать пользователя в, и если вход в систему успешен, сохраните учетные данные и к цепочке для ключей и к совместно используемым веб-учетным данным. Это гарантирует, что у пользователя есть доступ к учетным данным в Safari, а также в Вашем приложении. Этот поток операций показан на рисунке 3.
Не используйте совместно используемые веб-учетные данные в качестве своей основной памяти для безопасных удостоверений пользователя. Вместо этого сохраните учетные данные пользователя в цепочке для ключей, и только используйте совместно используемые веб-учетные данные, когда Вы не сможете найти учетные данные входа в систему в цепочке для ключей.
Для чтения учетных данных пользователя из совместно используемых веб-учетных данных используйте SecRequestSharedWebCredential функционируйте как показано в Перечислении 3.
SecRequestSharedWebCredential(NULL, NULL, ^(CFArrayRef credentials, CFErrorRef error) {if (error != NULL) {// If an error occurs, handle the error here.[self handleError:error];return;}BOOL success = NO;CFStringRef server = NULL;CFStringRef userName = NULL;CFStringRef password = NULL;// If credentials are found, use them.if (CFArrayGetCount(credentials) > 0) {// There will only ever be one credential dictionaryCFDictionaryRef credentialDict =CFArrayGetValueAtIndex(credentials, 0);server = CFDictionaryGetValue(credentialDict, kSecAttrServer);userName = CFDictionaryGetValue(credentialDict, kSecAttrAccount);password = CFDictionaryGetValue(credentialDict, kSecSharedPassword);// Attempt to log insuccess = [self logIntoServer:server user:userName password:password];}if (!success) {[self promptForUserNameAndPassword];} else {[self saveCredentialsToKeychainForServer: server user:userName password:password];}});
Создание учетной записи пользователя в приложении
Если пользователь может создать новые учетные записи в Вашем приложении, необходимо сохранить имя пользователя и пароль к совместно используемым веб-учетным данным. Таким образом пользователь может легко получить доступ к учетной записи от Safari, а также из Вашего приложения. Можно сохранить имя и пароль пользователя к совместно используемым веб-учетным данным с помощью SecAddSharedWebCredential функция как показано.
SecAddSharedWebCredential(domain, name, password, ^(CFErrorRef error) {if (error == NULL) {// Handle the error here...return;}// The credentials have been successfully saved.});
Если нет никаких существующих учетных данных для этого имени пользователя и домена, этот метод завершается, не предлагая пользователю разрешение.
Изменение пароля пользователя
Если пользователь изменяет ее пароль в приложении, необходимо обновить и учетные данные, сохраненные в цепочке для ключей и в совместно используемых веб-учетных данных. Можно изменить пароль с помощью SecAddSharedWebCredential функция. Это - точно та же процедура, используемая при создании новой учетной записи пользователя (см. Перечисление 4). Однако, если учетные данные уже существуют для данного имени пользователя и домена, этот метод предлагает пользователю разрешение прежде, чем внести изменение. Пользователь может отменить это изменение.
Удаление учетной записи пользователя
Если пользователь удаляет ее учетную запись, необходимо удалить учетные данные и из цепочки для ключей и из совместно используемых веб-учетных данных. Можно удалить учетные данные для данного доменного имени и имени пользователя путем вызова SecAddSharedWebCredential функция и передача NULL для пароля.
SecAddSharedWebCredential(domain, name, NULL, ^(CFErrorRef error) {if (error == NULL) {// Handle the error here...return;}// The account information has been successfully deleted.});
Системные приглашения пользователь для разрешения прежде, чем удалить их имя пользователя и пароль из совместно используемых веб-учетных данных. Пользователи могут отменить это изменение.
-
Асинхронно хранилища (или обновления) совместно используемый пароль для веб-сайта.
Объявление
Swift
func SecAddSharedWebCredential(_fqdn: CFString!, _account: CFString!, _password: CFString!, _completionHandler: ((CFError!) -> Void)!)Objective C
void SecAddSharedWebCredential ( CFStringRef fqdn, CFStringRef account, CFStringRef password, void (^completionHandler)( CFErrorRef error) );Параметры
fqdnПолностью определенное доменное имя веб-сайта, требующего пароля.
accountНазвание счета связалось с этим паролем.
passwordПароль, который будет сохранен. Передача
NULLудалить совместно используемый пароль, если это существует.completionHandlerКогда функция завершилась, блок вызвал.
Блок берет один параметр:
errorЕсли совместно используемый пароль был успешно добавлен (или удален),
NULL; если не успешный, aCFErrorRefобъект, инкапсулирующий причину, почему пароль не мог быть добавлен (или удален). Ошибочная ссылка автоматически выпущена после того, как этот обработчик вызывают, хотя можно дополнительно сохранить его столько, сколько необходимый.Обсуждение
Эта функция добавляет совместно используемый элемент пароля, который будет доступен Safari и приложениями, имеющими указанное полностью определенное доменное имя в их
com.apple.developer.associated-domainsправо. Если совместно используемый элемент пароля уже существует для указанного веб-сайта и учетной записи, это обновляется с указанным паролем. Удалить пароль, передачуNULLдля параметра пароля.Оператор импорта
Objective C
@import Security;Swift
import SecurityДоступность
Доступный в iOS 8.0 и позже.
-
Асинхронно получает один или несколько совместно используемые пароли для веб-сайта.
Объявление
Swift
func SecRequestSharedWebCredential(_fqdn: CFString!, _account: CFString!, _completionHandler: ((CFArray!, CFError!) -> Void)!)Objective C
void SecRequestSharedWebCredential ( CFStringRef fqdn, CFStringRef account, void (^completionHandler)( CFArrayRef credentials, CFErrorRef error) );Параметры
fqdn(Необязательно) полностью определенное доменное имя веб-сайта, на который требуют пароли. Если
NULLпередается в этом параметре, доменное имя (ена), перечисленное в приложении вызоваcom.apple.developer.associated-domainsправо ищется неявно.account(Необязательно) название счета, на которое требуют пароли. Учетная запись может быть
NULLзапрашивать все совместно используемые учетные данные, которые доступны для сайта, позволяя вызывающей стороне обнаружить существующую учетную запись.completionHandlerБлок, который вызывают для поставки требуемых учетных данных.
Блок берет два параметра:
credentialsМассив, содержащий требуемые пароли. Если никакие элементы соответствия не найдены, массив учетных данных пуст. Ссылка учетных данных автоматически выпущена после того, как этот обработчик вызывают, хотя можно дополнительно сохранить его столько, сколько необходимый.
errorЕсли совместно используемый пароль был успешно добавлен (или удален),
NULL; если не успешный, aCFErrorRefобъект, инкапсулирующий причину, почему пароль не мог быть добавлен (или удален). Ошибочная ссылка автоматически выпущена после того, как этот обработчик вызывают, хотя можно дополнительно сохранить его столько, сколько необходимый.Обсуждение
Эта функция запрашивает один или несколько совместно используемые пароли для данного веб-сайта, в зависимости от того, предоставляется ли дополнительный параметр учетной записи. Получить результаты, веб-сайт, указанный в
fqdnпараметр должен быть тем, соответствующим запись в приложении вызоваcom.apple.developer.associated-domainsправо.Если совместно использованные элементы пароля соответствия будут найдены, то учетные данные, предоставленные для обработчика завершения, будут a
CFArrayRefтип данных, содержащийCFDictionaryRefзаписи. Каждый словарь содержит следующих пар (см.Security/SecItem.h):Ключ
Значение
kSecAttrServerCFStringRef(веб-сайт)kSecAttrAccountCFStringRef(учетная запись)CFStringRef(пароль)Если найденный элемент указывает нестандартный номер порта (кроме 443 для
https), следующий ключ может также присутствовать:kSecAttrPortCFNumberRef(номер порта)Оператор импорта
Objective C
@import Security;Swift
import SecurityДоступность
Доступный в iOS 8.0 и позже.
-
Возвращает случайным образом сгенерированный пароль.
Объявление
Swift
func SecCreateSharedWebCredentialPassword() -> Unmanaged<CFString>!Objective C
CFStringRef SecCreateSharedWebCredentialPassword ( void );Возвращаемое значение
Пароль в форме
xxx-xxx-xxx-xxx, гдеxвзят от наборовabcdefghkmnopqrstuvwxy,ABCDEFGHJKLMNPQRSTUVWXYZ, и3456789, по крайней мере с одним символом от каждого присутствующего набора.Оператор импорта
Objective C
@import Security;Swift
import SecurityДоступность
Доступный в iOS 8.0 и позже.
-
Ключ словаря, значение которого является совместно используемым паролем.
Объявление
Swift
var kSecSharedPassword: Unmanaged<AnyObject>!Objective C
extern CFTypeRef kSecSharedPassword;Константы
-
kSecSharedPasswordКлючевая константа для доступа к совместно используемым паролям. Используйте это включает словарь, возвращенный
SecRequestSharedWebCredentialфункция.Можно также получить доступ к URL сервера и имени пользователя из этого словаря. Для доступа к серверу используйте
kSecAttrServerпостоянный. Для доступа к имени пользователя используйтеkSecAttrAccountпостоянный. Для получения дополнительной информации об этих константах, посмотрите Ссылку Keychain Services.Доступный в iOS 8.0 и позже.
-
