Проверка подлинности Xamarin.forms PKCE

У меня есть приложение Identity server 4, в которое я пытаюсь войти, используя свое приложение Xamarin.forms с использованием PKCE. Я продолжаю получать сообщение об ошибке от сервера идентификации, которого раньше не видел. code_challenge is missing Я предполагаю, что использую неправильный тип гранта, но во всей документации, которую я нашел для Xamarin, говорится, что я должен использовать этот.

Как подключить Xamarin к Identity Server 4?

Ошибка

fail: IdentityServer4.Validation.AuthorizeRequestValidator[0]
      code_challenge is missing
{
        "ClientId": "xamarin",
        "ClientName": "eShop Xamarin OpenId Client",
        "RedirectUri": "1046123799103-h63f9o1cnj78fo26okng1aacr9e89u2e:/oauth2redirect",
        "AllowedRedirectUris": [
          "http://localhost:5001/signin-oidc"
        ],
        "SubjectId": "anonymous",
        "ResponseType": "code",
        "ResponseMode": "query",
        "GrantType": "authorization_code",
        "RequestedScopes": "",
        "State": "egfczresvcjyeerw",
        "Raw": {
          "client_id": "xamarin",
          "redirect_uri": "1046123799103-h63f9o1cnj78fo26okng1aacr9e89u2e:/oauth2redirect",
          "scope": "profile openid nol_api navinfo",
          "response_type": "code",
          "state": "egfczresvcjyeerw"
        }
      }

Идентификатор клиента на сервере идентификации

new Client
            {
                ClientId = "xamarin",
                ClientName = "eShop Xamarin OpenId Client",
                AllowedGrantTypes = GrantTypes.Code,

                RedirectUris = { "http://localhost:5001/signin-oidc" },
                RequireConsent = false,
                RequirePkce = true,
                PostLogoutRedirectUris = { "http://localhost:8008/Account/Redirecting" },
                AllowedScopes = new List<string>
                {
                    IdentityServerConstants.StandardScopes.OpenId,
                    IdentityServerConstants.StandardScopes.Profile,
                    "navinfo",
                    $"{nolConfig.Client}_api"
                },
                AllowOfflineAccess = true,
                AllowAccessTokensViaBrowser = true,
                RequireClientSecret = false
            }

код xamarin

Authenticator = new OAuth2Authenticator
            (
                _clientId,
                _secret,
                _scopes,
                new Uri(_discoveryDoc.AuthorizationEndpoint),
                _redirectUri,
                new Uri(_discoveryDoc.TokenEndpoint),
                null,
                isUsingNativeUI: true
            );

Если я удаляю RequirePkce = true, из клиента на сервере идентификации, я больше не получаю рассматриваемую ошибку. Судя по тому, что мне удалось найти, Xamarin.auth еще не поддерживает PKCE. Это означает, что мне придется либо отключить его, либо реализовать самостоятельно.

Как выполнить вход на сервер идентификации 4 из форм XAmarin с включенным PKCE.


person DaImTo    schedule 26.09.2019    source источник


Ответы (1)


Похоже, что PKCE включен в OAuth2Authenticator из-за отсутствия секрета клиента:

    protected bool IsProofKeyCodeForExchange
    {
        get
        {
            return
                accessTokenUrl != null                    // AccessToken url is defined
                &&
                string.IsNullOrWhiteSpace(clientSecret)   // Client Secret is not defined
                ;
        }
    }

Так что я бы попробовал

Authenticator = new OAuth2Authenticator
        (
            _clientId,
            null,
            _scopes,
            new Uri(_discoveryDoc.AuthorizationEndpoint),
            _redirectUri,
            new Uri(_discoveryDoc.TokenEndpoint),
            null,
            isUsingNativeUI: true
        );
person Richard    schedule 28.09.2019
comment
Пробовал, все равно получаю то же сообщение об ошибке. Ваше право, похоже, это должно быть поддержано - person DaImTo; 30.09.2019