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

Oracle Apex 24.1.0中通过OpenID Connect SSO后用PLSQL获取ID Token权限

实现方案

在Oracle Apex 24.1中,完全可以通过PL/SQL获取当前登录用户的ID Token并解析其中的权限信息,核心是利用Apex内置的Web凭据和JWT处理API。

步骤1:获取当前会话的ID Token

使用APEX_WEB_CREDENTIALS.GET_ID_TOKEN函数,传入你配置的Web凭据名称,即可获取当前登录用户的ID Token。如果用户未通过该凭据对应的认证方案登录,函数会返回NULL或抛出异常,建议添加异常处理。

DECLARE
    l_id_token VARCHAR2(32767);
    l_credential_name VARCHAR2(100) := '你的Web凭据名称'; -- 替换为实际的凭据名称
BEGIN
    -- 获取当前会话的ID Token
    l_id_token := APEX_WEB_CREDENTIALS.GET_ID_TOKEN(
        p_credential_name => l_credential_name
    );
    
    IF l_id_token IS NULL THEN
        RAISE_APPLICATION_ERROR(-20001, '未获取到ID Token,请确认用户已通过对应认证方案登录');
    END IF;
    
    DBMS_OUTPUT.PUT_LINE('ID Token: ' || l_id_token);
EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('获取ID Token失败: ' || SQLERRM);
END;
/

步骤2:解码ID Token并提取权限

ID Token是JWT格式,使用APEX_JWT.DECODE函数解析令牌,得到包含用户信息的JSON对象,再用APEX_JSON提取权限字段(假设权限字段名为permissions,根据你的实际Token结构替换)。

DECLARE
    l_id_token VARCHAR2(32767);
    l_credential_name VARCHAR2(100) := '你的Web凭据名称';
    l_jwt_payload CLOB;
    l_permissions apex_t_varchar2; -- 存储权限列表
BEGIN
    -- 1. 获取ID Token
    l_id_token := APEX_WEB_CREDENTIALS.GET_ID_TOKEN(
        p_credential_name => l_credential_name
    );
    
    IF l_id_token IS NULL THEN
        RAISE_APPLICATION_ERROR(-20001, '未获取到ID Token');
    END IF;
    
    -- 2. 解码JWT的Payload部分
    l_jwt_payload := APEX_JWT.DECODE(
        p_token => l_id_token,
        p_verify_signature => FALSE -- 如果不需要验证签名(仅解析内容),设为FALSE;若要验证需传入公钥
    );
    
    -- 3. 提取权限字段(假设权限是数组类型,字段名为permissions)
    apex_json.parse(l_jwt_payload);
    l_permissions := apex_json.get_t_varchar2(p_path => 'permissions');
    
    -- 输出权限列表
    DBMS_OUTPUT.PUT_LINE('用户权限:');
    FOR i IN 1..l_permissions.COUNT LOOP
        DBMS_OUTPUT.PUT_LINE('- ' || l_permissions(i));
    END LOOP;
EXCEPTION
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE('处理失败: ' || SQLERRM);
END;
/

注意事项

  • 替换你的Web凭据名称为你在工作区中配置的实际Web凭据名称。
  • 如果需要验证JWT签名的合法性,将p_verify_signature设为TRUE,并通过p_public_key参数传入第三方身份服务器的公钥。
  • 权限字段的路径p_path需要根据你的ID Token实际JSON结构调整,比如如果权限嵌套在claims.permissions下,就写claims.permissions。
  • 确保执行代码的用户拥有APEX_WEB_CREDENTIALS和APEX_JWT包的执行权限。

内容的提问来源于stack exchange,提问作者Sergey Shafiev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 12:06:05