Ошибка проверки секрета клиента для клиента, недопустимый секрет клиента в потоке кода авторизации

Я использую клиентский JS OIDC в ​​Identity server 4 с реакцией, продолжая получать ошибку

Client secret validation failed for client, Invalid client secret

о потоке кода авторизации,

Настройка OIDC

private getClientSettings(): any {
    return {
      authority: "https://localhost:5001",
      client_id: "Local",
      redirect_uri: "https://localhost:5001/auth-callback",
      post_logout_redirect_uri: "https://localhost:5001",
      response_type: "code",
      scope: "profile openid email IdentityPortal.API offline_access",
      //filterProtocolClaims: environment.openID.filterProtocolClaims,
      loadUserInfo: true,
      monitorSession: true,
      silent_redirect_uri: "https://localhost:5001/silent-reniew.html",
      accessTokenExpiringNotificationTime: 20, //default 60
      checkSessionInterval: 5000, //default 2000
      silentRequestTimeout: 2000,
    };
  }

Конфигурация Identity Server 4

public static IEnumerable<Client> GetClients()
        {
            // client credentials client
            return new List<Client>
            {
                new Client
                {
                    ClientId = "Local",
                    //ClientName = "Local",
                    AllowedCorsOrigins = new List<string> { "http://localhost:4200","https://localhost:4200" },
                    AllowedGrantTypes = GrantTypes.Code,
                    AllowAccessTokensViaBrowser = true,
                    AccessTokenLifetime=86400,
                    RequireConsent = false,
                    UpdateAccessTokenClaimsOnRefresh = true,
                    RedirectUris = LocalRedirectUris(),
                    PostLogoutRedirectUris = LocalRedirectUris(),
                    AllowedScopes = AllowedScopes(),
                    AllowOfflineAccess = true,
                }
            };
        }

Вход с сервера идентификации

info: IdentityServer4.Hosting.IdentityServerMiddleware[0]
      Invoking IdentityServer endpoint: IdentityServer4.Endpoints.DiscoveryEndpoint for /.well-known/openid-configuration
info: IdentityServer4.Hosting.IdentityServerMiddleware[0]
      Invoking IdentityServer endpoint: IdentityServer4.Endpoints.TokenEndpoint for /connect/token
info: IdentityServer4.Events.DefaultEventService[0]
      {
        "Name": "Client Authentication Failure",
        "Category": "Authentication",
        "EventType": "Failure",
        "Id": 1011,
        "ClientId": "Local",
        "Message": "Invalid client secret",
        "ActivityId": "0HLVQDNPJELVT:00000015",
        "TimeStamp": "2020-05-17T14:26:15Z",
        "ProcessId": 11600,
        "LocalIpAddress": "::1:5001",
        "RemoteIpAddress": "::1"
      }
fail: IdentityServer4.Validation.ClientSecretValidator[0]
      Client secret validation failed for client: Local.

Получение неверного запроса 400 на https://localhost:5001/connect/token

Content-Type: application/x-www-form-urlencoded

ФОРМА-ДАННЫЕ

client_id: Local
code: Pu5XVqWcaOavZYWOJqy07gHU7WYJ3aCQ_NBkpzszLnA
redirect_uri: https%3A%2F%2Flocalhost%3A5001%2Fauth-callback
code_verifier: 7985598b08fe49c49c37e3ef9e909295aeacc16b1b904e8990d7438cc60edb377bd31ee6d466489bbde9c75170470048
grant_type: authorization_code

person San Jaisy    schedule 17.05.2020    source источник


Ответы (1)


Вы просто не используете Client Secrets для одностраничных приложений (SPA) на основе JavaScript, таких как React. Это связано с тем, что этим приложениям на основе браузера нельзя доверять надежное хранение секретов. Рекомендуемый способ для SPA - это поток кода авторизации с PKCE (не неявный). Вам следует изучить возможность реализации этого.

Изменить: для этого вам необходимо установить RequireClientSecret = false и RequirePkce = true в настройках вашего клиента.

person LalitaCode    schedule 17.05.2020
comment
Я удаляю секреты, но все та же проблема. Я использую неправильный тип гранта AllowedGrantTypes = GrantTypes.Code, - person San Jaisy; 18.05.2020
comment
@SanJaisy Вам также необходимо установить RequireClientSecret как false в настройках вашего клиента. В любом случае вы должны искать реализацию PKCE. - person LalitaCode; 18.05.2020
comment
спасибо, если работаешь для меня. Мне пришлось добавить RequireClientSecret = false и RequirePkce = true - person San Jaisy; 18.05.2020
comment
@LalitaCode спасибо за ответ. У меня возникла точно такая же проблема, потому что я пропустил RequireClientSecret. Увидел это в вашем комментарии, и проблема была решена. Может быть, подумайте о том, чтобы перенести эту информацию в свой ответ? - person Andy N; 28.08.2020
comment
@AndyN Спасибо за внимание. Я отредактировал свой ответ. - person LalitaCode; 28.08.2020
comment
@LalitaCode Спасибо! +1 - person Andy N; 28.08.2020
comment
Я немного запутался. поток кода аутентификации: вызов / authorize, предоставление материала, получение кода, отправленного на предварительно зарегистрированный URL-адрес, вызов / token для обмена на доступ и обновление токенов. Но когда я пытаюсь перейти в поток PKCE и вызвать / authorize с помощью Postman, я получаю, что challenge_code отсутствует. Ну да! Сначала мне нужно получить его, и я предполагаю, что делаю это так же, как с обменом кода на токены. Или как мне получить первый код вызова? Я что-то упускаю ... - person Konrad Viltersten; 20.07.2021