Этот вопрос, кроме того, относится к 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();
}