Я новичок в разработке Objective C и OS X, поэтому, пожалуйста, извините, если есть какие-либо ошибки. Я храню токен как общий пароль, т. Е. kSecClassGenericPassword
в связке ключей, используя пакет подключаемого модуля авторизации во время входа в систему, и мой механизм авторизации запускается после механизма <string>loginwindow:done</string>
в файле authorizationdb XML, и я даю доступ приложению какао для доступа к этому токену после входа в систему. Позже я пытаюсь получить его, используя приложение какао, к которому у меня есть доступ, и пытаюсь предотвратить запрос пароля цепочки для ключей.
Для предотвращения запроса пароля я использовал следующий код в комплекте плагинов авторизации
const char *userKeychainPath = "/Users/**username**/Library/Keychains/login.keychain-db";
const char *password = "**********";
const char *serviceName = "***.*****Token";
const char *accountName = "***.****";
SecKeychainItemRef item = nil;
SecKeychainRef userKeychain;
OSStatus err;
NSArray *trustedApplications=nil;
SecAccessRef access = nil;
SecTrustedApplicationRef myself, someOther;
NSString *desc = @"okta accesstoken";
OSStatus statusOne = SecKeychainOpen(userKeychainPath,&userKeychain);
OSStatus statusTwo = SecKeychainUnlock(userKeychain,(UInt32)strlen(password),password, true);
OSStatus statusThree = SecKeychainUnlock(userKeychain,(UInt32)strlen(password),password, true);
SecKeychainAttribute attrs[] = {
{ kSecAccountItemAttr,(UInt32)strlen(accountName), (char *)accountName },
{ kSecServiceItemAttr, (UInt32)strlen(serviceName), (char *)serviceName }
};
SecKeychainAttributeList attributes = { sizeof(attrs) / sizeof(attrs[0]),
attrs };
SecAccessRef access=nil;
NSArray *trustedApplications=nil;
SecTrustedApplicationRef myself, someOther;
err = SecTrustedApplicationCreateFromPath(NULL, &myself);
err = SecTrustedApplicationCreateFromPath("/Applications/ReadKeychainSample.app",
&someOther);
trustedApplications = [NSArray arrayWithObjects: (__bridge id)myself, (__bridge id)someOther, nil];
err = SecAccessCreate((CFStringRef)accessLabel,
(CFArrayRef)trustedApplications, &access);
err = SecKeychainItemCreateFromContent(
kSecGenericPasswordItemClass,
&attributes,
(UInt32)strlen(password),
password,
userKeychain, // use the default keychain
access,
&item);
И я использовал оболочку брелка SAM NSString *sessionToken = [SAMKeychain passwordForService:@"serviceLabel" account:@"accountName"];
в приложении приложения «Какао» загрузил метод. Код брелка SAM здесь
Я могу предотвратить запрос пароля цепочки для ключей, если я вставлю токен и предоставлю доступ к приложению какао вручную в цепочке для ключей. Но я не могу предотвратить запрос, если храню токен с помощью пакета авторизации.
Итак, как я могу запретить системе запрашивать пароль?