Lors de la WWDC 2019, Apple a présenté un nouveau système d'autorisation utilisateur - Connectez-vous avec Apple. Il nous a fallu l'intégrer dans notre back-end et le synchroniser avec les méthodes d'autorisation existantes à l'aide de la messagerie électronique, de Google et de Facebook. Notre collègue
kurenkoff a repris la tâche, il est l'auteur de cet article. Les personnes intéressées sont demandées sous cat.
Procédure d'enregistrement et d'autorisation des utilisateurs via Apple

La procédure est assez primitive et se déroule exactement comme indiqué sur le schéma d'Apple.
De plus, Apple offre la possibilité de mettre à jour le jeton:

Le schéma est également assez simple, il est possible de vérifier le token, mais nous n'utilisons pas cette fonctionnalité, car nous n'en avons pas besoin.
Mettre en œuvre l'autorisation via AppleID
Pour implémenter l'autorisation via AppleID, nous utilisons le package
appleLogin . L'auteur de ce paquet a fait quelques erreurs, mais elles ne sont pas critiques (et certaines ont été corrigées conjointement). Tout d'abord, vous devez initialiser la configuration à l'aide des données reçues via le portail des développeurs Apple.
config := appleLogin.InitAppleConfig( TeamID,
Obtenez ensuite le jeton:
token, err := config.GetAppleToken(clientToken, tokenExpireTime) if err != nil { return nil, err }
Il est important de noter quelle demande est envoyée au serveur Apple. La
documentation indique que pour l'autorisation, il est nécessaire d'envoyer les champs client_id, client_secret, code, grant_type, redirect_uri. Tous ces champs sont décrits comme obligatoires, mais redirect_uri peut être omis. La principale difficulté est client_secret - c'est un JWT signé par une clé générée sur le portail WWDR:
token := jwt.NewWithClaims(jwt.SigningMethodES256, jwt.MapClaims{ "iss": a.TeamID, "iat": time.Now().Unix(), "exp": time.Now().Unix() + expireTime, "aud": "https://appleid.apple.com", "sub": a.ClientID, }) token.Header = map[string]interface{}{ "kid": a.KeyID, "alg": "ES256", } tokenString, _ := token.SignedString(a.AESCert)
L'API d'Apple répondra par une erreur ou renverra une structure. Nous sommes intéressés par le domaine IDToken:
type AppleAuthToken struct { AccessToken string json:"access_token"
IDToken est un jeton JWT contenant des données utilisateur:
type AppleUser struct { ID string json:"sub,omitempty" Email string json:"email,omitempty" EmailVerified bool json:"email_verified,string,omitempty" }
Il convient de prêter attention au fait que les e-mails ne peuvent être reçus qu'à la première autorisation. Si vous essayez de renouveler l'autorisation, vous ne pouvez obtenir qu'un identifiant (un identifiant utilisateur unique dans Se connecter avec Apple). Pour enregistrer un utilisateur, nous avons besoin de suffisamment de ces données.