Part of #1.
Blocked by: none. Blocks both Meta issues.
Problem. Facebook Login is OAuth 2.0 without OpenID Connect: there is no ID token, no discovery document, and the profile comes from a Graph API call. The openidconnect crate will not fit. Meta app review also requires a data deletion callback before the app can leave development mode.
Proposed approach.
- Use the
oauth2 crate (which openidconnect is built on) for the authorization-code exchange against https://www.facebook.com/v19.0/dialog/oauth and https://graph.facebook.com/v19.0/oauth/access_token, through the harness HttpClient port.
- Profile step:
GET https://graph.facebook.com/me?fields=id,name,email with the access token; email may be absent when the user has not verified one or declined the permission. Treat email as optional.
- Verify the token belongs to our app with
debug_token or by relying on the direct exchange; decide which.
- Data deletion callback: Meta POSTs a
signed_request (base64url payload plus HMAC-SHA256 with the app secret) with the user id; the endpoint must verify it, enqueue deletion, and respond with { url, confirmation_code } where url is a status page. Decide what "deletion" means here: unlink the Meta identity, and delete the user only if it has no other identity and no other data, otherwise anonymise the Meta identity.
- Record what the app review submission needs from us: privacy policy URL, data deletion URL, the
email and public_profile permissions.
Acceptance criteria
Part of #1.
Blocked by: none. Blocks both Meta issues.
Problem. Facebook Login is OAuth 2.0 without OpenID Connect: there is no ID token, no discovery document, and the profile comes from a Graph API call. The
openidconnectcrate will not fit. Meta app review also requires a data deletion callback before the app can leave development mode.Proposed approach.
oauth2crate (whichopenidconnectis built on) for the authorization-code exchange againsthttps://www.facebook.com/v19.0/dialog/oauthandhttps://graph.facebook.com/v19.0/oauth/access_token, through the harnessHttpClientport.GET https://graph.facebook.com/me?fields=id,name,emailwith the access token; email may be absent when the user has not verified one or declined the permission. Treat email as optional.debug_tokenor by relying on the direct exchange; decide which.signed_request(base64url payload plus HMAC-SHA256 with the app secret) with the user id; the endpoint must verify it, enqueue deletion, and respond with{ url, confirmation_code }whereurlis a status page. Decide what "deletion" means here: unlink the Meta identity, and delete the user only if it has no other identity and no other data, otherwise anonymise the Meta identity.emailandpublic_profilepermissions.Acceptance criteria
wrangler devoauth2crate plus hand-rolled profile step, with the exact endpoints and fieldssigned_requestverifier with a test vector