I'm testing app transferring, before, I have migrate user from teamA to teamB, including subA->transferSub->subB process, now I'm transfer the app from teamB to teamC, after the transfer requested, I can't get transfer_id by /usermigrationinfo api, which response 400 invalid request.
the question is I can still get transfer sub by the auth/token api(grant_type: authorization_code) with teamB parameters(teamIdB/clientIdB/appSecretB/redirectUrlB/subB),but the value is same as first time transfer_id which get during teamA to teamB.
when use parameters above with target(teamIdC) to request /usermigrationinfo, invalid request was responsed.
im sure that all parameters is correct, dose it cause by teamB still in 60-days first transferring(sure already accepted)?
Prioritize 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
Hello,
I am currently process of migrating an app from Team A to Team B and attempting to generate transfer identifiers using the migration endpoint:
POST https://appleid.apple.com/auth/usermigrationinfo.
Content-Type: application/x-www-form-urlencoded
However, I am consistently receiving an
{
"error": "access_denied"
} response.
[Current Configuration]
Team A (Source):
Primary App ID: com.example.primary
Grouped App IDs:
com.example.service (Services ID for Web)
com.example.app (App ID for iOS - The one being transferred)
All identifiers are under the same App Group.
Team B (Destination):
New App ID and Key created.
[Steps Taken]
Created a Client Secret (JWT) using Team A's Key ID and Team ID.
The sub (subject) in the JWT is set to the Primary App ID of Team A.
Requesting with client_id (Primary App ID), client_secret (JWT), and user_token.
[Questions]
1. App Group Impact: Does the fact that the App being transferred is a Grouped App ID (not the Primary) affect the usermigrationinfo request? Should I use the Primary App ID or the specific Grouped App ID as the client_id?
2. Ungrouping Safety: If I need to ungroup the App ID from the Primary App ID to resolve this:
Will existing users still be able to sign in without issues?
Is there any risk of changing the sub (user identifier) that the app receives from Apple?
Will this cause any immediate service interruption for the live app?
Any insights on why access_denied occurs in this Primary-Grouped configuration would be greatly appreciated.
Running the sample "Juice" app, which demos the Sign In With Apple flow, doesn't seem to work with Xcode 12 beta and iOS 14 beta on the simulator (worked fine on the non-beta versions and on a real device with iOS 14 beta).
Once the password for the device's Apple ID is entered, the wheel in the password field just keeps spinning. No error messages and nothing handed back over to the app from the ASAuthorizationController.
Anyone else seeing this problem ? Are there any workarounds ?
Topic:
Privacy & Security
SubTopic:
Sign in with Apple
Tags:
Sign in with Apple
Simulator
Authentication Services
Hello,
I’m trying to remove the “Sign in with Apple” for my app via the iOS settings (also tried on a Mac, and on the web via account.apple.com).
When I tap “Stop Using”, nothing happens, the dialog disappear but the app remains listed.
Someone said on a forum that the issue is linked with the ServiceId that doesn't exist anymore. But how to recover it ? And anyway this behavior is unintended and creates a gap in the process.
Has anyone experienced this before? Is there a known fix, or should I contact Apple Support directly for server-side revocation?
Thank you!
Topic:
Privacy & Security
SubTopic:
Sign in with Apple
I have a user (myself, during development) who originally signed in with Apple successfully. I attempted to revoke
access via Settings > Apple ID > Sign-In & Security > Sign in with Apple, but the app appears stuck in the list and
cannot be fully removed. Now when attempting to sign in again, the identity token contains the correct sub but email is
undefined. According to Apple's documentation, "Apple provides the user's email address in the identity token on all
subsequent API responses." I've tried programmatically revoking via the /auth/revoke endpoint (received 200 OK), and
I've implemented the server-to-server notification endpoint to handle consent-revoked events, but subsequent sign-in
attempts still return no email. The same Apple ID works fine with other apps. Is there a way to fully reset the
credential state for a specific app, or is this a known issue with partially-revoked authorizations?
I have a user (myself, during development) who originally signed in with Apple successfully. I attempted to revoke
access via Settings > Apple ID > Sign-In & Security > Sign in with Apple, but the app appears stuck in the list and
cannot be fully removed. Now when attempting to sign in again, the identity token contains the correct sub but email is
undefined. According to Apple's documentation, "Apple provides the user's email address in the identity token on all
subsequent API responses." I've tried programmatically revoking via the /auth/revoke endpoint (received 200 OK), and
I've implemented the server-to-server notification endpoint to handle consent-revoked events, but subsequent sign-in
attempts still return no email. The same Apple ID works fine with other apps. Is there a way to fully reset the
credential state for a specific app, or is this a known issue with partially-revoked authorizations?
In these threads, it was clarified that Credential Provider Extensions must set both Backup Eligible (BE) and Backup State (BS) flags to 1 in authenticator data:
https://developer.apple.com/forums/thread/745605
https://developer.apple.com/forums/thread/787629
However, I'm developing a passkey manager that intentionally stores credentials only on the local device. My implementation uses:
kSecAttrAccessibleWhenUnlockedThisDeviceOnly for keychain items
kSecAttrTokenIDSecureEnclave for private keys
No iCloud sync or backup
These credentials are, by definition, single-device credentials. According to the WebAuthn specification, they should be represented with BE=0, BS=0.
Currently, I'm forced to set BE=1, BS=1 to make the extension work, which misrepresents the actual backup status to relying parties. This is problematic because:
Servers using BE/BS flags for security policies will incorrectly classify these as synced passkeys
Users who specifically want device-bound credentials for higher security cannot get accurate flag representation
Request: Please allow Credential Provider Extensions to return credentials with BE=0, BS=0 for legitimate device-bound passkey implementations.
Environment: macOS 26.2 (25C56), Xcode 26.2 (17C52)
Topic:
Privacy & Security
SubTopic:
General
Tags:
Extensions
macOS
Authentication Services
Passkeys in iCloud Keychain
Hello,
I’m working on an authorization plugin which allows users to login and unlock their computer with various methods like a FIDO key. I need to add smart cards support to it. If I understand correctly, I need to construct a URLCredential object with the identity from the smart card and pass it to the completion handler of URLSessionDelegate.urlSession(_:didReceive:completionHandler:) method. I’ve read the documentation at Using Cryptographic Assets Stored on a Smart Card, TN3137: On Mac keychain APIs and implementations, and SecItem: Pitfalls and Best Practices and created a simple code that reads the identities from the keychain:
CFArrayRef identities = nil;
OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)@{
(id)kSecClass: (id)kSecClassIdentity,
(id)kSecMatchLimit: (id)kSecMatchLimitAll,
(id)kSecReturnRef: @YES,
}, (CFTypeRef *)&identities);
if (status == errSecSuccess && identities) {
os_log(OS_LOG_DEFAULT, "Found identities: %{public}ld\n", CFArrayGetCount(identities));
} else {
os_log(OS_LOG_DEFAULT, "Error: %{public}ld\n", (long)status);
}
When I use this code in a simple demo app, it finds my Yubikey identities without problem. When I use it in my authorization plugin, it doesn’t find anything in system.login.console right and finds Yubikey in authenticate right only if I register my plugin as non-,privileged. I tried modifying the query in various ways, in particular by using SecKeychainCopyDomainSearchList with the domain kSecPreferencesDomainDynamic and adding it to the query as kSecMatchSearchList and trying other SecKeychain* methods, but ended up with nothing. I concluded that the identities from a smart card are being added to the data protection keychain rather than to a file based keychain and since I’m working in a privileged context, I won’t be able to get them. If this is indeed the case, could you please advise how to proceed? Thanks in advance.
Hi,
I'm using webauthn.io to test my macOS Passkey application. When registering a passkey whichever value I set for User Verification, that's what I get when I check registrationRequest.userVerificationPreference on prepareInterface(forPasskeyRegistration registrationRequest: any ASCredentialRequest).
However, when authenticating my passkey I can never get discouraged UV on prepareInterfaceToProvideCredential(for credentialRequest: any ASCredentialRequest).
In the WWDC 2022 Meet Passkeys video, it is stated that Apple will always require UV when biometrics are available. I use a Macbook Pro with TouchID, but if I'm working with my lid closed, shouldn't I be able to get .discouraged?
Topic:
Privacy & Security
SubTopic:
General
Tags:
Authentication Services
Passkeys in iCloud Keychain
Trusted execution is a generic name for a Gatekeeper and other technologies that aim to protect users from malicious code.
General:
Forums topic: Code Signing
Forums tag: Gatekeeper
Developer > Signing Mac Software with Developer ID
Apple Platform Security support document
Safely open apps on your Mac support article
Hardened Runtime document
WWDC 2022 Session 10096 What’s new in privacy covers some important Gatekeeper changes in macOS 13 (starting at 04: 32), most notably app bundle protection
WWDC 2023 Session 10053 What’s new in privacy covers an important change in macOS 14 (starting at 17:46), namely, app container protection
WWDC 2024 Session 10123 What’s new in privacy covers an important change in macOS 15 (starting at 12:23), namely, app group container protection
Updates to runtime protection in macOS Sequoia news post
Testing a Notarised Product forums post
Resolving Trusted Execution Problems forums post
App Translocation Notes (aka Gatekeeper path randomisation) forums post
Most trusted execution problems are caused by code signing or notarisation issues. See Code Signing Resources and Notarisation Resources.
Share and Enjoy
—
Quinn “The Eskimo!” @ Developer Technical Support @ Apple
let myEmail = "eskimo" + "1" + "@" + "apple.com"
Estou compartilhando algumas observações técnicas sobre Crash Detection / Emergency SOS no ecossistema Apple, com base em eventos amplamente observados em 2022 e 2024, quando houve chamadas automáticas em massa para serviços de emergência.
A ideia aqui não é discutir UX superficial ou “edge cases isolados”, mas sim comportamento sistêmico em escala, algo que acredito ser relevante para qualquer time que trabalhe com sistemas críticos orientados a eventos físicos.
Contexto resumido
A partir do iPhone 14, a Detecção de Acidente passou a correlacionar múltiplos sensores (acelerômetros de alta faixa, giroscópio, GPS, microfones) para inferir eventos de impacto severo e acionar automaticamente chamadas de emergência. Em 2022, isso resultou em um volume significativo de falsos positivos, especialmente em atividades com alta aceleração (esqui, snowboard, parques de diversão). Em 2024, apesar de ajustes, houve recorrência localizada do mesmo padrão.
Ponto técnico central
O problema não parece ser hardware, nem um “bug pontual”, mas sim o estado intermediário de decisão:
Aceleração ≠ acidente
Ruído ≠ impacto real
Movimento extremo ≠ incapacidade humana
Quando o classificador entra em estado ambíguo, o sistema depende de uma janela curta de confirmação humana (toque/voz). Em ambientes ruidosos, com o usuário em movimento ou fisicamente ativo, essa confirmação frequentemente falha. O sistema então assume incapacidade e executa a ação fail-safe: chamada automática.
Do ponto de vista de engenharia de segurança, isso é compreensível. Do ponto de vista de escala, é explosivo.
Papel da Siri
A Siri não “decide” o acidente, mas é um elo sensível na cadeia humano–máquina. Falhas de compreensão por ruído, idioma, respiração ofegante ou ausência de resposta acabam sendo interpretadas como sinal de emergência real. Isso é funcionalmente equivalente ao que vemos em sistemas automotivos como o eCall europeu, quando a confirmação humana é inexistente ou degradada.
O dilema estrutural
Há um trade-off claro e inevitável:
Reduzir falsos negativos (não perder um acidente real)
Aumentar falsos positivos (chamadas indevidas)
Para o usuário individual, errar “para mais” faz sentido. Para serviços públicos de emergência, milhões de dispositivos errando “para mais” criam ruído operacional real.
Por que isso importa para developers
A Apple hoje opera, na prática, um dos maiores sistemas privados de segurança pessoal automatizada do mundo, interagindo diretamente com infraestrutura pública crítica. Isso coloca Crash Detection / SOS na mesma categoria de sistemas safety-critical, onde:
UX é parte da segurança
Algoritmos precisam ser auditáveis
“Human-in-the-loop” não pode ser apenas nominal
Reflexões abertas
Alguns pontos que, como developer, acho que merecem discussão:
Janelas de confirmação humana adaptativas ao contexto (atividade física, ruído).
Cancelamento visual mais agressivo em cenários de alto movimento.
Perfis de sensibilidade por tipo de atividade, claramente comunicados.
Critérios adicionais antes da chamada automática quando o risco de falso positivo é estatisticamente alto.
Não é um problema simples, nem exclusivo da Apple. É um problema de software crítico em contato direto com o mundo físico, operando em escala planetária. Justamente por isso, acho que vale uma discussão técnica aberta, sem ruído emocional.
Curioso para ouvir perspectivas de quem trabalha com sistemas similares (automotivo, wearables, safety-critical, ML embarcado).
— Rafa
Topic:
Privacy & Security
SubTopic:
General
Tags:
Siri Event Suggestions Markup
Core ML
App Intents
Communication Safety
Hello,
We are experiencing an issue related to Sign in with Apple Server-to-Server (S2S) notifications, specifically involving repeated delivery of the account-deleted event, and would like to ask whether this behavior is expected or known.
Background
We have configured an S2S notification endpoint for Sign in with Apple in accordance with Apple’s requirements for account status change notifications.
Our endpoint:
Is reachable over HTTPS
Consistently returns HTTP 200 OK
Successfully receives other S2S events, including:
email-enabled
email-disabled
consent-revoked
Issue: Repeated 'account-deleted' events for the same Apple ID
For most users, the account-deleted event is delivered only once, as expected.
However, for a specific Apple ID used with Sign in with Apple, we are observing repeated deliveries of the same account-deleted event, arriving at regular intervals (approximately every 5 minutes).
The payload contents are identical between deliveries and include the same user identifier (sub) and event timestamp.
Notably:
The Apple ID deletion itself completed successfully
The payload does not change between deliveries
Our endpoint continues to return HTTP 200 OK for every request
Questions
We would appreciate clarification on the following points:
Is repeated delivery of the same account-deleted event expected behavior in any scenario?
Is there a retry or redelivery mechanism for this event type, even when HTTP 200 is returned?
Could repeated deliveries indicate that the deletion process is still considered “in progress” on Apple’s side?
Are developers expected to treat account-deleted events as at-least-once delivery and handle them idempotently?
Additional context
While researching this issue, we found a forum thread describing a very similar case:
https://developer.apple.com/forums/thread/735674
In that discussion, Apple staff advised submitting the issue via Feedback Assistant, which suggests that this behavior may already be understood internally.
We have also submitted a Feedback Assistant report with detailed logs and timestamps.
Any clarification on the expected behavior or recommended handling for this scenario would be greatly appreciated.
Thank you for your time and support.
Hi Apple Developers,
I'm having a problem with evaluatedPolicyDomainState: on the same device, its value keeps changing and then switching back to the original. My current iOS version is 26.1.
I upgraded my iOS from version 18.6.2 to 26.1.
What could be the potential reasons for this issue?
{
NSError *error;
BOOL success = YES;
char *eds = nil;
int edslen = 0;
LAContext *context = [[LAContext alloc] init];
// test if we can evaluate the policy, this test will tell us if Touch ID is available and enrolled
// success = [context canEvaluatePolicy: LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error];
if (SystemVersion > 9.3) {
// test if we can evaluate the policy, this test will tell us if Touch ID is available and enrolled
success = [context canEvaluatePolicy: LAPolicyDeviceOwnerAuthentication error:&error];
}
else{
// test if we can evaluate the policy, this test will tell us if Touch ID is available and enrolled
success = [context canEvaluatePolicy: LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error];
}
if (success)
{
if (@available(iOS 18.0, *)) {
NSData *stateHash = nil;
if ([context respondsToSelector:@selector(domainState)]) {
stateHash = [[context performSelector:@selector(domainState)] performSelector:@selector(stateHash)];
}else{
stateHash = [context evaluatedPolicyDomainState];
}
eds = (char *)stateHash.bytes;
edslen = (int)stateHash.length;
} else {
eds = (char *)[[context evaluatedPolicyDomainState] bytes];
edslen = (int)[[context evaluatedPolicyDomainState] length];
}
CC_SHA256(eds, edslen, uviOut);
*poutlen = CC_SHA256_DIGEST_LENGTH;
}
else
{
*poutlen = 32;
gm_memset(uviOut, 0x01, 32);
}
}
After registe Passkey with webauthn library, i create a passkeyRegistration with follow,
let passkeyRegistration = ASPasskeyRegistrationCredential(relyingParty: serviceIdentifier, clientDataHash: clientDataHashSign, credentialID: credentialId, attestationObject: attestationObject)
and then completeRegistrationRequest like that,
extensionContext.completeRegistrationRequest(using: passkeyRegistration)
But a bad outcome occurred from user agent. NotAllowedError:The request is not allowed by the user agent or the platform in the current context.
And the return data rawID & credentialPublicKey is empty,
Topic:
Privacy & Security
SubTopic:
General
Tags:
Autofill
Authentication Services
Passkeys in iCloud Keychain
My application is supporting hybrid transport on FIDO2 webAuthn specs to create credential and assertion. And it support legacy passkeys which only mean to save to 1 device and not eligible to backup.
However In my case, if i set the Backup Eligibility and Backup State flag to false, it fails on the completion of the registrationRequest to save the passkey credential within credential extension, the status is false instead of true.
self.extension.completeRegistrationRequest(using: passkeyRegistrationCredential)
The attestation and assertion flow only works when both flags set to true.
Can advice why its must have to set both to true in this case?
Trying to make a new developer account but says I cannot. Here are the variables.
I have a personal icloud account, it was tied to a developer organization account for an app and company I shut down. I let that developer account expire. Both tied to my mobile number. I can access it but cannot do anything.
Trying to setup a new organization developer account using that mobile phone number, but it will not let me create the account. (have a new app/company)
Used a different phone number and still got the message that I could not create a new account at this time.
Topic:
Privacy & Security
SubTopic:
Sign in with Apple
Hi
I'm developing an app that autofills Passkeys. The app allows the user to authenticate to their IdP to obtain an access token. Using the token the app fetches from <server>/attestation/options.
The app will generate a Passkey credential using a home-grown module - the extension has no involvement, neither does ASAuthorizationSecurityKeyPublicKeyCredentialProvider. I can confirm the passkey does get created.
Next the credential is posted to <server>/attestation/results with the response JSON being parsed and used to create a ASPasskeyCredentialIdentity - a sample of the response JSON is attached.
Here is my save function:
static func save(authenticator: AuthenticatorInfo) async throws {
guard let credentialID = Data(base64URLEncoded: authenticator.attributes.credentialId) else {
throw AuthenticatorError.invalidEncoding("Credential ID is not a valid Base64URL string.")
}
guard let userHandle = authenticator.userId.data(using: .utf8) else {
throw AuthenticatorError.invalidEncoding("User handle is not a valid UTF-8 string.")
}
let identity = ASPasskeyCredentialIdentity(
relyingPartyIdentifier: authenticator.attributes.rpId,
userName: authenticator.userId, // This is what the user sees in the UI
credentialID: credentialID,
userHandle: userHandle,
recordIdentifier: authenticator.id
)
try await ASCredentialIdentityStore.shared.saveCredentialIdentities([identity])
}
Although no error occurs, I don't get any identities returned when I call this method:
let identities = await ASCredentialIdentityStore.shared.credentialIdentities(
forService: nil,
credentialIdentityTypes: [.passkey]
)
Here is the Info.plist in the Extension:
<plist version="1.0">
<dict>
<key>NSExtension</key>
<dict>
<key>NSExtensionAttributes</key>
<dict>
<key>ASCredentialProviderExtensionCapabilities</key>
<dict>
<key>ProvidesPasskeys</key>
<true/>
</dict>
<key>ASCredentialProviderExtensionShowsConfigurationUI</key>
<true/>
</dict>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.authentication-services-credential-provider-ui</string>
<key>NSExtensionPrincipalClass</key>
<string>$(PRODUCT_MODULE_NAME).CredentialProviderViewController</string>
</dict>
</dict>
</plist>
The entitlements are valid and the app and extension both support the same group.
I'm stumped as to why the identity is not getting saved. Any ideas and not getting retrieved.
attestationResult.json
Hi
I am experiencing a persistent 'invalid_client' error when attempting to exchange the authorization code for an access token using Sign in with Apple for my website (https://www.vitamarinaweb.com).
Current Setup & Steps Taken:
Identifier: I am using the Service ID com.vitamarinaweb.web1, which is correctly linked to the Primary App ID com.vitamarinaweb.web.
Client Secret: I have generated a fresh Client Secret (JWT) using a valid Key (.p8) and confirmed the Team ID (29J763Q88J) and Key ID (RRW6536D27) are correct.
Redirect URIs: My Return URL is set to https://www.vitamarinaweb.com/login.php and I have verified there are no trailing spaces or mismatches.
Manual Test (CURL): When I perform a manual POST request via CURL using the generated Client Secret, I receive an 'invalid_grant' response (meaning the Client Secret and Client ID are accepted, and only the temporary code is rejected as expected).
The Issue: Despite the CURL success, every request initiated through the web browser/PHP application returns {"error":"invalid_client"}.
Verification Requested:
Could you please verify if there is a synchronization delay or a specific block on Service ID com.vitamarinaweb.web1?
Is there any internal mismatch between the Key ID RRW6536D27 and its association with the newly created Service ID?
I have already cleared browser caches and tried multiple devices (different IP addresses) with the same result.
Thank you for your assistance."
Hi,
In our app we are using DeviceCheck (App Attest) in a production environment iOS. The service works correctly for most users, but a user reported failure in a flow that use device check service. This failure is not intermittently, it is constant.
We are unable to reproduce this failure and we are believing that this failure occurred by new version ios 26.3 because for others users using early versions the service is normally.
Environment
iOS 26.3
Real device
App Attest capability enabled
Correct App ID, Team ID and App Attest entitlement
Production environment
Characteristics:
appears constantly
affects only unique user
-Don't resolves after time or reinstall
not reproducible on our test devices
NSError contains no additional diagnostic info (Error Domain=com.apple.devicecheck.error Code=3 "(null)")
We saw about this error code 3 in this post 812308, but it's not our case because the ios version in this case is not iOS 17.0 or earlier.
Please, help us any guidance for solution. Thank you
Hi everyone,
I'm working on an app that stores multiple secrets in the Keychain, each protected with .userPresence.
My goal is to authenticate the user once via FaceID/TouchID and then read multiple Keychain items without triggering subsequent prompts.
I am reusing the same LAContext instance for these operations, and I have set:
context.touchIDAuthenticationAllowableReuseDuration = LATouchIDAuthenticationMaximumAllowableReuseDuration
However, I'm observing that every single SecItemCopyMatching call triggers a new FaceID/TouchID prompt, even if they happen within seconds of each other using the exact same context.
Here is a simplified flow of what I'm doing:
Create a LAContext.
Set touchIDAuthenticationAllowableReuseDuration to max.
Perform a query (SecItemCopyMatching) for Item A, passing [kSecUseAuthenticationContext: context].
Result: System prompts for FaceID. Success.
Immediately perform a query (SecItemCopyMatching) for Item B, passing the same [kSecUseAuthenticationContext: context].
Result: System prompts for FaceID again.
My question is:
Does the .userPresence access control flag inherently force a new user interaction for every Keychain access, regardless of the LAContext reuse duration? Is allowableReuseDuration only applicable for LAContext.evaluatePolicy calls and not for SecItem queries?
If so, is there a recommended pattern for "unlocking" a group of Keychain items with a single biometric prompt?
Environment: iOS 17+, Swift.
Thanks!