#openid-connect #keycloak-gatekeeper #fusionauth
#OpenID-connect #keycloak-gatekeeper #fusionauth
Вопрос:
Я пытаюсь настроить keycloak-gatekeeper в качестве обратного прокси-сервера перед контейнером docker, чтобы обеспечить аутентификацию и авторизацию в контейнере. Я использую FusionAuth в качестве поставщика удостоверений, совместимого с OIDC, и мне удалось заставить keycloak-getekeeper использовать это, используя поток авторизации. Проблема возникает, когда я пытаюсь ограничить доступ пользователей к ресурсу на основе их роли или членства в группе.
В настоящее время все запросы отклонены. Когда я просматриваю журналы на сервере, я вижу следующие сообщения:
1.5548202388823931e 09 info keycloak-gatekeeper/middleware.go:90 client request {"latency": 0.039427852, "status": 403, "bytes": 0, "client_ip": "127.0.0.1:40866", "method": "GET", "path": "/"}
1.5548202614442139e 09 error keycloak-gatekeeper/middleware.go:108 no session found in request, redirecting for authorization {"error": "authentication session not found"}
1.5548202614443152e 09 info keycloak-gatekeeper/middleware.go:90 client request {"latency": 0.000108426, "status": 307, "bytes": 95, "client_ip": "127.0.0.1:40866", "method": "GET", "path": "/"}
1.5548202614823494e 09 debug keycloak-gatekeeper/handlers.go:88 incoming authorization request from client address {"access_type": "", "auth_url": "https://identity.***********.io/oauth2/authorize?client_id=********amp;redirect_uri=https://********.io/oauth/callbackamp;response_type=codeamp;scope=openid email profileamp;state=********", "client_ip": "127.0.0.1:40866"}
1.554820261482426e 09 info keycloak-gatekeeper/middleware.go:90 client request {"latency": 0.000132558, "status": 307, "bytes": 298, "client_ip": "127.0.0.1:40866", "method": "GET", "path": "/oauth/authorize"}
1.5548203051960323e 09 info keycloak-gatekeeper/handlers.go:167 issuing access token for user {"email": "someuser@domain.com", "expires": "2019-04-09T15:31:45Z", "duration": "59m59.803970144s"}
1.5548203051961453e 09 info keycloak-gatekeeper/middleware.go:90 client request {"latency": 0.099124835, "status": 307, "bytes": 37, "client_ip": "127.0.0.1:40866", "method": "GET", "path": "/oauth/callback"}
1.5548203052413428e 09 debug keycloak-gatekeeper/session.go:51 found the user identity {"id": "5f165d68-9350-47e6-9152-d76260cabd7c", "name": "someuser@domain.com", "email": "someuser@domain.com", "roles": "", "groups": ""}
1.5548203052417035e 09 warn keycloak-gatekeeper/middleware.go:307 access denied, invalid roles {"access": "denied", "email": "someuser@domain.com", "resource": "/*", "roles": "role-1,role-3"}
1.5548203052417736e 09 info keycloak-gatekeeper/middleware.go:90 client request {"latency": 0.000509757, "status": 403, "bytes": 0, "client_ip": "127.0.0.1:40866", "method": "GET", "path": "/"}
Насколько я могу видеть, причина моих отказов заключается в том, что роли не заполнены.
Я также запустил клиент для получения JWT (через неявный поток) для пользователя, который возвращается примерно с таким видом:
{
"aud": "************************",
"exp": 1554822076,
"iat": 1554818476,
"iss": "https://identity.*******.io",
"sub": "****************",
"authenticationType": "PASSWORD",
"email": "someuser@domain.com",
"email_verified": true,
"applicationId": "*****************",
"roles": [
"role-1",
"role-3"
]
}
Из этого я вижу, что пользователь находится в правильных ролях.
На данный момент я немного не понимаю, в чем проблема, или как более подробно отладить экземпляр keycloak-gatekeeper
Комментарии:
1. Я не очень хорошо знаком с
keycloak-gatekeeper
, но посколькуroles
утверждение не является хорошо известным утверждением OIDC, они, скорее всего, не будут сопоставлены автоматически. В Keycloak это делается с помощью mapper в конфигурации клиента. Я думаю, вам нужно будет указать,keycloak-gatekeeper
какое утверждение содержит роли, в данном случае это будетroles
.
Ответ №1:
Похоже, что keycloak-gatekeeper способен обрабатывать роли области и клиента только в токенах, предоставляемых keycloak (https://github.com/keycloak/keycloak-gatekeeper/blob/master/user_context.go )
Вот рассматриваемый код, который извлекает роли из токена:
// @step: extract the realm roles
var roleList []string
if realmRoles, found := claims[claimRealmAccess].(map[string]interface{}); found {
if roles, found := realmRoles[claimResourceRoles]; found {
for _, r := range roles.([]interface{}) {
roleList = append(roleList, fmt.Sprintf("%s", r))
}
}
}
// @step: extract the client roles from the access token
if accesses, found := claims[claimResourceAccess].(map[string]interface{}); found {
for name, list := range accesses {
scopes := list.(map[string]interface{})
if roles, found := scopes[claimResourceRoles]; found {
for _, r := range roles.([]interface{}) {
roleList = append(roleList, fmt.Sprintf("%s:%s", name, r))
}
}
}
}
Это объясняет, почему утверждения в моем токене не отображаются