无法使用Flask OIDC和KeyClope访问资源\u access.client-test.roles

无法使用Flask OIDC和KeyClope访问资源\u access.client-test.roles,flask,keycloak,openid-connect,Flask,Keycloak,Openid Connect,我配置了keydove来验证客户端的用户,并将其角色返回到我的应用程序。下面的JSON是KeyClope为我的用户返回的OIDC数据。在数据中,我们可以清楚地看到存在字段资源_access.test-client.roles { ....some data.. "allowed-origins": [ "http://localhost:5000" ], "realm_access": { "r

我配置了keydove来验证客户端的用户,并将其角色返回到我的应用程序。下面的JSON是KeyClope为我的用户返回的OIDC数据。在数据中,我们可以清楚地看到存在字段资源_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': 'u\x91\xcf\xfa\x0c\xb9\x95\xe3t\xba2K\x7f\xfd\xca\xa3\x9f\x90\x88\xb8\xee\xa4\xd6\xe4',
    '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'
})
客户端_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\u access”,即使它存在于返回的JSON中。我希望上面的代码序列可以返回用户角色


我做错了什么?

声明
资源访问权
可以在
访问令牌
和/或
id令牌
和/或
用户信息响应
中公开。从您的问题描述中不清楚问题的确切位置。显然,它位于错误的位置,而不是应用程序代码所期望的位置

因此,确定索赔的位置,您就可以:

  • 惰性选项:在任何地方公开它(
    access-token
    id-token
    userinfo-response
  • 正确的选择:阅读已用库的文档,并仅将声明公开到正确的位置(
    access token
    id token
    userinfo response

  • 嗨,简!谢谢你的回答。我正在努力理解文档,但还不清楚。如何在userinfo中正确公开资源访问?应该用钥匙斗篷吗?你有关于如何做的参考吗?Mapper有公开细节的配置。找到了!谢谢