Agregar Iniciar sesión con Apple en el back-end

En WWDC 2019, Apple presentó un nuevo sistema de autorización de usuario: inicie sesión con Apple. Hubo una tarea para integrarlo en nuestro back-end y sincronizarlo con los métodos de autorización existentes mediante correo electrónico, Google y Facebook. Nuestro colega kurenkoff asumió la tarea, él es el autor de este artículo. Los interesados ​​son solicitados bajo cat.

Procedimiento de registro y autorización de usuarios a través de Apple



El procedimiento es bastante primitivo y ocurre exactamente como se indica en el diagrama de Apple.

Además, Apple ofrece la posibilidad de actualizar el token:



El esquema también es bastante simple, es posible verificar el token, pero no usamos esta función, porque No lo necesitamos.

Implementar autorización a través de AppleID


Para implementar la autorización a través de AppleID, utilizamos el paquete appleLogin . El autor de este paquete cometió algunos errores, pero no son críticos (y algunos se solucionaron conjuntamente). En primer lugar, debe inicializar la configuración utilizando los datos recibidos a través del portal de desarrolladores de 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 } 

Luego obtén el token:

 token, err := config.GetAppleToken(clientToken, tokenExpireTime) if err != nil { return nil, err } 

Es importante tener en cuenta qué solicitud se envía al servidor de Apple. La documentación dice que para la autorización es necesario enviar los campos client_id, client_secret, code, grant_type, redirect_uri. Todos estos campos se describen como necesarios, pero se puede omitir redirect_uri. La principal dificultad es client_secret: este es un JWT firmado con una clave generada en el portal 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) 

La API de Apple responderá con un error o devolverá una estructura. Estamos interesados ​​en el campo 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 es un token JWT que contiene datos de usuario:

 type AppleUser struct { ID string json:"sub,omitempty" Email string json:"email,omitempty" EmailVerified bool json:"email_verified,string,omitempty" } 

Vale la pena prestar atención al hecho de que el correo electrónico solo se puede recibir en la primera autorización. Si intenta volver a autorizar, solo puede obtener una ID (una ID de usuario única en Iniciar sesión con Apple). Para registrar un usuario, necesitamos suficientes de estos datos.

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


All Articles