gpt4 book ai didi

objective-c - 在 Mac OS X 上创建类型为 'Web Form Password' 的钥匙串(keychain)项

转载 作者:太空狗 更新时间:2023-10-30 03:59:05 26 4
gpt4 key购买 nike

我正在开发一个应用程序,当用户选择一个菜单项时,他们会被带到一个网页。该网页需要身份验证,为了让用户更简单,我想将他们的身份验证信息传递给存储在我的应用程序中的 Safari/Firefox/Chrome。

我已经尝试创建通用和 Internet 钥匙串(keychain)项目,它们在 Keychain Access 中显示得很漂亮,但是没有网络浏览器接受它们。

我注意到为浏览器存储的钥匙串(keychain)项的类型为“Web 表单密码”。

当我尝试创建类型为“kSecAuthenticationTypeHTMLForm”的钥匙串(keychain)项时,它在钥匙串(keychain)访问中显示为​​“互联网密码”。我修改了 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];
}

最佳答案

最有可能的问题是钥匙串(keychain)条目是使用 ACL 创建的,该 ACL 不允许 Safari 访问其内容。 (我认为 Chrome 和 Firefox 使用他们自己专有的密码数据库而不是钥匙串(keychain),因此修改钥匙串(keychain)不会影响那些浏览器。)

尝试使用 SecKeychainItemSetAccess 允许访问所有应用程序。我使用以下代码来创建这样一个许可的 SecAccess 对象:

// Create an access object.
SecAccessRef access;
status = SecAccessCreate(CFSTR("item description"),
NULL, // Only this app has access (this'll get changed in a moment)
&access);
if (status) { ... }

// Override access control to provide full access to all applications.
NSArray *aclList = nil;
status = SecAccessCopyACLList(access, (CFArrayRef *)&aclList);
if (status) { ... }
for (id object in aclList) { // will do just one iteration
SecACLRef acl = (SecACLRef)object;

CFArrayRef applist = NULL;
CFStringRef desc = NULL;
CSSM_ACL_KEYCHAIN_PROMPT_SELECTOR cakps;

status = SecACLCopySimpleContents(acl, &applist, &desc, &cakps);
if (status) { ... }

status = SecACLSetSimpleContents(acl,
NULL, // All applications.
desc,
&cakps);
if (status) { ... }

if (applist != NULL)
CFRelease(applist);
if (desc != NULL)
CFRelease(desc);
}

关于objective-c - 在 Mac OS X 上创建类型为 'Web Form Password' 的钥匙串(keychain)项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7838791/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com