Oracle APEX集成Azure OAuth2:无法获取given_name及组信息求助
解决Oracle APEX中Azure OAuth2无法获取用户属性及组信息的方案
一、获取given_name、family_name等核心用户属性
1. 确认Azure AD应用权限配置
- 在Azure AD应用的「API权限」中,确保已添加Microsoft Graph > 委托权限的
User.Read、profile、email、openid,并且已点击「授予管理员同意」(企业租户必须手动操作,个人租户可能自动同意)。部分用户属性的返回依赖管理员授权的权限,缺省同意会导致字段不返回。 - 检查权限状态,确保所有所需权限均显示「已授予」。
2. 调整Oracle APEX OAuth2属性映射
- 先验证
/userinfo端点的返回:用jwt.ms解析access token,或直接用Postman调用https://graph.microsoft.com/oidc/userinfo(携带access token),确认返回JSON中是否包含given_name、family_name等字段。- 如果Postman返回中无目标字段,回到Azure AD检查用户属性是否被隐藏,或权限是否生效;
- 如果Postman返回有目标字段,在APEX认证方案的「用户属性」设置中,手动添加映射关系:
given_name→given_namefamily_name→family_namepreferred_username→preferred_username
这些映射会将字段存入APEX会话属性,后续可通过:APP_USER_GIVEN_NAME等变量调用。
- 保持APEX认证方案的「用户名属性」为
email或preferred_username(确保唯一性),避免因切换到given_name触发ACL错误(APEX ACL默认基于唯一用户名匹配)。
3. 排查access token声明
- 用jwt.ms解析access token,查看其中的
claims:- 若token内无
given_name等字段,说明Azure未返回,需重新检查应用权限和用户属性可见性; - 若token内有对应字段但APEX未获取,需重新配置认证方案的用户属性映射。
- 若token内无
二、获取用户组/角色信息
1. 添加Azure AD组权限
- 在Azure AD应用的「API权限」中,添加Microsoft Graph > 委托权限:
- 获取用户所属组:
GroupMember.Read.All - 获取Azure AD角色:
DirectoryRoleMember.Read.All - 更广泛的目录权限(若需全量信息):
Directory.Read.All
同样需点击「授予管理员同意」生效。
- 获取用户所属组:
2. 在APEX中调用Graph API获取组数据
/userinfo端点不返回组信息,需在认证成功后主动调用Graph API:
- 在APEX认证方案的「后认证流程」中,添加PL/SQL逻辑调用接口:
DECLARE l_response CLOB; l_access_token VARCHAR2(4000) := apex_authentication.get_session_attribute('ACCESS_TOKEN'); BEGIN -- 设置请求头 apex_web_service.g_request_headers(1).name := 'Authorization'; apex_web_service.g_request_headers(1).value := 'Bearer ' || l_access_token; -- 调用Graph API获取用户所属组/角色 l_response := apex_web_service.make_rest_request( p_url => 'https://graph.microsoft.com/v1.0/me/memberOf', p_http_method => 'GET' ); -- 将结果存入会话属性,供后续业务使用 apex_authentication.set_session_attribute('USER_GROUPS', l_response); END;
- 解析返回的JSON数据,提取组的
displayName或id,用于ACL控制或页面展示。
3. 修复ACL错误问题
之前切换用户名属性到given_name触发的ACL错误,是因为APEX ACL默认基于唯一用户名匹配用户记录。解决方式:
- 保持用户名属性为
email或preferred_username,通过会话属性存储given_name等信息,页面展示直接调用会话属性即可; - 若必须用
given_name作为用户名,需确保APEX用户表中存在对应记录,且ACL规则已更新为基于given_name的权限控制。
内容的提问来源于stack exchange,提问作者Jasgard
相关产品推荐
相关产品推荐

