рдмреИрдХ-рдПрдВрдб рдкрд░ Apple рдХреЗ рд╕рд╛рде рд╕рд╛рдЗрди рдЗрди рдХрд░реЗрдВ

WWDC 2019 рдореЗрдВ, Apple рдиреЗ рдПрдХ рдирдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рд╕рд┐рд╕реНрдЯрдо рд╢реБрд░реВ рдХрд┐рдпрд╛ - Apple рдХреЗ рд╕рд╛рде рд╕рд╛рдЗрди рдЗрди рдХрд░реЗрдВред рдЗрд╕реЗ рд╣рдорд╛рд░реЗ рдмреИрдХ-рдПрдВрдб рдореЗрдВ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдФрд░ рдЗрд╕реЗ рдИрдореЗрд▓, Google рдФрд░ рдлреЗрд╕рдмреБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореМрдЬреВрджрд╛ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдерд╛ред рд╣рдорд╛рд░реЗ рд╕рд╣рдпреЛрдЧреА kurenkoff рдиреЗ рдпрд╣ рдХрд╛рдо рд╕рдВрднрд╛рд▓рд╛, рд╡рд╣ рдЗрд╕ рд▓реЗрдЦ рдХреЗ рд▓реЗрдЦрдХ рд╣реИрдВред рдмрд┐рд▓реНрд▓реА рдХреЗ рдиреАрдЪреЗ рдЙрди рд▓реЛрдЧреЛрдВ рд╕реЗ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

Apple рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрдВрдЬреАрдХрд░рдг рдФрд░ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛



рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛рдлреА рдЖрджрд┐рдо рд╣реИ рдФрд░ рдПрдкреНрдкрд▓ рд╕реЗ рдЖрд░реЗрдЦ рдкрд░ рд╕рдВрдХреЗрдд рдХреЗ рд░реВрдк рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рд╣реЛрддрд╛ рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, Apple рдЯреЛрдХрди рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:



рдпреЛрдЬрдирд╛ рднреА рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ, рдЯреЛрдХрди рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

AppleID рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рд▓рд╛рдЧреВ рдХрд░реЗрдВ


AppleID рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо AppleLogin рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдкреИрдХреЗрдЬ рдХреЗ рд▓реЗрдЦрдХ рдиреЗ рдХреБрдЫ рдЧрд▓рддрд┐рдпрд╛рдБ рдХреАрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рдЖрд▓реЛрдЪрдирд╛рддреНрдордХ рдирд╣реАрдВ рд╣реИрдВ (рдФрд░ рдХреБрдЫ рд╕рдВрдпреБрдХреНрдд рд░реВрдк рд╕реЗ рддрдп рдХрд┐рдП рдЧрдП рдереЗ)ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ 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 } 

рдлрд┐рд░ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ:

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

рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдХреМрди рд╕рд╛ рдЕрдиреБрд░реЛрдз Apple рд╕рд░реНрд╡рд░ рдХреЛ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░рд▓реЗрдЦрди рдХрд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╛рдЗрдВрдЯ_рдб, рдХреНрд▓рд╛рдЗрдВрдЯ_рд╕реЗрдХреНрд░реЗрдЯ, рдХреЛрдб, рдЕрдиреБрджрд╛рди_рдкреНрд░рдХрд╛рд░, рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ_рдпреВрд░реА рдлрд╝реАрд▓реНрдб рднреЗрдЬрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЗрди рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореБрдЦреНрдп рдХрдард┐рдирд╛рдИ client_secret рд╣реИ - рдпрд╣ рдбрдмреНрд▓реНрдпреВрдбрдмреНрд▓реНрдпреВрдбреАрдЖрд░ рдкреЛрд░реНрдЯрд▓ рдкрд░ рдЙрддреНрдкрдиреНрди рдПрдХ рдХреБрдВрдЬреА рджреНрд╡рд╛рд░рд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд JWT рд╣реИ:

 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) 

Apple API рдпрд╛ рддреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдЧрд╛ рдпрд╛ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рд▓реМрдЯрд╛рдПрдЧрд╛ред рд╣рдо 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 рдПрдХ JWT рдЯреЛрдХрди рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рд╣реИ:

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

рдпрд╣ рдЗрд╕ рддрдереНрдп рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдИрдореЗрд▓ рдХреЗрд╡рд▓ рдкрд╣рд▓реЗ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк reauthorize рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдХреЗрд╡рд▓ рдПрдХ рдЖрдИрдбреА (рд╕рд╛рдЗрди рдЗрди рдПрдкреНрдкрд▓ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛) рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЗрди рдЖрдВрдХрдбрд╝реЛрдВ рдХреА рдкрд░реНрдпрд╛рдкреНрдд рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

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


All Articles