Как получить доступ к паролю связки ключей из приложения какао, когда пароль хранится в комплекте плагинов авторизации, без запроса пароля цепочки для ключей - PullRequest
0 голосов
/ 17 апреля 2019

Я новичок в разработке 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 здесь

Я могу предотвратить запрос пароля цепочки для ключей, если я вставлю токен и предоставлю доступ к приложению какао вручную в цепочке для ключей. Но я не могу предотвратить запрос, если храню токен с помощью пакета авторизации.

Итак, как я могу запретить системе запрашивать пароль?

...