Какой issuer необходимо указать в Docker для проверки токена?

Привет всем! 

Я сталкиваюсь с проблемой при подключении Keycloak к моему .NET приложению. Keycloak работает в контейнере, как и сервис, который выполняет валидацию токена. Когда сервис проверяет issuer, он возвращает следующий ответ: "The issuer '<a href="http://localhost:10001/realms/keycloak-auth" rel="nofollow">localhost:10001/realms/keycloak-auth</a>' is invalid". 

Если же поднять сервис локально, всё работает корректно. 

Вот некоторые детали кода, которые я использую: 

Для проверки аутентификации использую библиотеку Keycloak.AuthServices.Authentication: 
```csharp
builder.Services.AddKeycloakWebApiAuthentication(builder.Configuration);
builder.Services.AddAuthorization();
```

Конфигурация для аутентификации выглядит следующим образом: 
```json
"Keycloak": {
    "Realm": "keycloak-auth",
    "AuthServerUrl": "http://localhost:10001/",
    "SslRequired": "none",
    "Resource": "posts-client",
    "PublicClient": true,
    "ConfidentialPort": 10001,
    "VerifyTokenAudience": false
}
```

И вот как Keycloak поднимается через docker-compose: 
```yaml
keycloak:
    container_name: keycloak
    image: quay.io/keycloak/keycloak:26.0.0
    command: start-dev
    environment:
      - KC_HEALTH_ENABLE=true
      - KEYCLOAK_ADMIN=admin
      - KEYCLOAK_ADMIN_PASSWORD=passwd
      - KC_HTTP_PORT=10001
    volumes:
      - ./.containers/identity:/opt/keycloak/data
    ports:
      - "10001:10001"
```
Подскажите, как можно решить проблему с валидацией issuer в данном случае?
  • 9 октября 2024 г. 19:33
Ответы на вопрос 1
Проблема с валидацией `issuer` в вашей конфигурации, скорее всего, связана с тем, что ваше приложение пытается проверить токен, используя некорректный или неоднозначный URL-адрес для вашего Keycloak сервера. В частности, важно, чтобы значение `issuer` токена совпадало с тем, что ваш сервис ожидает.

### 1. Убедитесь, что `issuer` соотвествует

Ваша конфигурация указывает на `http://localhost:10001/realms/keycloak-auth`, и этот URL должен быть прописан в настройках вашего `Identity` сервера (Keycloak). Обычно, значение `issuer` формируется автоматически, исходя из `AuthServerUrl` и имени `Realm`.

Если ваш сервис работает внутри Docker-контейнера, то `localhost` внутри контейнера с вашим приложением будет указывать на сам контейнер, а не на контейнер с Keycloak. Поэтому для проверки токена из контейнера вам нужно использовать IP-адрес или название сервиса из `docker-compose.yml`.

### 2. Измените `AuthServerUrl`

Попробуйте изменить `AuthServerUrl` в вашей конфигурации с `http://localhost:10001/` на `http://keycloak:10001/` (или просто на `http://keycloak/`, если вы используете стандартный 8080 порт). Это изменит URL сервера аутентификации на имя контейнера, что и будет правильно в вашем случае. Пример конфигурации может выглядеть так:

```json
"Keycloak": {
    "Realm": "keycloak-auth",
    "AuthServerUrl": "http://keycloak:10001/",
    "SslRequired": "none",
    "Resource": "posts-client",
    "PublicClient": true,
    "ConfidentialPort": 10001,
    "VerifyTokenAudience": false
}
```

### 3. Проверка настроек Keycloak

Также убедитесь, что в настройках Keycloak правильный URL и другие параметры для вашего клиента (клиента `posts-client`). В частности, убедитесь, что `Valid Redirect URIs` настроены корректно, чтобы разрешить запросы из вашего приложения.

### 4. Протестируйте настройки

После внесения изменений, протестируйте ваше приложение, чтобы убедиться, что оно может корректно аутентифицироваться и проверять токен.

### 5. Проверка окружения

Если у вас есть возможность, попробуйте использовать инструменты для тестирования (например, Postman) на той же сети, чтобы убедиться, что контейнер с вашим сервисом может достучаться до Keycloak на указанном вами URL.

Следуя этим рекомендациям, вы сможете исправить проблему с валидацией `issuer` и обеспечить корректное взаимодействие вашего сервисного приложения и Keycloak.
Похожие вопросы