Получить токен доступа для входа в систему Apple с таргетингом iOS 13 и выше - PullRequest
0 голосов
/ 21 апреля 2020

Этот вопрос, кроме того, относится к Apple Sign In с iOS 13 и выше, а также к access_token и refresh_token в конце авторизации.

Я разрабатываю функцию Sign in with Apple в Xamarin. Формы. Я получил образец кода от здесь .

Для iOS 13:

  • Я использовал ASAuthorizationAppleIdButton, ASAuthorizationAppleIdProvider, ASAuthorizationAppleIdCredential et c, чтобы получить id_token и код авторизации.
  • Когда проверить токен, как упомянуто для здесь , используя мою поддержку API, apple выбрасывает 400 invalid_request (использует более одного механизма для аутентификации клиента) Я просто хотел знать, как получить access_token, refresh_token на 2-м шаге для iOS 13 и выше.

Для не iOS 13 (ниже iOS 13 и Android)

  • Мы реализовали авторизацию и проверку конечных точек токена на стороне Api с обратным вызовом URL
  • Я вызываю свою конечную точку API в браузере, который в конечном итоге вызывает конечную точку apple authorize , как только пользователь завершает процесс, Apple перезванивает URL перенаправления и там мы обмениваемся токеном или проверяем токен с использованием полученного кода авторизации и состояния. На этом этапе я получаю access_token и refresh_token, как указано здесь .

Я просто хотел узнать, как получить access_token и refresh_token для iOS 13, как мы можем это сделать для не iOS 13 платформ. Действительно ли нужно получить access_token, refresh_token?

Заранее благодарим.

Обновление:

Вызов API аутентификации сервера: https://github.com/Redth/Xamarin.AppleSignIn.Sample/blob/master/AppleSignInAzureFunction/AppleSignInAuth.cs

Функция обратного вызова сервера: https://github.com/Redth/Xamarin.AppleSignIn.Sample/blob/master/AppleSignInAzureFunction/AppleSignInCallback.cs

Реализация API сервера: https://github.com/Redth/Xamarin.AppleSignIn.Sample/blob/master/Xamarin.AppleSignIn/AppleSignInClient.cs

Фрагмент кода:

public virtual Uri GenerateAuthorizationUrl()
{
   var respType = "code";

   var p = new Dictionary<string, string>
   {
       { "response_type", respType },
       { "response_mode", "form_post" },
       { "client_id", ServerId },
       { "redirect_uri", RedirectUri.OriginalString },
       { "nonce", Nonce },
       { "state", State },
       { "scope", "name email" }
   };
}

public async Task<AppleAccount> ExchangeTokenAsync(string code)
{
   var secret = GenerateClientSecretJWT(P8FileContents);

   var resp = await client.PostAsync(AppleTokenUrl, new FormUrlEncodedContent(new Dictionary<string, string>
   {
       { "grant_type", "authorization_code" },
       { "code", code },
       { "redirect_uri", RedirectUri.OriginalString },
       { "client_id", ServerId },
       { "client_secret", secret },
   }));

   resp.EnsureSuccessStatusCode();
}
...