Accesso Apple, metodo di autorizzazione restituisce il nome solo la prima volta

Aug 20 2020

Implementazione dell'accesso Apple in un'app Web (vecchio stile ASP.NET, ma non importa: la domanda può essere trattata come un semplice POC HTML/JS), chiamando il metodo authorize sull'endpoint Apple:

https://appleid.apple.com/auth/authorize?client_id=...&redirect_uri=...&response_type=code%20id_token&state=...&response_mode=form_post&scope=name%20email

Voglio ottenere il nome e il cognome dell'utente. Il metodo restituisce qualcosa di simile a questo: {

   "state": "xxx",
   "code": "yyy",
   "id_token": "zzz",
   "user": {
        "name": {
            "firstName":"John",
            "lastName":"Doe"
        },
        "email":"[email protected]"
    }
}

id_token è JWT che consiste nell'ID Apple e nell'e-mail dell'utente, non ci sono dati relativi a nome o cognome.

Come puoi vedere, posso ottenere nome e cognome dalla proprietà dell'utente . Questo è l'unico modo che conosco.

Il problema è che Apple restituisce questi dati solo la prima volta che li richiedo. Non è un bug, è una caratteristica:https://developer.apple.com/documentation/sign_in_with_apple/sign_in_with_apple_js/configuring_your_webpage_for_sign_in_with_apple:

Importante

Apple restituisce l'oggetto utente solo la prima volta che l'utente autorizza l'app. Mantieni queste informazioni dalla tua app; le successive richieste di autorizzazione non conterranno l'oggetto utente.

Quindi memorizzo questi dati per dopo nel flusso di lavoro, li memorizzerò nel database.

Ora il mio problema/domanda:

Quando l'utente elimina il proprio account, elimino tutti i suoi dati dal db (devo farlo, a causa del contratto, della legge, ecc.).

Quando l'utente si registra nuovamente tramite l'accesso Apple, eseguo il ping dell'endpoint Apple e non ottengo più i dati dell'utente (inclusi nome e cognome) (a causa della politica Apple citata sopra)!

Cosa devo fare per ottenerlo?

Risposte

3 AnkitMishra Aug 28 2020 at 09:57

Sto facendo la parte back-end di accesso Apple, ho affrontato il problema simile.

Per iOS 13+

  • L'SDK fornisce uuid utente Apple, e-mail e nome per la prima richiesta di autorizzazione.
  • Stiamo mappando questo apple_user_uuid univoco con i dettagli del profilo nel DB. (In caso di errori di richiesta, puoi chiedere al back-end di metterlo in coda e l'app dovrebbe tenerlo nella cache fino a quando la chiamata di back-end non ha esito positivo).

Per ANDROID/WEB Flow/IOS inferiore a 13

  • Per la prima volta in apple callback, ci invia il nome con un codice monotempo (scadenza 5 minuti).

  • Usando questo codice quando chiamiamo l'API token, ci fornisce id_token JWT.

  • In token l'oggetto è apple_user_uuid.

  • Persisti nella stessa tabella.

Quindi ora nel back-end avrai sempre email, firstName, lastName taggati con apple_user_uuid, che rimane costante per un ID Apple.

E non eliminare questa mappatura se l'utente elimina il tuo account. Fino a quando Apple non fornisce una soluzione.