Ajouter Se connecter avec Apple au back-end

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, // ID   developer.apple.com,   iOS  ClientID, // Bundle  iOS  callbackURI, //       KeyID, //     developer.apple.com,   iOS  ) privateKey := os.Getenv("PRIVATE_KEY") err := config.LoadP8CertByByte([]byte(privateKey)) if err != nil { return nil, err } 

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" //AccessToken ExpiresIn int64 json:"expires_in" //Expires in IDToken string json:"id_token" //ID token RefreshToken string json:"refresh_token" //RF token TokenType string json:"token_type" //Token Type } 

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.

Source: https://habr.com/ru/post/fr470175/


All Articles