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,
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"
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.