Я работаю над приложением, в котором когда пользователь выбирает пункт меню, он переносится на веб-страницу. Веб-страница требует аутентификации, и чтобы упростить для пользователя задачу, я хотел бы передать их аутентификационные данные в Safari / Firefox / Chrome, который хранится в моем приложении.
Я пытался создавать общие и интернет-элементы цепочки для ключей, которые прекрасно отображаются в Keychain Access, но ни один веб-браузер не уловил их.
Я заметил, что элементы цепочки для ключей, сохраняемые для браузеров, имеют тип "Пароль веб-формы".
Когда я пытаюсь создать элемент цепочки для ключей с типом 'kSecAuthenticationTypeHTMLForm', он отображается в Доступе цепочки для ключей как 'интернет-пароль'. Я изменил код из класса EMKeychain:
+ (EMInternetKeychainItem *)addInternetKeychainItemForServer:(NSString *)server
withUsername:(NSString *)username
password:(NSString *)password
path:(NSString *)path
port:(NSInteger)port
protocol:(SecProtocolType)protocol
{
if (!username || !server || !password)
return nil;
const char *serverCString = [server UTF8String];
const char *usernameCString = [username UTF8String];
const char *passwordCString = [password UTF8String];
const char *pathCString = [path UTF8String];
if (!path || [path length] == 0)
pathCString = "";
SecKeychainItemRef item = nil;
OSStatus returnStatus = SecKeychainAddInternetPassword(NULL, strlen(serverCString), serverCString, 0, NULL, strlen(usernameCString), usernameCString, strlen(pathCString), pathCString, port, protocol, kSecAuthenticationTypeHTMLForm, strlen(passwordCString), (void *)passwordCString, &item);
if (returnStatus != noErr || !item)
{
if (_logsErrors)
NSLog(@"Error (%@) - %s", NSStringFromSelector(_cmd), GetMacOSStatusErrorString(returnStatus));
return nil;
}
return [EMInternetKeychainItem _internetKeychainItemWithCoreKeychainItem:item forServer:server username:username password:password path:path port:port protocol:protocol];
}