You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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_name
      • family_name → family_name
      • preferred_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未获取,需重新配置认证方案的用户属性映射。

二、获取用户组/角色信息

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 20:26:08