Fügen Sie Anmelden mit Apple zum Back-End hinzu

Auf der WWDC 2019 stellte Apple ein neues Benutzerautorisierungssystem vor - Melden Sie sich bei Apple an. Es bestand die Aufgabe, es in unser Back-End zu integrieren und mit vorhandenen Autorisierungsmethoden über E-Mail, Google und Facebook zu synchronisieren. Unser Kollege kurenkoff hat die Aufgabe übernommen, er ist der Autor dieses Artikels. Interessenten werden unter Katze angefragt.

Benutzerregistrierungs- und Autorisierungsverfahren über Apple



Das Verfahren ist ziemlich primitiv und erfolgt genau wie im Diagramm von Apple angegeben.

Darüber hinaus bietet Apple die Möglichkeit, das Token zu aktualisieren:



Das Schema ist auch recht einfach, es ist möglich, das Token zu überprüfen, aber wir verwenden diese Funktion nicht, weil wir brauchen es nicht.

Implementieren Sie die Autorisierung über AppleID


Um die Autorisierung über AppleID zu implementieren, verwenden wir das appleLogin- Paket. Der Autor dieses Pakets hat einige Fehler gemacht, die jedoch nicht kritisch sind (und einige wurden gemeinsam behoben). Zunächst müssen Sie die Konfiguration anhand der über das Apple-Entwicklerportal empfangenen Daten initialisieren.

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 } 

Dann holen Sie sich den Token:

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

Es ist wichtig zu beachten, welche Anfrage an den Apple Server gesendet wird. Die Dokumentation besagt, dass zur Autorisierung die Felder client_id, client_secret, code, grant_type und redirect_uri gesendet werden müssen. Alle diese Felder werden nach Bedarf beschrieben, aber redirect_uri kann weggelassen werden. Die Hauptschwierigkeit ist client_secret - es ist eine JWT, die von einem im WWDR-Portal generierten Schlüssel signiert wurde:

 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) 

Die Apple API antwortet entweder mit einem Fehler oder gibt eine Struktur zurück. Wir interessieren uns für das IDToken-Feld:

 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 ist ein JWT-Token, das Benutzerdaten enthält:

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

Es ist zu beachten, dass E-Mails nur bei der ersten Autorisierung empfangen werden können. Wenn Sie versuchen, eine erneute Autorisierung durchzuführen, können Sie nur eine ID erhalten (eine eindeutige Benutzer-ID bei Anmelden bei Apple). Um einen Benutzer zu registrieren, benötigen wir genügend dieser Daten.

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


All Articles