Hello --
I am developing an Authentication Plug-in for the purpose of invoking login with no user interaction (headless).
There seems to be sufficient documentation and sample code on how to implement a plug-in and mechanism, and debug the same, which is great. What I am trying to understand is exactly how to modify the login right (system.login.console) in order to accomplish my goal.
Question 1:
I had the idea of installing my mechanism as the first mechanism of the login right, and when invoked to set the username and password into the engine’s context, in the belief that this would negate the system from needing to display the login screen. I didn’t modify or remove any other mechanisms. This did not work, in the sense that the login screen was still shown. Should this work in theory?
Question 2:
I then tried modifying the login right to remove anything that interacted with the user, leaving only the following:
<array>
<string>builtin:prelogin</string>
<string>builtin:login-begin</string>
<string>builtin:forward-login,privileged</string>
<string>builtin:auto-login,privileged</string> <string>MyAuthPlugin:customauth,privileged</string>
<string>PKINITMechanism:auth,privileged</string>
<string>builtin:login-success</string>
<string>HomeDirMechanism:login,privileged</string>
<string>HomeDirMechanism:status</string>
<string>MCXMechanism:login</string>
<string>CryptoTokenKit:login</string>
</array>
The mechanisms I removed were:
<string>builtin:policy-banner</string>
<string>loginwindow:login</string>
<string>builtin:reset-password,privileged</string>
<string>loginwindow:FDESupport,privileged</string>
<string>builtin:authenticate,privileged</string>
<string>loginwindow:success</string>
<string>loginwindow:done</string>
In place of builtin:authenticate I supplied my own mechanism to verify the user’s password using OD and then set the username and password in the context. This attempt appears to have failed quite badly, as authd reported an error almost immediately (I believe it was related to the AuthEngine failing to init).
There’s very little information to go on as to what each of these mechanisms do, and which are required, etc.
Am I on the wrong track in attempting this? What would be the correct approach?
General
RSS for tagPrioritize user privacy and data security in your app. Discuss best practices for data handling, user consent, and security measures to protect user information.
Selecting any option will automatically load the page
Post
Replies
Boosts
Views
Activity
How can my password manager app redirect users to the “AutoFill Passwords & Passkeys” settings page?
Hi all,
I’m building a password manager app for iOS. The app implements an ASCredentialProviderExtension and has the entitlement com.apple.developer.authentication-services.autofill-credential-provider.
From a UX perspective, I’d like to help users enable my app under:
Settings → General → AutoFill & Passwords
What I’ve observed:
Calling UIApplication.openSettingsURLString only opens my app’s own Settings page, not the AutoFill list.
Some apps (e.g. Google Authenticator) appear to redirect users directly into the AutoFill Passwords & Passkeys screen when you tap “Enable AutoFill.”
1Password goes even further: when you tap “Enable” in 1Password App, it shows a system pop-up, prompts for Face ID, and then enables 1Password as the AutoFill provider without the user ever leaving the app.
Questions:
Is there a public API or entitlement that allows apps to deep-link users directly to the AutoFill Passwords & Passkeys screen?
Is there a supported API to programmatically request that my app be enabled as an AutoFill provider (similar to what 1Password seems to achieve)?
If not, what is the recommended approach for guiding users through this flow?
Thanks in advance!
Topic:
Privacy & Security
SubTopic:
General
Tags:
Wallet
Authentication Services
Passkeys in iCloud Keychain
Managed Settings
Hi, is it legal to use open APIs to get the users's country country code using the Ip address in the app? I mean I want to know the user country for the game leaderboards data, and there are sites say this is free and open. So, I have two questions, first, is this making the user calling open api to get its country code concept legal? second question, what if these sites suddenly decided that it is not legal to use their apis for commercial use, and i miss that announcement; will you remove my app from the store? or what action will you take exactly?
Hello,
We recently implemented SSL pinning in our iOS app (Objective-C) using the common approach of embedding the server certificate (.cer) in the app bundle and comparing it in URLSession:didReceiveChallenge:. This worked fine initially, but when our backend team updated the server certificate (same domain, new cert from CA), the app immediately started failing because the bundled certificate no longer matched.
We’d like to avoid shipping and updating our app every time the server’s certificate changes. Instead, we are looking for the Apple-recommended / correct approach to implement SSL pinning without embedding the actual certificate file in the app bundle.
Specifically:
. Is there a supported way to implement pinning based on the public key hash or SPKI hash (like sha256/... pins) rather than the full certificate?
. How can this be safely implemented using NSURLSession / SecTrustEvaluate (iOS 15+ APIs, considering that SecTrustGetCertificateAtIndex is deprecated)?
. Are there Apple-endorsed best practices for handling certificate rotation while still maintaining strong pinning?
Any guidance or code samples would be greatly appreciated. We want to make sure we are following best practices and not relying on brittle implementations.
Thanks in advance!
Topic:
Privacy & Security
SubTopic:
General
We have a macOS app that has a Photos Extension, which shares documents with the app via an app group container. Historically we used to have an iOS-style group identifier (group.${TeamIdentifier}${groupName}), because we were lead by the web interface in the developer portal to believe this to be the right way to name groups.
Later with the first macOS 15 betas last year there was a bug with the operating system warning users, our app would access data from different apps, but it was our own app group container directory.
Therefore we added a macOS-style group identifier (${TeamIdentifier}${groupName}) and wrote a migration of documents to the new group container directory.
So basically we need to have access to these two app group containers for the foreseeable future.
Now with the introduction of iOS-style group identifiers for macOS, Xcode Cloud no longer archives our app for TestFlight or AppStore, because it complains:
ITMS-90286: Invalid code signing entitlements - Your application bundle’s signature contains code signing entitlements that aren’t supported on macOS. Specifically, the “[group.${TeamIdentifier}${groupName}, ${TeamIdentifier}${groupName}]” value for the com.apple.security.application-groups key in isn’t supported. This value should be a string or an array of strings, where each string is the “group” value or your Team ID, followed by a dot (“.”), followed by the group name. If you're using the “group” prefix, verify that the provisioning profile used to sign the app contains the com.apple.security.application-groups entitlement and its associated value(s).
We have included the iOS-style group identifier in the provisioning profile, generated automatically, but can't do the same for the macOS-style group identifier, because the web interface only accepts identifiers starting with "group".
How can we get Xcode Cloud to archive our app again using both group identifiers?
Thanks in advance
Hello, I have created an app for both iOs and Android where upon speaking two trigger words, the listening app sends a text and then calls to an inputted designated phone contact. The Android version works perfectly. The iOs version also works perfectly but the iOs app emiits a PopUp for each, the text and then the call asking "Do you really want to send the text -or- make the call". Basically, I input the contact info and I spoke the trigger words. So, yes I want to send the text and make the call. So, I have to click the two PopUps then the device sends and calls.
Is there a way to suppress the PopUps in any way? The app is designed for emergencies. So, a dely to anser a popup is not at all good.
Maybe by telling the device to allow auto calls and texts from my app?
Any and all help on this issue will be very welcomed...
Thanks :)
There is a sudden surge of users in our apps with invalidated biometrics. Even though the issue is being handled correctly and the user has another way to login, some of the users forgot their passwords and they can not login.
Is there any known issue with Biometrics in iOS 18.3.2 or later?
There is a (possible) related discussion here: https://discussions.apple.com/thread/256011565
Hi everyone,
I’m developing a multiplayer iOS game that uses Multipeer Connectivity for local peer-to-peer networking. I’d like to display user-assigned device names in the UI to help players identify each other during the connection process. In iOS 16 and later, accessing UIDevice.current.name requires the User-Assigned Device Name Entitlement.
The documentation states that the entitlement is granted for functionality involving “interaction between multiple devices that the same user operates”. My game is strictly multiplayer, with devices owned by different users, not a single user managing multiple devices.
I have a few questions regarding this:
Does the requirement for “devices operated by the same user” definitively exclude multiplayer scenarios where devices belong to different players? Can a Multipeer Connectivity-based game qualify for the entitlement in this case?
If the entitlement is not applicable, is prompting users to enter custom names the recommended approach for identifying devices in a multiplayer UI?
Has anyone successfully obtained this entitlement for a similar multiplayer use case with Multipeer Connectivity?
Thanks in advance.
We recently transferred two applications to a different account, both of which utilize Keychain and shared app containers. Before transferring the first application, we anticipated losing access to the Keychain and took proactive measures by backing up data to the app’s private container in the final release prior to the transfer.
During the app transfer process, we removed the shared container group ID from the old account and recreated it under the new account. In our testing, Keychain restoration from the local backup was successful, and users experienced no disruptions. However, after releasing the application, we observed that approximately 25% of our users not only lost their Keychain data as expected but also their shared app container data.
As we have been unable to reproduce this issue internally, we are seeking your guidance on how to prevent a similar situation when transferring our second application. At this stage, we have not yet released any updates from the new account, and the Keychain data remains backed up in the app’s private container.
We would appreciate any insights or recommendations you can provide to ensure a smooth transition for our users and make sure we can keep the data in shared container.
Topic:
Privacy & Security
SubTopic:
General
I am working on improving Keychain item storage secured with Face ID using SecAccessControlCreateWithFlags. The implementation uses the .biometryAny flag as shown below:
SecAccessControlCreateWithFlags(
kCFAllocatorDefault,
kSecAttrAccessibleWhenUnlockedThisDeviceOnly,
.biometryAny,
&error
)
While this approach generally works as expected, I encountered a specific edge case during testing. On iOS 18.3.1 with Xcode 15.4, the following sequence causes the Keychain item to become inaccessible:
Navigate to Settings > Face ID & Passcode and select Reset Face ID.
Before setting up a new Face ID, tap the Back button to exit the setup process.
Reopen the Face ID setup and complete the enrollment.
Return to the app—previously stored Keychain items protected by .biometryAny are no longer available.
This behavior appears to be a change introduced in recent iOS versions. In versions prior to iOS 15, resetting or deleting Face ID entries did not invalidate existing Keychain items protected by .biometryAny.
This difference in behavior between iOS versions raises questions about the changes to biometric protection handling.
Any suggestions are welcomed that might shine a light on what the best practice to use keychain access control and prevent the data to become unavailable.
Hello everyone,
In my application, i have implemented authentication using ASWebauthenticationSession. However, when redirecting the user to a WKWebView, no cookies are shared, causing the session to be lost and requiring the user to log in again.
Is there a way to share cookies between the two? If not, what would be the best approach to set up authentication that ensures SSO when switching to a WebView ?
Thank you very much for your help !
Hi folks
We have a Developer ID Application which we create using electron.
We made our last release for our Application on Nov'24 which was correctly working.
Using the same code, we tried creating a notarized application again which started showing the following error while opening our Application.
Monterey-
M2-
When we directly run the dmg on the dev machine, it does not give us the prompt. But if we download it from somewhere and run, the prompt comes up even in dev machine.
We executed some commands to verify the notarization:
1- spctl --assess -vv /Applications/Refresh\ Pro.app
On both dev machine and non-dev machine, the output was "accepted"
/Applications/Refresh Pro.app: accepted
source=Notarized Developer ID
origin=Developer ID Application: Prograde Digital Incorporated (*******)
2- xcrun stapler validate /Applications/Refresh\ Pro.app
On dev machine, we executed this command and the output is as follows.
Processing: /Applications/Refresh Pro.app
The validate action worked!
3- codesign -vvv --deep --strict /Applications/Refresh\ Pro.app/
/Applications/Refresh Pro.app: valid on disk
/Applications/Refresh Pro.app: satisfies its Designated Requirement
We have created a bug attaching the dmg. Please suggest anything we can try to make the release out the door.
Bug link- https://feedbackassistant.apple.com/feedback/16811025
Hi,
Our App relies on a keychain to store certificates and key-value pairs. However, when we upgraded from an older XCode 15.2 (1 year old) app version to a newer version XCode 16.2 (with identical keychain-groups entitlement), we found that the newer ipa cannot see the older keychain group anymore...
We tried Testflight builds, but limited to only generating newer versions, we tried using the older App's code, cast as a newer App version, and then upgraded to the newer code (with an even newer app version!). Surprisingly we were able to see the older keychain group.
So it seems that there's something different between the packaging/profile of the older (1 year) and newer (current) App versions that seems to cause the new version to not see the old keychainGroup...
Any ideas?
Hello Apple Developer Support,
I am experiencing an issue with Apple Sign-In and Private Relay across two separate organizations.
I have a web application that supports Apple Sign-In, configured under organization ID: 62P86SVLK4. Users can log in using their Apple accounts with the Hide My Email (Private Relay) feature enabled. This web application was created a long time ago and initially only had a web component.
Recently, we developed a native mobile version of this application, which also supports Apple Sign-In. However, due to business constraints, the mobile application was created under a different organization ID: T6JT35U9NW.
The Issue
Since the web and mobile applications are registered under different organizations, accounts created using Apple Sign-In with Private Relay are not recognized across both applications.
For example:
A user creates an account in the web app using Apple Sign-In with Private Relay.
When they attempt to log in to the mobile app with Apple Sign-In (also using Private Relay), authentication fails because the generated Private Relay email addresses do not match between the two organizations.
Question
Is there any way to link Private Relay accounts across these two organizations so that users who signed up on the web application can log in to the mobile application seamlessly?
I appreciate any guidance on how to resolve this issue.
Best regards,
Kamil Gronert
Hey all,
Question for the masses....
Does the Yubikey authentication have a OS dependency and it only works with a stable, public OS? Does Azure/Okta/Yubikey beta OS26?
My CEO installed iPadOS 26 on his iPad and was not able to authenticate via Yubikey into our company environment. I ran the same scenario on my iPad using iPadOS 26 and I had the same results. Downgrading to iPAdOS doesn't pose these issues.
I'm assuming something isn't fine-tuned yet?
For security reasons, my application needs to prohibit external devices. If it is determined that the current phone is connected to any external devices, including non MFI authenticated devices, the app will exit. Please tell me how to do it? Thanks for your help.
I'm a bit confused about if using App Attest is possible in enterprise builds. It shows up under identifiers in the apple dev portal and I can add it to my provisioning file and entitlements file. But if I go to keys I cannot create a key for it.
This page implies it can be used for enterprise builds:
After distributing your app through TestFlight, the App Store, or the Apple Developer Enterprise Program, your app ignores the entitlement you set and uses the production environment.
I'm trying to use ASWebAuthenticationSession on macOS but there is a weird crash and I have no idea what to do.
It looks like there is a main thread check in a framework code that I have no control over.
Any help would be appreciated.
Thank you in advance.
The stack of crashed thread has no symbols, even for supposedly my code in OAuthClient.authenticate.
macOS 15.4.1 (24E263)
Xcode Version 16.3 (16E140)
Thread 11: EXC_BREAKPOINT (code=1, subcode=0x10039bb04)
Thread 12 Queue : com.apple.NSXPCConnection.m-user.com.apple.SafariLaunchAgent (serial)
#0 0x0000000100b17b04 in _dispatch_assert_queue_fail ()
#1 0x0000000100b52834 in dispatch_assert_queue$V2.cold.1 ()
#2 0x0000000100b17a88 in dispatch_assert_queue ()
#3 0x000000027db5f3e8 in swift_task_isCurrentExecutorWithFlagsImpl ()
#4 0x00000001022c7754 in closure #1 in closure #1 in OAuthClient.authenticate() ()
#5 0x00000001022d0c98 in thunk for @escaping @callee_guaranteed (@in_guaranteed URL?, @guaranteed Error?) -> () ()
#6 0x00000001c7215a34 in __102-[ASWebAuthenticationSession initWithURL:callback:usingEphemeralSession:jitEnabled:completionHandler:]_block_invoke ()
#7 0x00000001c72163d0 in -[ASWebAuthenticationSession _endSessionWithCallbackURL:error:] ()
#8 0x00000001c7215fc0 in __43-[ASWebAuthenticationSession _startDryRun:]_block_invoke_2 ()
#9 0x0000000194e315f4 in __invoking___ ()
#10 0x0000000194e31484 in -[NSInvocation invoke] ()
#11 0x00000001960fd644 in __NSXPCCONNECTION_IS_CALLING_OUT_TO_REPLY_BLOCK__ ()
#12 0x00000001960fbe40 in -[NSXPCConnection _decodeAndInvokeReplyBlockWithEvent:sequence:replyInfo:] ()
#13 0x00000001960fb798 in __88-[NSXPCConnection _sendInvocation:orArguments:count:methodSignature:selector:withProxy:]_block_invoke_3 ()
#14 0x0000000194a6ef18 in _xpc_connection_reply_callout ()
#15 0x0000000194a6ee08 in _xpc_connection_call_reply_async ()
#16 0x0000000100b3130c in _dispatch_client_callout3_a ()
#17 0x0000000100b362f8 in _dispatch_mach_msg_async_reply_invoke ()
#18 0x0000000100b1d3a8 in _dispatch_lane_serial_drain ()
#19 0x0000000100b1e46c in _dispatch_lane_invoke ()
#20 0x0000000100b2bfbc in _dispatch_root_queue_drain_deferred_wlh ()
#21 0x0000000100b2b414 in _dispatch_workloop_worker_thread ()
#22 0x0000000100c0379c in _pthread_wqthread ()
My code:
@MainActor
func authenticate() async throws {
let authURL = api.authorizationURL(
scopes: scopes,
state: state,
redirectURI: redirectURI
)
let authorizationCodeURL: URL = try await withUnsafeThrowingContinuation { c in
let session = ASWebAuthenticationSession(url: authURL, callback: .customScheme(redirectScheme)) { url, error in
guard let url = url else {
c.resume(throwing: error ?? Error.unknownError("Failed to get authorization code"))
return
}
c.resume(returning: url)
}
session.presentationContextProvider = presentationContextProvider
session.start()
}
let authorizationCode = try codeFromAuthorizationURL(authorizationCodeURL)
(storedAccessToken, storedRefreshToken) = try await getTokens(authorizationCode: authorizationCode)
}
Here is disassembly of the crashed function.
libdispatch.dylib`_dispatch_assert_queue_fail:
0x10067fa8c <+0>: pacibsp
0x10067fa90 <+4>: sub sp, sp, #0x50
0x10067fa94 <+8>: stp x20, x19, [sp, #0x30]
0x10067fa98 <+12>: stp x29, x30, [sp, #0x40]
0x10067fa9c <+16>: add x29, sp, #0x40
0x10067faa0 <+20>: adrp x8, 71
0x10067faa4 <+24>: add x8, x8, #0x951 ; "not "
0x10067faa8 <+28>: adrp x9, 70
0x10067faac <+32>: add x9, x9, #0x16b ; ""
0x10067fab0 <+36>: stur xzr, [x29, #-0x18]
0x10067fab4 <+40>: cmp w1, #0x0
0x10067fab8 <+44>: csel x8, x9, x8, ne
0x10067fabc <+48>: ldr x10, [x0, #0x48]
0x10067fac0 <+52>: cmp x10, #0x0
0x10067fac4 <+56>: csel x9, x9, x10, eq
0x10067fac8 <+60>: stp x9, x0, [sp, #0x10]
0x10067facc <+64>: adrp x9, 71
0x10067fad0 <+68>: add x9, x9, #0x920 ; "BUG IN CLIENT OF LIBDISPATCH: Assertion failed: "
0x10067fad4 <+72>: stp x9, x8, [sp]
0x10067fad8 <+76>: adrp x1, 71
0x10067fadc <+80>: add x1, x1, #0x8eb ; "%sBlock was %sexpected to execute on queue [%s (%p)]"
0x10067fae0 <+84>: sub x0, x29, #0x18
0x10067fae4 <+88>: bl 0x1006c258c ; symbol stub for: asprintf
0x10067fae8 <+92>: ldur x19, [x29, #-0x18]
0x10067faec <+96>: str x19, [sp]
0x10067faf0 <+100>: adrp x0, 71
0x10067faf4 <+104>: add x0, x0, #0x956 ; "%s"
0x10067faf8 <+108>: bl 0x1006b7b64 ; _dispatch_log
0x10067fafc <+112>: adrp x8, 108
0x10067fb00 <+116>: str x19, [x8, #0x2a8]
-> 0x10067fb04 <+120>: brk #0x1
I have a very basic binary question around passkeys.
Assuming everything is on latest and greatest version with respect to iOS, when user starts creating a passkey in platform-authenticator i.e., iCloudKeyChain (Apple Password Manager) ,
will iCloudKeyChain create a hardware-bound passkey in secure-enclave i.e., is brand new key-pair created right inside Secure-enclave ?
OR
will the keypair be created in software i.e., software-bound-passkey ?? i.e., software-bound keypair and store the private-key locally in the device encrypted with a key that is of course created in secure-enclave.
Topic:
Privacy & Security
SubTopic:
General
Tags:
Passkeys in iCloud Keychain
Authentication Services
I am working on a SDK which helps identify the device authenticity. I am in need of something which can confirm the firmware/Hardware/OS is signed by Apple and is authentic. There will be no tempering to device?