带有 Keycloak 的 Flask OIDC 在尝试获取 'openid_id' 和 'role' 字段时返回 None
Flask OIDC with Keycloak returning None when trying to get 'openid_id' and 'role' fields
我正在尝试使用 Flask-ODBC + Keycloak 构建一些测试应用程序。
我成功启动了 Keycloak,创建了一个领域、一个角色和一个分配了该角色的用户。现在我正在尝试从 OpenIDConnect 对象中获取 'role' 和 'openid_id' 字段,但这两个字段正在返回 None.
我的申请代码如下
import json
import flask
from flask import Flask, render_template, g
import flask_login
from flask_login import login_required
from flask_oidc import OpenIDConnect
from model.user import User
app = Flask(__name__)
login_manager = flask_login.LoginManager()
login_manager.init_app(app)
# Our mock database.
users = {'foo@bar.com': {'pw': 'secret'}}
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_VALID_ISSUERS': ['http://localhost:8080/auth/realms/MyDemo'],
'OIDC_OPENID_REALM': 'http://localhost:5000/oidc_callback'
})
oidc = OpenIDConnect(app)
@app.route('/')
def hello_world():
if oidc.user_loggedin:
return ('Hello, %s, <a href="/private">See private</a> '
'<a href="/logout">Log out</a>') % \
oidc.user_getfield('email')
else:
return 'Welcome anonymous, <a href="/private">Log in</a>'
@app.route('/private')
@oidc.require_login
def hello_me():
info = oidc.user_getinfo(['email', 'openid_id', 'role'])
print(info)
return ('Hello, %s (%s)! <a href="/">Return</a>' %
(info.get('email'), info.get('openid_id')))
@app.route('/api')
@oidc.accept_token(True, ['openid'])
def hello_api():
return json.dumps({'hello': 'Welcome %s' % g.oidc_token_info['sub']})
@app.route('/logout')
def logout():
oidc.logout()
return 'Hi, you have been logged out! <a href="/">Return</a>'
if __name__ == '__main__':
app.run('localhost', port=5000)
在 hello_me() 中,我尝试获取 'openid_id' 和 'role' 并打印出来。问题是我在这些字段中得到 None。我可以正确收到邮件。
你能帮我找出我犯的错误吗?
https://flask-oidc.readthedocs.io/en/latest/
user_getinfo(fields, access_token=None)
Returns: The values of the current user for the fields requested. The keys are the field names, values are the values of the fields as indicated by the OpenID Provider. Note that fields that were not provided by the Provider are absent.
您的提供商 (Keycloak) 显然没有在令牌中公开 openid_id
详细信息,因此缺少该字段。很可能您没有在 Keycloak 中正确配置 OIDC 客户端。确保您已将正确的 mappers/scopes 添加到 Keycloak 中使用的 OIDC 客户端,这会将请求的详细信息公开到 openid_id
声明中。
我正在尝试使用 Flask-ODBC + Keycloak 构建一些测试应用程序。
我成功启动了 Keycloak,创建了一个领域、一个角色和一个分配了该角色的用户。现在我正在尝试从 OpenIDConnect 对象中获取 'role' 和 'openid_id' 字段,但这两个字段正在返回 None.
我的申请代码如下
import json
import flask
from flask import Flask, render_template, g
import flask_login
from flask_login import login_required
from flask_oidc import OpenIDConnect
from model.user import User
app = Flask(__name__)
login_manager = flask_login.LoginManager()
login_manager.init_app(app)
# Our mock database.
users = {'foo@bar.com': {'pw': 'secret'}}
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_VALID_ISSUERS': ['http://localhost:8080/auth/realms/MyDemo'],
'OIDC_OPENID_REALM': 'http://localhost:5000/oidc_callback'
})
oidc = OpenIDConnect(app)
@app.route('/')
def hello_world():
if oidc.user_loggedin:
return ('Hello, %s, <a href="/private">See private</a> '
'<a href="/logout">Log out</a>') % \
oidc.user_getfield('email')
else:
return 'Welcome anonymous, <a href="/private">Log in</a>'
@app.route('/private')
@oidc.require_login
def hello_me():
info = oidc.user_getinfo(['email', 'openid_id', 'role'])
print(info)
return ('Hello, %s (%s)! <a href="/">Return</a>' %
(info.get('email'), info.get('openid_id')))
@app.route('/api')
@oidc.accept_token(True, ['openid'])
def hello_api():
return json.dumps({'hello': 'Welcome %s' % g.oidc_token_info['sub']})
@app.route('/logout')
def logout():
oidc.logout()
return 'Hi, you have been logged out! <a href="/">Return</a>'
if __name__ == '__main__':
app.run('localhost', port=5000)
在 hello_me() 中,我尝试获取 'openid_id' 和 'role' 并打印出来。问题是我在这些字段中得到 None。我可以正确收到邮件。
你能帮我找出我犯的错误吗?
https://flask-oidc.readthedocs.io/en/latest/
user_getinfo(fields, access_token=None)
Returns: The values of the current user for the fields requested. The keys are the field names, values are the values of the fields as indicated by the OpenID Provider. Note that fields that were not provided by the Provider are absent.
您的提供商 (Keycloak) 显然没有在令牌中公开 openid_id
详细信息,因此缺少该字段。很可能您没有在 Keycloak 中正确配置 OIDC 客户端。确保您已将正确的 mappers/scopes 添加到 Keycloak 中使用的 OIDC 客户端,这会将请求的详细信息公开到 openid_id
声明中。