首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Keycloak-根据外部OIDC提供程序进行身份验证时,网守不会填充角色或组

Keycloak-根据外部OIDC提供程序进行身份验证时,网守不会填充角色或组
EN

Stack Overflow用户
提问于 2019-04-09 23:01:05
回答 1查看 1.1K关注 0票数 2

我正在尝试将keycloak-gatekeeper设置为docker容器前面的反向代理,以便针对容器提供身份验证和授权。我使用FusionAuth作为OIDC兼容的身份提供者,并设法让keycloak-getekeeper使用它,使用授权流。当我尝试根据用户的角色或组成员身份限制哪些用户可以访问资源时,问题就出现了。

目前,所有请求都被拒绝。当我查看服务器上的日志时,我可以看到以下消息:

代码语言:javascript
复制
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": "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 (通过隐式流),结果如下所示:

代码语言:javascript
复制
{
  "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实例

EN

回答 1

Stack Overflow用户

发布于 2019-04-10 02:51:40

看起来密钥罩网守只能处理密钥罩(https://github.com/keycloak/keycloak-gatekeeper/blob/master/user_context.go)提供的令牌中的领域和客户端角色

下面是从令牌中提取角色的代码:

代码语言:javascript
复制
// @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))
                }
            }
        }
    }

这将解释为什么我的令牌中的声明没有出现

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55595813

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档