Part of #1.
Blocked by: #3 (Spike: Apple client secret minting, form_post callback and first-authorization name); #15 (Google: registration and login via openidconnect); Cratefield/harness#46 (form bodies)
Problem. Apple reuses the OIDC machinery from the Google issue but with the three differences the spike resolved: a minted client secret, a cross-site form_post callback, and a name that arrives once.
Proposed approach.
- Provider descriptor for Apple on the
auth-oidc module with the spike's decisions applied: client secret from apple::mint_client_secret() with the in-memory cache, state transported as decided, response_mode=form_post, scopes name email.
POST /apple/callback accepting form-encoded bodies (harness prerequisite), verifying the ID token against Apple's JWKS, capturing the user JSON when present and storing name_at_link.
- Email may be a private relay address;
email_verified from Apple is trusted for linking only when the address is not a relay, per the account-linking rules.
- Apple requires the "Sign in with Apple" button assets and the Services ID's return URLs to be registered exactly; document that in the runbook.
Acceptance criteria
Part of #1.
Blocked by: #3 (Spike: Apple client secret minting, form_post callback and first-authorization name); #15 (Google: registration and login via openidconnect); Cratefield/harness#46 (form bodies)
Problem. Apple reuses the OIDC machinery from the Google issue but with the three differences the spike resolved: a minted client secret, a cross-site form_post callback, and a name that arrives once.
Proposed approach.
auth-oidcmodule with the spike's decisions applied: client secret fromapple::mint_client_secret()with the in-memory cache, state transported as decided,response_mode=form_post, scopesname email.POST /apple/callbackaccepting form-encoded bodies (harness prerequisite), verifying the ID token against Apple's JWKS, capturing theuserJSON when present and storingname_at_link.email_verifiedfrom Apple is trusted for linking only when the address is not a relay, per the account-linking rules.Acceptance criteria
userfield, and one withoutkidheader, cache hit