#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. Нашел это! Спасибо