Не удается получить доступ к resource_access.client-test.roles с помощью Flask-OIDC и Keycloak

#flask #keycloak #openid-connect

#flask #keycloak #OpenID-connect

Вопрос:

Я настроил Keycloak для аутентификации пользователей моего клиента и возврата его роли в мое приложение. Следующий JSON — это данные, которые Keycloak возвращает с OIDC для моего пользователя. В данных мы можем четко видеть, что поле resource_access.test-client.roles присутствует.

 {
  ....some data..
  "allowed-origins": [
    "http://localhost:5000"
  ],
  "realm_access": {
    "roles": [
      "offline_access",
      "uma_authorization"
    ]
  },
  "resource_access": {
    "test-client": {
      "roles": [
        "DemoRole"
      ]
    },
    "account": {
      "roles": [
        "manage-account",
        "manage-account-links",
        "view-profile"
      ]
    }
  },
  ....some data..
}
  

На стороне моего приложения я использовал Flask-OIDC для аутентификации и получения моей роли пользователя.

Конфигурация приложения была выполнена таким образом

 app.config.update({
    'SECRET_KEY': 'ux91xcfxfax0cxb9x95xe3txba2Kx7fxfdxcaxa3x9fx90x88xb8xeexa4xd6xe4',
    'TESTING': True,
    'DEBUG': True,
    'OIDC_CLIENT_SECRETS': 'client_secrets.json',
    'OIDC_ID_TOKEN_COOKIE_SECURE': False,
    'OIDC_REQUIRE_VERIFIED_EMAIL': False,
    'OIDC_USER_INFO_ENABLED': True,
    'OIDC_SCOPES': ['openid', 'email', 'profile', 'roles'],
    'OIDC_VALID_ISSUERS': ['http://localhost:8080/auth/realms/MyDemo'],
    'OIDC_OPENID_REALM': 'http://localhost:5000/oidc_callback'
})
  

client_secrets.json является

 {
    "web": {
        "auth_uri": "http://localhost:8080/auth/realms/MyDemo/protocol/openid-connect/auth",
        "client_id": "test-client",
        "client_secret": "40074399-b1b6-442c-9862-68b655ef8dad",
        "redirect_uris": [
            "http://localhost:5000/oidc_callback"
        ],
        "userinfo_uri": "http://localhost:8080/auth/realms/MyDemo/protocol/openid-connect/userinfo",
        "token_uri": "http://localhost:8080/auth/realms/MyDemo/protocol/openid-connect/token",
        "token_introspection_uri": "http://localhost:8080/auth/realms/MyDemo/protocol/openid-connect/token/introspect"
    }
}
  

После этого я пытаюсь получить роль от моего пользователя в следующей конечной точке

 @app.route('/private')
@oidc.require_login
def hello_me():
    info = oidc.user_getinfo(['resource_access'])
    client = info['test-client']
    role = client['roles']
  

Проблема в том, что ‘info’ возвращается пустым. Я могу получить доступ к полям ’email’, ‘фамилия’ и другим, но я не могу получить доступ к ‘resource_access’, даже если он присутствует в возвращенном JSON. Я ожидал, что последовательность кода выше может вернуть мне роли пользователей.

Что я делаю не так?

Ответ №1:

Утверждение resource_access может быть представлено в access token и / или id token и / или userinfo response . Из описания вашей проблемы неясно, где именно она раскрывается. По-видимому, он находится не в том месте, а не там, где этого ожидает код вашего приложения.

Итак, исправьте местоположение утверждения, и все должно быть в порядке:

  • отложенный вариант: выставлять его везде ( access token и id token и userinfo response )
  • правильный вариант: прочитайте документацию используемой библиотеки и предоставьте заявку только в нужное место ( access token или id token или userinfo response )

Комментарии:

1. Привет, Ян! Спасибо за ответ. Я работаю над пониманием документации, но мне пока не ясно. Как я могу правильно отобразить resource_access в userinfo? Это должно быть сделано в Keycloak? У вас есть ссылка на то, как это сделать?

2. У Mapper есть конфигурация, в которой нужно раскрывать детали.

3. Нашел это! Спасибо