Keycloak-Gatekeeper не попълва роли или групи при удостоверяване срещу външен доставчик на OIDC

Опитвам се да настроя keycloak-gatekeeper като обратен прокси пред докер контейнер, за да осигуря удостоверяване и оторизация срещу контейнера. Използвам 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=********&redirect_uri=https%3A%2F%2F********.io%2Foauth%2Fcallback&response_type=code&scope=openid+email+profile&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": "[email protected]", "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": "[email protected]", "email": "[email protected]", "roles": "", "groups": ""}
1.5548203052417035e+09  warn    keycloak-gatekeeper/middleware.go:307   access denied, invalid roles    {"access": "denied", "email": "[email protected]", "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": "[email protected]",
  "email_verified": true,
  "applicationId": "*****************",
  "roles": [
    "role-1",
    "role-3"
  ]
}

От това виждам, че потребителят е в правилните роли.

В момента съм малко на загуба относно това къде се крие проблемът или как да отстранявам грешки в екземпляра keycloak-gatekeeper по-подробно


person whiskerc    schedule 09.04.2019    source източник
comment
Не съм много запознат с keycloak-gatekeeper, но тъй като претенцията roles не е добре известна OIDC претенция, те вероятно няма да бъдат картографирани автоматично. В Keycloak това се прави с помощта на картограф в конфигурацията на клиента. Мисля, че ще трябва да кажете на keycloak-gatekeeper коя претенция съдържа ролите, в този случай това ще бъде roles.   -  person robotdan    schedule 09.04.2019


Отговори (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))
                }
            }
        }
    }

Това би обяснило защо претенциите в моя знак не се появяват

person whiskerc    schedule 09.04.2019